[AWS Computing] Deploying a web service based on ECS Fargate and DynamoDB

Kim Jun Young·2025년 11월 24일

AWS

목록 보기
5/16
post-thumbnail

본 포스팅의 자료는 세명컴퓨터고등학교 보안과 전공동아리 Null4U(출제: 양OO 선배님)에 있음을 알립니다.

과제 제출일: 2025/11/24

0. Overview — Problem

이 과제는 AWS의 ECS FargateDynamoDB를 활용한 웹 서비스 배포를 실습할 수 있는 과제입니다.

제공되는 애플리케이션 코드를 Docker 컨테이너 이미지화하여 ECR에 업로드하고, 이를 ECS Fargate로 배포하고 ALB 뒤에 배포하십시오.

각 ECS Fargate Task는 Private Subnet에 분산하여 배포합니다. 2개 이상의 Task를 유지하도록 하십시오. ALB Target Group의 타입은 IP, Health Check 경로는 /로 설정하십시오.

자세한 아키텍처 다이어그램은 아래에 첨부된 자료를 참조하십시오. 채점 기준은 아래와 같습니다.

  • ALB DNS로 접속 시 웹 페이지가 정상적으로 표시되어야 합니다.
  • 웹 페이지의 Server Status 버튼을 클릭했을 때 JSON 출력과 함께 Task IP 값이 변화됨을 확인해야 합니다. 이는 곧 ALB가 두 개 이상의 Fargate Task로 분산된다는 것을 의미합니다.
  • Check DynamoDB 버튼을 클릭했을 때 DynamoDB 테이블 목록이 보여야 합니다. Fargate Task는 Private 서브넷에서 NAT Gateway를 통해 정상적으로 DynamoDB API에 접근함을 의미합니다. (테이블 이름은 임의로 설정하십시오)

배포해야 할 애플리케이션 소스 코드는 아래 레포지토리에서 다운받으실 수 있습니다.

https://github.com/yulmwu/blog-example-demo/tree/main/aws-ecs-dynamodb-web-service-example

1. VPC

먼저 CIDR 10.0.0.0/16의 VPC를 만들어보자. 지난 과제와는 다르게 Protected Subnet이 존재하지 않기 때문에 Public Subnet 2개, Private Subnet 2개를 만들고 NAT Gateway 1개를 만들어주겠다.

2. Building Docker Image, ECR Push

다음으로 ECR 레포지토리를 만들어보고 이미지를 빌드하여 Push 해보겠다. 필자의 환경은 MacOS이기 때문에 멀티 아키텍처 빌드를 위해 Docker Buildx를 사용 할 것이다. 먼저 ECR 레포지토리를 만들자.

이미지를 빌드하고 Push 하기 전, 도커 클라이언트에서 ECR에 접근할 수 있도록 로그인을 해주자.

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <Account ID>.dkr.ecr.ap-northeast-2.amazonaws.com

그리고 Buildx를 이미지를 빌드하고 Push 해보자.

# (처음 필요 시 Buildx Builder 생성)
docker buildx create --name multi --use
docker buildx inspect --bootstrap

docker buildx build \
  --platform linux/amd64,linux/arm64 \
  -t 986129558966.dkr.ecr.ap-northeast-2.amazonaws.com/exam/repo:latest \
  --push \
  .

builx build 명령어에 빌드 및 태그 지정, Push 과정이 전부 포함되어 있다. 로컬에 남지 않고 바로 레포지토리로 Push 된다.

이미지 빌드 및 ECR Push는 이상 마무리한다.

3. Application Load Balancer

대상 그룹은 추후 ECS Fargate를 구성할 때 만들고, ALB를 하나 만들어두고 시작하겠다.

Internet Facing 및 IPv4로 선택한다.

네트워크 매핑은 각 AZ의 Public Subnet을 선택한다.

보안 그룹은 HTTP 80번 포트를 허용하는 보안 그룹을 만들고 선택하였다.

그리고 리스너를 추가해야 하는데, 하나 이상의 리스너를 등록하고 만들라고 한다. 우리는 추후 대상 그룹을 만들 것이기 때문에 아무 대상 그룹을 만들고 임시로 추가해둔다.

이렇게 해두고 나중에 수정하면 된다. 이대로 ALB를 만들자.

4. ECS Fargate, ALB Target Group

이제 ECS 클러스터 및 ECS Fargate를 구성하고 동시에 ALB 대상 그룹을 구성해보겠다.

위와 같이 Fargate 전용 클러스터를 만들었다. 이제 서비스를 만들어서 컨테이너를 배포하기 전, 태스크 정의부터 해보자. 태스크 정의는 EKS를 비유하자면 Pod Spec과 비슷하다.

그리고 컨테이너에서 DynamoDB에 접근하기 위한 IAM 역할을 넣어주자. 아래의 "태스크 실행 역할"은 ECS 에이전트가 이미지를 가져오거나 로그를 CloudWatch 등으로 보내기 위해 사용하는 IAM 역할로, 다른 목적이다.

이미지는 3000번 포트로 Expose되어 있고, TCP/HTTP 3000으로 포트를 매핑해주자. 환경 변수는 설정하지 않았다.

이제 서비스를 만들자.

환경은 Spot을 선택해도 무방하다. 잠시 켜두고 끌 Task이기 때문에 Spot은 굳이 사용하지 않았다.

배포 구성은 최소 2개의 태스크로 구성하고, 오토 스케일링은 따로 구성하진 않았다.

네트워킹에선 두 개의 Private Subnet을 선택해주고, Public IP는 당연히 꺼두었다.

로드밸런서는 아까 만들어둔 ALB를 선택한다.

위와 같이 대상 그룹을 만들도록 하고 HTTP 80번 리스너에 연결하도록 한다.

그럼 ALB 리스너 규칙에 이런식으로 되는데, 규칙을 편집하여 임시로 만들어둔 대상 그룹을 편집하자.

기본 규칙은 제거할 수 없으므로 새롭게 만든 대상 그룹으로 수정하면 된다.

그럼 웹 페이지 접속이 잘 되는 모습을 볼 수 있다. 이제 DynamoDB 테이블을 하나 만들자.

5. DynamoDB

과제의 목적이 ECS Fargate Task가 DynamoDB API에 접근할 수 있는지를 확인하는 것이기 때문에 테이블만 만들어두면 된다.

6. Testing

이상으로 이번 과제의 풀이를 마무리하겠다.

profile
세명컴퓨터고등학교 보안과 11기 / 클라우드, DevOps 동아리 — Null4U / SCA

0개의 댓글