๐Ÿ’ช๋„์ „! ํ”„๋ฆฌํ‹ฐ์–ด๋กœ AWS ECS ์‚ฌ์šฉํ•˜๊ธฐ: ECS ํด๋Ÿฌ์Šคํ„ฐ์— EC2 ์ธ์Šคํ„ด์Šค ์—ฐ๊ฒฐ + ๊ฐ„๋‹จ ๋ฐฐํฌ

ํ—ˆ์ง€์˜ˆยท2024๋…„ 8์›” 5์ผ
4
post-thumbnail

์ง„์งœ ์ง„์งœ ๋‚ด ์†์œผ๋กœ AWS๋กœ ๋ฐฐํฌ๋ฅผ ๋“œ๋””์–ด ๋„์ „ํ•ด๋ณด์ž!

ํ•ญ์ƒ ํ”„๋กœ์ ํŠธํ•  ๋•Œ๋Š” ๋ฐฐํฌ ๋Šฅ๋ ฅ์ž๊ฐ€ ๋”ฐ๋กœ ์žˆ์–ด์„œ ๋ฐฐํฌ๋ฅผ ์ง์ ‘ ์‹ ๊ฒฝ์จ ๋ณธ ์ ์ด ์—†์—ˆ๋‹ค.

์ด๋ฒˆ์— ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ฐฐํฌ๋ฅผ ์ œ๋Œ€๋กœ ํ•œ๋ฒˆ ์ฐํ•˜๊ฒŒ ๊ฒฝํ—˜ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค~!
์ด์™•ํ•  ๊บผ AWS ํ”„๋ฆฌํ‹ฐ์–ด ๋ฝ•์„ ์ œ๋Œ€๋กœ ๋ฝ‘์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ AWS ECS๋ฅผ ์‚ฌ์šฉํ•ด์„œ CI/CD๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ณผ ๊ณ„ํš์ด๋‹ค.


1. ECS ๊ธฐ๋ณธ ์„ค์ •ํ•˜๊ธฐ

(1) ECS Cluster์™€ EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑํ•˜๊ธฐ

๋งจ ์ฒ˜์Œ์—” ECS ํด๋Ÿฌ์Šคํ„ฐ์™€ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž.

  • ECS ํด๋Ÿฌ์Šคํ„ฐ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ”„๋ผ์˜ ๋…ผ๋ฆฌ์  ๊ทธ๋ฃน์ด๋‹ค.
    ์ปจํ…Œ์ด๋„ˆํ™” ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ณ  ํ™•์žฅํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ด๋‹ค.

  • EC2 ์ธ์Šคํ„ด์Šค๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ์„œ๋ฒ„ ํ™˜๊ฒฝ์ด๋‹ค. Linux ์ปดํ“จํ„ฐ ํ•œ ๋Œ€๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.


โ‘  ECS Cluster ์ƒ์„ฑ

๐Ÿ–ฑ AWS Console > Amazon Elastic Container Service > Cluster > [Create cluster]

  • Infrastructure : AWS Fargate (serverless), Amazon EC2 instances ๋ชจ๋‘ ์ฒดํฌ ํ•ด์ œ
  • Monitoringย -ย optional
    • ํ”„๋ฆฌํ‹ฐ์–ด๋Š” ์‚ฌ์šฉ ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ํ•ด์ œํ•˜์ง€๋งŒ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์ผ์‹œ์ ์œผ๋กœ ์ฒดํฌํ•ด๋†“๊ณ  ๋กœ๊ทธ๋กœ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…์„ ํ–ˆ๋‹ค.
  • ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๊ธฐ๋ณธ ์„ค์ • ๊ทธ๋Œ€๋กœโ€ฆ

๐Ÿค” ์™œ ์—ฌ๊ธฐ์„œ ์ธํ”„๋ผ๋ฅผ ์„ ํƒ ์•ˆํ•˜๋‚˜์š”?

์—ฌ๊ธฐ์„œ Infrastructure์— Amazon EC2 instances๋ฅผ ์„ ํƒํ•˜๋ฉด Auto Scaling Group์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑํ•ด์„œ ์“ฐ๋„๋ก ๋˜์–ด์žˆ๋‹ค.

EC2 ํ•˜๋‚˜๋งŒ ์“ธ๊บผ๋ฉด ๊ตณ์ด Auto Scaling Group์„ ์“ธ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐํ•˜๋ ค ํ•˜์ง€ ๋ง๊ณ , ๋จผ์ € ์ƒ์„ฑํ•œ ๋’ค์— EC2 ์ธ์Šคํ„ด์Šค์™€ ์—ฐ๊ฒฐ ์„ค์ •์„ ํ•ด์ฃผ์ž!


โ‘ก EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

๐Ÿ–ฑ AWS Console > EC2 > Instances > Launch instances

  • Application and OS Images (Amazon Machine Image): Amazon Linux
  • Instance type: t2.micro
  • Network settings > Firewall
    • Create security group ์ฒดํฌํ•˜๊ณ  ์•„๋ž˜ ์ฒดํฌ ๋ฐ•์Šค ์ผ๋‹จ ๋ชจ๋‘ ํ—ˆ์šฉ (ssh๋Š” ์„ค์ • ์ดํ›„์— ๋‹ซ์„ ์˜ˆ์ •)
  • ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๊ธฐ๋ณธ ์„ค์ • ๊ทธ๋Œ€๋กœโ€ฆ


(2) EC2 ์ธ์Šคํ„ด์Šค์—์„œ ECS Cluster ์—ฐ๊ฒฐ ์„ค์ •ํ•˜๊ธฐ

์ฐธ๊ณ ) Installing the Amazon ECS container agent


ECS ํด๋Ÿฌ์Šคํ„ฐ์™€ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค๋ฉด ์ด ๋‘˜์„ ์—ฐ๊ฒฐํ•ด์ฃผ์ž.

๋‹ค์Œ์€ ECS ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์‹ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •์ด๋‹ค.

EC2์— ์ ‘์†ํ•ด์„œ ์ง„ํ–‰ํ•ด์ฃผ์ž.

๋‚˜๋Š” SSH ์ธ๋ฐ”์šด๋“œ๋ฅผ ์ž ์‹œ ์—ด์–ด๋‘๊ณ  ์ฝ˜์†” ๋‚ด์—์„œ EC2 Instance Conncet๋กœ ์ ‘์†ํ–ˆ๋‹ค.


โ‘  ECS agent ์„ค์น˜ํ•˜๊ธฐ

curl -O https://s3.ap-northeast-2.amazonaws.com/amazon-ecs-agent-ap-northeast-2/amazon-ecs-init-latest.x86_64.rpm
sudo yum localinstall -y amazon-ecs-init-latest.x86_64.rpm

โ‘ก ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ

  • /lib/systemd/system/ecs.service์— [Unit] ๋ถ€๋ถ„์˜ ๋งˆ์ง€๋ง‰ ์ค„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •
    After=cloud-final.service
  • /etc/ecs/ecs.config ํŒŒ์ผ ์ƒ์„ฑ
    ```bash
    ECS_CLUSTER=์ƒ์„ฑํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ด๋ฆ„์„ ์—ฌ๊ธฐ์—
    ```

โ‘ข ECS agent ์‹คํ–‰ํ•˜๊ธฐ

sudo systemctl start ecs # ์ง€๊ธˆ ์‹œ์ž‘
sudo systemctl enable ecs # EC2 ์ธ์Šคํ„ด์Šค๊ฐ€ ์žฌ์‹œ์ž‘ ๋˜๋ฉด ์ž๋™ ์‹œ์ž‘

โ‘ฃ ECS Cluster์—์„œ ์—ฐ๊ฒฐ ํ™•์ธํ•˜๊ธฐ

๐Ÿ–ฑ AWS Console > Amazon Elastic Container Service > Clusters > ์ƒ์„ฑํ•œ cluster ์„ ํƒ

ํ•˜๋‹จ ํƒญ Infrasture > Container instances์— ์œ„์—์„œ ์„ค์ •ํ•œ EC2 ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

์œ„์™€ ๊ฐ™์ด ๋ณด์ธ๋‹ค๋ฉด ์„ฑ๊ณต ๐ŸŽ‰



2. ECS์—์„œ ๊ฐ„๋‹จ ๋ฐฐํฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ

์ด์ œ, ECS๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์‹ค์Šตํ•ด๋ณด์ž.

์—ฌ๊ธฐ์„œ ECR๋ฅผ ์‚ฌ์šฉํ•ด๋ณผ ๊ฑด๋ฐ, ECR์€ AWS์—์„œ docker image๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ผ์ข…์˜ docker hub๋‹ค.

(1) EC2์—์„œ Amazon Elastic Container Registry ์‚ฌ์šฉํ•˜๊ธฐ

โ‘  Private registry ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿ–ฑ AWS Console > Amazon Elastic Container Registry > Private Repositories > [Create repository]

  • Visibility settings: Private
  • Repository name: test

โ‘ก EC2์—์„œ ECR ์ธ์ฆ์„ ์œ„ํ•ด IAM ์‚ฌ์šฉ์ž ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿ–ฑ AWS Console > Identity and Access Management (IAM) ****> Access management > Users > [Create user]

  • Permissions policies์— ๋‹ค์Œ์„ ๊ถŒํ•œ ์ •์ฑ…์„ ์ถ”๊ฐ€
    • AmazonEC2ContainerRegistryPowerUser

โ‘ข IAM ์‚ฌ์šฉ์ž์— Access key ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿ–ฑ AWS Console > Identity and Access Management (IAM) ****> Access management> Users
์ƒ์„ฑํ•œ IAM User ์„ ํƒ > [create access key]

  • Use case: Command Line Interface

โš  ์ƒ์„ฑ๋œ Access key์™€ Secret access key๋ฅผ ๊ธฐ๋กํ•ด๋‘”๋‹ค. (์ถ”ํ›„์— ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์—†์Œ!)


โ‘ฃ EC2 ์ธ์Šคํ„ด์Šค์—์„œ ECR ๋กœ๊ทธ์ธ

๐Ÿ–ฑ EC2 ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•ด์„œ ์ง„ํ–‰

  • ~/.aws/credentials ํŒŒ์ผ ์ƒ์„ฑ
    [default]
    awa_access_key_id = ์•„๊นŒ ์ƒ์„ฑ๋œ Access key
    aws_secret_access_key = ์•„๊นŒ ์ƒ์„ฑ๋œ Secret access key
  • Docker ๋‹ค์šด๋กœ๋“œ & ์‹คํ–‰
    # docker install
    sudo yum install -y docker
    
    # docker ์‹คํ–‰
    sudo systemctl start docker
    
    # ec2 ์ธ์Šคํ„ด์Šค ์žฌ์‹œ์ž‘ํ•˜๋ฉด docker ์ž๋™ ์‹คํ–‰
    sudo systemctl enable docker
  • ECR ๋กœ๊ทธ์ธ

    ์•„๊นŒ ์‹คํ–‰ํ•œ Repository์—์„œ [View push commands]๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋œจ๋Š” 1๋ฒˆ command๋ฅผ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅ

    aws ecr get-login-password --region <๋ฆฌ์ „> | docker login --username AWS --password-stdin <์–ด์นด์šดํŠธ_์•„์ด๋””>.dkr.ecr.<๋ฆฌ์ „>.amazonaws.com

โ‘ค ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

๐Ÿ–ฑ EC2 ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•ด์„œ ์ง„ํ–‰

  • index.html
    <!doctype html>
    <h1>hello ecs!</h1>
  • dockerfile
    FROM nginx:latest
    
    COPY ./index.html /usr/share/nginx/html/index.html
    
    EXPOSE 80
    
    CMD ["nginx", "-g", "daemon off;"]

โ‘ฅ docker image ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•ด๋ณด๊ธฐ

docker build -t test-image:latest .

docker run -d -p 80:80 --name test-container test-image:latest

์ดํ›„ EC2 ์ธ์Šคํ„ด์Šค์˜ Public IPv4 address๋ฅผ ํ™•์ธ

  • http://<public ip> ์ ‘์†ํ•ด๋ณด๊ธฐ

โš  ๋งŒ์•ฝ์— ์ ‘์†์ด ์•ˆ๋˜๋ฉด?

๐Ÿ–ฑ EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ธ > Security ํƒญ > Security groups ์„ ํƒ

  • Inbound rules์— HTTP ์ถ”๊ฐ€ํ•˜๊ธฐ!

โ‘ฆ ECR์— docker image ํ‘ธ์‹œํ•˜๊ธฐ

export $REGISTRY=<์–ด์นด์šดํŠธ_์•„์ด๋””>.dkr.ecr.<๋ฆฌ์ „>.amazonaws.com
export $REPOSITORY_NAME=<์ƒ์„ฑํ•œ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ ์ด๋ฆ„>

docker tag test-image:latest $REGISTRY/$REPOSITORY_NAME:test

docker push $REGISTRY/$REPOSITORY_NAME:test

์ƒ์„ฑํ•œ ๋ ˆํฌ์ง€ํ„ฐ๋ฆฌ์— ์ด๋ฏธ์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ



(2) Task ์ƒ์„ฑํ•ด์„œ ๋ฐฐํฌํ•˜๊ธฐ

โ‘  Task์—์„œ ์‚ฌ์šฉํ•  IAM role ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿ–ฑ AWS Console > Identity and Access Management (IAM) ****> Access management > Roles > [Create role]

  • Trusted entity type: AWS service
  • Use case: Elastic Container Service
    • Elastic Container Service Task ์„ ํƒ
  • Permissions policies
    • AmazonECSTaskExecutionRolePolicy ์„ ํƒ

โ‘ก Task ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿ–ฑ AWS Console > Amazon Elastic Container Service > Task definitions > [Create new task definition]

  • Infrastructure requirements
    • Launch type: Amazon EC2 instances ์„ ํƒ
    • Network mode: bridge
    • Task role, Task execution role: <์•„๊นŒ ์ƒ์„ฑํ•œ role>
  • Container - 1
    • Image URI: $REGISTRY/$REPOSITORY_NAME:test
    • Essential container: Yes
    • Port mapping
      • Host port: 80
      • Container port: 80
    • Read only root file system: Read only ์ฒดํฌ ํ•ด์ œ
    • HealthCheck - optional
      • Command: CMD-SHELL,curl -f http://localhost || exit 1

โ‘ข Task ์‹คํ–‰ํ•˜๊ธฐ

๐Ÿ–ฑ ์ƒ์„ฑํ•œ Task ์ƒ์„ธ > Deploy > Run task

  • Compute configurationย (advanced)
    • Compute options: Launch type ์„ ํƒ
    • Launch type: EC2
  • cluster ์ƒ์„ธ์—์„œ task ํƒญ์—์„œ ์‹คํ–‰ ์ค‘์ธ task ํ™•์ธ

์ดํ›„, http://<public ip> ์ ‘์†ํ•ด๋ณด๊ธฐ

์—ฌ๊ธฐ์„œ ๋ฐฐํฌํ•œ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ด๋ฉด ์„ฑ๊ณต ๐ŸŽ‰


๐Ÿ“Œ ํ›„๊ธฐ

์‚ฌ์‹ค ECS ์ฒ˜์Œ ์‹œ๋„ํ–ˆ์„ ๋•Œ๋Š” ๋„ˆ๋ฌด ํ—ค๋งธ๋‹ค.

์—ฌ๊ธฐ์ €๊ธฐ ๋ธ”๋กœ๊ทธ, gpt... ๋ฅผ ๋”ฐ๋ผํ•˜๋ฉด์„œ ๋ญ”์ง€๋„ ๋ชจ๋ฅด๋Š” ๊ธฐ๋Šฅ๋“ค, ํ•„์š”ํ•˜์ง€๋„ ์•Š์€ ์„ค์ •๋“ค์„ ์–น์–ด๋‚˜๊ฐ€๋‹ค๋ณด๋‹ˆ ๊ผฌ์—ฌ์„œ ๋” ์ด์ƒ ์ง„ํ–‰ํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ชจ๋“  ๊ฑธ ๋‚ด๋ ค๋†“๊ณ  ๋‹ค์‹œ ์‹œ๋„ํ–ˆ๋‹ค. (์ •๋ง ๋‚ด๋ ค๋†“์Œ... ๊ณ„์ • ์ง€์šฐ๊ณ  ์ƒˆ๋กœ ๋งŒ๋“ค์—ˆ๋‹ค)

๋‚ด๊ฐ€ ์ดํ•ด๋œ ๋ฒ”์œ„ ๋‚ด์—์„œ ๊ผญ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์–น์–ด๊ฐ€๋ฉฐ ์ง„ํ–‰ํ•˜๋‹ˆ ์ˆ ์ˆ  ํ’€๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๊ทธ์ œ์•ผ ๋‚ด๊ฐ€ ๋ณ„๋กœ ์ค‘์š”ํ•˜์ง€๋„ ์•Š์€ ์„ค์ •๋“ค๋กœ ํ—ค๋งค์„œ ์ค‘์š”ํ•œ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค.

์–ด๋ ต๊ณ  ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์‹œ๋„ํ•  ๋•Œ๋Š” ์ตœ๋Œ€ํ•œ ์‹ฌํ”Œํ•˜๊ณ  ์ž‘๊ฒŒ ์‹œ๋„ํ•ด๋ณด๋Š” ๊ฒƒ์ด ๋ฒ ์ŠคํŠธ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ํ™•์žฅ์€ ๊ทธ ๋‹ค์Œ์— ํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ˆ๊น ๐Ÿ‘

profile
๋Œ€ํ•™์ƒ์—์„œ ์ทจ์ค€์ƒ์œผ๋กœ ์ง„ํ™”ํ–ˆ๋‹ค๊ฐ€ ์ง€๊ธˆ์€ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž๋กœ 2์ฐจ ์ง„ํ™”ํ•จ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด