Skip to content

AWS at Rowem

pods
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.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์€ ์–ด๋–ค ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”๊ณผ๋„ ๋ช…์‹œ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ

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๋กœ ๋ณด๋‚ด๋„๋ก ํ•จ
# ์กฐํšŒ๊ฐ€๋Šฅ ํ™•์ธ
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 ์ˆ˜์ •
  • ํผ๋ธ”๋ฆญ 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