AWS at Rowem
![]() |
---|
AWS Architecture |
-
What I learned about AWS (EC2, VPC, ElastiCache) while I worked at Rowem. Inc.
-
์ธํ๋ผ OverView
- ๊ฐ์ VPC ๋ด์, ํผ๋ธ๋ฆญ/ํ๋ผ์ด๋น Subnet์ผ๋ก ๊ตฌ๋ถ
- ์บ์ ํด๋ฌ์คํฐ ๋ฏธ์์ฑ ์ํ. ๋ณด์๊ทธ๋ฃน์ ์์ฑ๋์ด ์์(์ธ๋ฐ์ด๋ 6379)
- ํด๋ฌ์คํฐ ์์ฑ ์ VPC, Subnet๊ทธ๋ฃน ์ ํ
- VPC: EC2์ ๊ฐ์ VPC ์ ํ
- Subnet๊ทธ๋ฃน: ํ๋ผ์ด๋น Subnet ์ ํ
- ์ธํ๋ผ ๊ตฌ์ถ ํ ์คํธ
VPC
- CIDR 10.0.0.0/16
- e.g. 10.0.0.0 ~ 10.0.255.255
- VPC ์์ฑ ํ ์๋์์ฑ : RT, NACL, SG
Subnet
-
ํผ๋ธ๋ฆญ
- Subnet : CIDR 10.0.0.0/24 (ํ์ฌ๋ VPC ๋ด ๋ก์ปฌ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ-private)
- ์์ > ์๋ ํ ๋น IP ์ค์ ์์ ์ ๋ณด > ํผ๋ธ๋ฆญ IPv4 ์ฃผ์ ์๋ ํ ๋น ํ์ฑํ
- Subnet : CIDR 10.0.0.0/24 (ํ์ฌ๋ VPC ๋ด ๋ก์ปฌ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ-private)
-
ํ๋ผ์ด๋น
- Subnet : CIDR 10.0.1.0/24
Internet Gateway
- ์์ฑ ํ VPC์ ์ฐ๊ฒฐ (Attach)
aws ec2 attach-internet-gateway --vpc-id "vpc-0e02ef59133d3b5a7" --internet-gateway-id "igw-0a871cc54507807f4" --region ap-northeast-2
Route Table
-
ํผ๋ธ๋ฆญ rt ์์ฑ ํ
- ์์ > 'Subnet์ฐ๊ฒฐ' > ํผํ๋ฆญ Subnet ์ฐ๊ฒฐ
- '๋ผ์ฐํ
' > ํธ์ง > ์ถ๊ฐ '0.0.0.0/0','igw-071ed7e5e7b2b8385'
- ๋ํดํธ 10.0.0.0/16 ๋ฒ์ ์ด์ธ ip ์์ฒญ์ igw๋ก ์ฐ๊ฒฐ
-
ํ๋ผ์ด๋น rt (VPC ์์ฑ์ ๋ํดํธ ์์ฑ ๋จ)
- 'Subnet์ฐ๊ฒฐ' > ํ๋ผ์ด๋น Subnet ์ฐ๊ฒฐ (๋ช
์์ฐ๊ฒฐ ํ์ X)
- ๋ช ์์ ์ฐ๊ฒฐ์ด ์๋ Subnet: ๋ค์ Subnet์ ์ด๋ค ๋ผ์ฐํ ํ ์ด๋ธ๊ณผ๋ ๋ช ์์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ง ์๊ณ ๊ธฐ๋ณธ ๋ผ์ฐํ ํ ์ด๋ธ์ ์ฐ๊ฒฐ๋์ด ์๋ ์ํ
- 'Subnet์ฐ๊ฒฐ' > ํ๋ผ์ด๋น Subnet ์ฐ๊ฒฐ (๋ช
์์ฐ๊ฒฐ ํ์ X)
NACL
์ธ์คํด์ค ๋ณด์ ์ค์ ๋ฐฉ๋ฒ - NACL - stateless - Security Group - stateful - ํ๋ผ์ด๋น nacl (VPC ์์ฑ์ ๋ํดํธ ์์ฑ ๋จ) > Subnet ์ฐ๊ฒฐ - ํผ๋ธ๋ฆญ nacl > Subnet ์ฐ๊ฒฐ - ์ธ๋ฐ์ด๋ 22๋ฒํฌํธ๋ Allow - ๊ท์น ๋ฎ์์ ์ฐ์ ์์, ๋ง์ฝ 99๊ท์น 22๋ฒํฌํธ Deny์ด๋ฉด Deny
๊ท์น ๋ฒํธ | ์ ํ | ํ๋กํ ์ฝ | ํฌํธ ๋ฒ์ | ์์ค | ํ์ฉ/๊ฑฐ๋ถ |
---|---|---|---|---|---|
100 | SSH(22) | TCP(6) | 22 | 0.0.0.0/0 | Allow |
101 | SSH(22) | TCP(6) | 22 | 0.0.0.0/0 | Deny |
200 | HTTP(80) | TCP(6) | 80 | 0.0.0.0/0 | Allow |
300 | HTTPS(443) | TCP(6) | 443 | 0.0.0.0/0 | Allow |
* | ๋ชจ๋ ํธ๋ํฝ | ๋ชจ๋ | ๋ชจ๋ | 0.0.0.0/0 | Deny |
- ์ธ๋ฐ์ด๋ 22๋ง Allow ํ๋ ์ผ์ด์ค
๊ท์น ๋ฒํธ | ์ ํ | ํ๋กํ ์ฝ | ํฌํธ ๋ฒ์ | ์์ค | ํ์ฉ/๊ฑฐ๋ถ |
---|---|---|---|---|---|
100 | SSH(22) | TCP(6) | 22 | 0.0.0.0/0 | Allow |
101 | ๋ชจ๋ TCP | TCP(6) | ๋ชจ๋(0-65535) | 0.0.0.0/0 | Deny |
200 | HTTP(80) | TCP(6) | 80 | 0.0.0.0/0 | Allow |
300 | HTTPS(443) | TCP(6) | 443 | 0.0.0.0/0 | Allow |
* | ๋ชจ๋ ํธ๋ํฝ | ๋ชจ๋ | ๋ชจ๋ | 0.0.0.0/0 | Deny |
- ์์๋ฐ์ด๋ 1024-65535 Allow
EC2
๋ฐ์คํฐ์จ EC2์ธ์คํด์ค ์์ฑ - ํผ๋ธ๋ฆญ Subnet ์ง์
- ๋จ๊ณ 3: ์ธ์คํด์ค ์ธ๋ถ์ ๋ณด ๊ตฌ์ฑ
- ๊ณ ๊ธ์ธ๋ถ์ ๋ณด > ์ฌ์ฉ์๋ฐ์ดํฐ
#!/bin/bash
yum install httpd -y
service httpd start
Security Group
๊ฐ์ VPC๋ด Security Group ๊ตฌ๋ถ
-
sg-bastion
- ์ธ๋ฐ์ด๋: SSH ์คํผ์คip:22
-
sg-starpass-was
- ์ธ๋ฐ์ด๋: sg-bastion (SSH 22, TCP 8080)
-
sg-starpass-redis
- ์ธ๋ฐ์ด๋: sg-was/web/bastion (TCP 7379)
NAT Gateway
- ํ๋ผ์ด๋น EC2์์ ์ธ๋ถ ์ธํฐ๋ท ๋งํ์์ด์, yum์ผ๋ก ์ํํธ์จ์ด (mysql, apache,...) ์ค์น ์๋จ
- (VPC) NAT Gateway ๋ง๋ค์ด ์ธ๋ถ์ ์ฐ๊ฒฐ: ํผ๋ธ๋ฆญ Subnet ๋ด์ ์์ฑ
- ํ๋ผ์ด๋น RT์์ : ๋ผ์ฐํ > ์ถ๊ฐ 0.0.0.0/0 (๋์: nat-...)
VPC Endpoint
- ํ๋ผ์ด๋น EC2 ์์ S3์ ๊ทผํ๊ณ ์ถ์๋ NAT๊ฒ์ดํธ์จ์ด ๋์ VPC Endpoint ์ฌ์ฉ: ๋ณด์์ ์ด์
- IAM ์ญํ > ์ถ๊ฐ > EC2 > 'AmazonS3FullAccess' > 'test-01-s3-fullaccess'
-
ํ๋ผ์ด๋น EC2 ์์ฑ ์ IAM์ญํ ์ ํ ๋๋ ATTACH IAM์ญํ .
-
S3 ์ฐ๊ฒฐ ์๋
# S3๋ฒํท ๋ฆฌ์คํธ ์กฐํ (VPC Endpoint์ค์ ๋ ์ํ๋๋ฐ ์ฐ๊ฒฐ๋จ)
# ํ๋ผ์ด๋น RT์ NAT์ค์ ๋์ด์๊ธฐ๋๋ฌธ
aws s3 ls --region ap-northeast-2
# ํ๋ผ์ด๋น RT์ NAT์ค์ ์ญ์ ํ ์๋์ ์กฐํ์๋จ
aws s3 ls --region ap-northeast-2
- VPC Endpoint ์ค์ ์ดํ S3 ์ฐ๊ฒฐ ์๋
- VPC > ์๋ํฌ์ธํธ > ์์ฑ
- 'S3'๊ฒ์ > com.amazonaws.ap-northeast-2.s3 ์๋น์ค์ ํ, Gateway์ ํ ์ ํ
- VPC ๋ฐ ํ๋ผ์ด๋น Subnet ์ ํ
- ํ๋ผ์ด๋น RT > ๋ผ์ฐํ
> ๋์์ VPC Endpoint ์ถ๊ฐ๋จ ํ์ธ
- S3๊ด๋ จ๋ ํธ๋ํฝ์ S3๋ก ๋ณด๋ด๋ ์ ์ฑ
- VPC Endpoint ๋ฐ์ ๋ผ์ฐํ ์ถ๊ฐ > NAT Gateway์ถ๊ฐํ์ฌ ์์ ๋๊ฐ IP์ด์ธ๋ NAT Gateway๋ก ๋ณด๋ด๋๋ก ํจ
- VPC > ์๋ํฌ์ธํธ > ์์ฑ
# ์กฐํ๊ฐ๋ฅ ํ์ธ
aws s3 ls --region ap-northeast-2
ElastiCache
- ์ด์ํ๊ฒฝ ElastiCache
- redis ์ ํ
- ๋ ธ๋์ ํ: r5,m5,r4,m4,r3,m3,t3,t2 ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋คํธ์ํฌ ์ฑ๋ฅ ์ ํ
- Subnet๊ทธ๋ฃน '์์ฑ' starpass-was-00, starpass-bastion์ ๊ฐ์ VPC, ํ๋ผ์ด๋น Subnet ์ ํ
- ๋ณด์๊ทธ๋ฃน sg-starpass-redis ์ ํ
- ์๋ ๋ฐฑ์ ํ์ฑํ ์ฒดํฌํด์
vpc-0b4163a5f741002f8 (starpass-vpc)
subnet-01ab087db1ecc6748 (starpass-private-was-a)
sg-03ceb4c49e904f0aa (starpass-redis)
๊ฐ๋ฐํ๊ฒฝ - ๋ ๋์ค์๋ฒ (EC2/์์ด๋ทํธ์คํธ)
- redis ์๋ฒ ์ค์น
- yum install ๋๋ make install์ผ๋ก ๋ฃจํธ ์์คํ ์ ์ค์นํ์ง ์๊ณ , ๋ค์ ๋ฐฉ๋ฒ ์ ํ
- starpass ์ ์ ๋ก๊ทธ์ธ ํ, redis ์์ค ๋ค์ด๋ก๋, redis.conf ์ค์ ๋ณ๊ฒฝ - ๋ก์ปฌ ์์๋ง redis ์๋ฒ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก bind 127.0.0.1 - requirepass, port ์ค์ ์ถ๊ฐ
# ์์ค ๋ค์ด๋ก๋
$ su starpass
$ cd ~starpass/
$ wget http://download.redis.io/redis-stable.tar.gz
$ tar -xvzf redis-stable.tar.gz
$ vim redis-stable/redis.conf
# bind 127.0.0.1 ๋ก์ปฌ(ํฐ์บฃ)์์๋ง ์ ๊ทผ
# requirepass [your_password]
# port [your_port]
$ cd redis-stable/src
$ ./redis-server /home/starpass/redis-stable/redis.conf &
# ์ ์ ์๋
redis-cli -h {ElastiCache ์๋ํฌ์ธํธ} -p {๋ณด์๊ทธ๋ฃน์ ์ ์๋ ํฌํธ 7379}
> flushall
> keys *
EC2
-
redis์๋ฒ ์ค์ ์์
- ์๋ฒ(EC2๋๋ ์์ด๋ทํธ์คํธ ๋จธ์ )์ ์ค์น๋ redis์๋ฒ๋ฅผ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ๋ณ๊ฒฝ
- EC2: ๋ณด์๊ทธ๋ฃน์ ์ธ๋ฐ์ด๋๊ท์น TCP 7379 127.0.0.1
- ์์ด๋ทํธ์คํธ: redis.conf ์์
- ์๋ฒ(EC2๋๋ ์์ด๋ทํธ์คํธ ๋จธ์ )์ ์ค์น๋ redis์๋ฒ๋ฅผ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ๋ณ๊ฒฝ
-
ํผ๋ธ๋ฆญ IP์๋ํ ๋น : 'Enable'
- yum install ๋๋ make install์ผ๋ก ๋ฃจํธ ์์คํ ์ ์ค์นํ์ง ์๊ณ , ๋ค์ ๋ฐฉ๋ฒ ์ ํ
- starpass ์ ์ ๋ก ์์ค๋ง ๋ฐ์, redis.conf ์ค์ ์ถ๊ฐ: - ๋ก์ปฌ ์์๋ง redis ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก bind ์ ํ - requirepass, port ์ค์ ์ถ๊ฐ
- redis-server ์คํฌ๋ฆฝํธ redis.conf ์ค์ ๋ฐ์ํ์ฌ ์คํ
su starpass
cd ~starpass/
wget http://download.redis.io/redis-stable.tar.gz
tar -xvzf redis-stable.tar.gz
vim redis-stable/redis.conf
# bind 127.0.0.1 ๋ก์ปฌ(ํฐ์บฃ)์์๋ง ์ ๊ทผ
# requirepass [your_password]
# port [your_port]
cd redis-stable/src
./redis-server /home/starpass/redis-stable/redis.conf &
# ์ ์ ์๋
./redis-cli -h {ElastiCache ์๋ํฌ์ธํธ} -p {๋ณด์๊ทธ๋ฃน์ ์ ์๋ ํฌํธ 7379}
# redis-cli ํ๋ผ๋ฏธํฐ '-a {๋น๋ฐ๋ฒํธ}' ์ฌ์ฉ ์์ (๋ณด์์ด์)
./redis-cli -h 127.0.0.1 -p 7379
> AUTH {๋น๋ฐ๋ฒํธ}
> flushall
> keys *
import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.async.RedisAsyncCommands;
public class LettuceConnection {
// String.format("redis://%s:%d/0", hostname, port)
private static final String REDIS_CON_URL = "redis://13.209.76.95:6379/0"; // ์คํธEC2 redis
// private static final String REDIS_CON_URL = "elasticache-junho-0813.eo7tpf.0001.apn2.cache.amazonaws.com:6379";
public static void main(String[] args) {
RedisClient redisClient = RedisClient.create(REDIS_CON_URL);
StatefulRedisConnection<String, String> connection = redisClient.connect();
RedisAsyncCommands<String, String> async = connection.async();
final String[] result = new String[1];
async.set("foo", "bar")
.thenComposeAsync(ok -> async.get("foo"))
.thenAccept(s -> result[0] = s)
.toCompletableFuture()
.join();
connection.close();
redisClient.shutdown();
System.out.println(result[0]); // "bar"
}
}
- ์๋ฒ์ redisํด๋ผ์ด์ธํธ๋ก ๋ฐ์ดํฐ ํ์ธ
redis-cli
keys *
ํ ์คํธ
- ElastiCache์ ๊ทผ์ ๋ณด์๊ทธ๋ฃน์ ์ธ๋ฐ์ด๋ ๊ท์น์ ์ ์๋ EC2(private subnet) ์ด์ธ ip์์๋ ์ ๊ทผ ๋ถ๊ฐ
-
๊ฐ๋ฐ/์ด์ ํ๊ฒฝ ๋ถ๋ฆฌํ์ฌ ์บ์ ๊ด๋ฆฌ
- ๊ฐ๋ฐ: ๊ฐ๋ฐ์๋ฒ์ redis-server ์ค์นํ์ฌ ์บ์์ ์ฅ
- ์ด์: ElastiCache ํด๋ฌ์คํฐ ์์ฑํ์ฌ EC2->ElastiCache
-
๋ก์ปฌํ ์คํธ
- ๋ก์ปฌ์ ํฐ์บฃ WAS localhost:8180
- ๋์ปค redis-server, redis-cli (๋์ฌ์ด๋ ํต์ ์ ๋์ปค ๋คํธ์ํฌ ์์ฑ)
- ํฐ์บฃ WAS -> ๋์ปค redis-server ํต์ ์ lettuce ๋ผ์ด๋ธ๋ฌ๋ฆฌ
# https://emflant.tistory.com/235
docker pull redis:alpine
docker network create redis-net
docker network ls
docker network inspect redis-net
# --name ์ปจํ
์ด๋ ์ด๋ฆ ์ง์
# -v host์ ์ฐ๊ฒฐํ ํด๋ ์ง์
# https://stackoverflow.com/a/32270232/12198233
# -p host์ ๋
ธ์ถํ ํฌํธ ์ง์
docker run --name my-redis \
-p 7379:7379 \
--network redis-net \
-v $(pwd)/my/folder:/data \
-v c:/Users/feelon2/Downloads/redis.conf:/etc/redis.conf \
-d redis:alpine redis-server --appendonly yes
# --rm ์คํ ํ ๋ ์ปจํ
์ด๋ id๊ฐ ์กด์ฌํ๋ฉด ์ญ์ ํ run
winpty docker run -it --network redis-net \
--rm redis:alpine redis-cli \
-h my-redis