2024년 새롭게 구축해 보는 Amazon ECS on AWS Fargate 구축 (Fargate 구축)

ECR에 푸시한 이미지를 바탕으로 AWS Fargate를 구축해 보도록 하겠습니다.
2024.05.20

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 지난 번 ECR에 이미지를 푸시하는 블로그를 작성했습니다.

이번에는 ECR에 푸시한 이미지를 바탕으로 AWS Fargate를 구축해 보도록 하겠습니다.

IAM 설정

Amazon ECS on AWS Fargate를 생성하기에 앞서 컨테이너에서 사용할 권한을 생성할 필요가 있습니다.

생성하는 리소스는 다음과 같습니다.

  • test-ecs-task-execution-role (태스크 실행 역할)
    • test-ecs-task-allow-pullthrough
    • AmazonECSTaskExecutionRolePolicy
  • test-ecs-task-exec-role (태스크 역할)
    • test-ecs-task-role-policy

test-ecs-task-allow-pullthrough 정책을 생성하고 test-ecs-task-execution-role 역할에는 test-ecs-task-allow-pullthrough과 AmazonECSTaskExecutionRolePolicy 정책을 추가합니다.

이어서 test-ecs-task-role-policy 정책을 생성하고 test-ecs-task-exec-role 역할에 해당 정책을 추가합니다.

먼저 test-ecs-task-allow-pullthrough 이라는 이름으로 정책을 생성합니다.

해당 권한은 ECR의 리포지토리를 생성할 수 있는 권한인「ecr:CreateRepository」그리고 ECR에 외부 이미지를 가져올 수 있는 권한인 「ecr:BatchImportUpstreamImage」권한을 가진 정책을 생성합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ecr:CreateRepository",
                "ecr:BatchImportUpstreamImage"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

이어서 조금 전 생성한 정책을 바탕으로 IAM 역할을 생성합니다.

IAM 역할에서 서비스 또는 사용 사례는「Elastic Container Service」를 선택하고, 사용 사례에는「Elastic Container Service Task」를 선택합니다.

IAM 역할에는 ECS 작업을 실행하는 데 필요한 주요 권한을 가진「AmazonECSTaskExecutionRolePolicy」와 조금 전 생성한 정책을 포함하여 생성합니다.

이어서 또 하나의 정책을 생성합니다.

이 정책은 Amazon ECS Exec를 사용하기 위한 권한을 생성합니다. Exec는 컨테이너에 로그인할 수 있는 기능을 의미합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

이어서 해당 정책을 바탕으로 IAM 역할을 생성합니다.

IAM 역할에서 서비스 또는 사용 사례는「Elastic Container Service」를 선택하고, 사용 사례에는「Elastic Container Service Task」를 선택합니다.

조금 전 생성한 정책을 선택하고, 적절하게 역할 이름을 입력하여 IAM 역할 생성을 끝마칩니다.

보안 그룹 생성

이어서 Fargate와 로드 밸런서에서 사용할 보안 그룹을 생성합니다.

※ Fargate를 Private Subnet에 생성하므로 반드시 NAT Gateway가 생성되어 있어야 합니다. NAT Gateway를 생성하지 않았을 시 발생하는 문제에 대해서는 아래 블로그를 참고해 주세요.

생성하는 리소스는 다음과 같습니다.

  • test-alb-sg (로드 밸런서 보안 그룹)
  • test-fargate-sg (Fargate 보안 그룹)

먼저 로드 밸런서의 보안 그룹입니다.

HTTP 80번 포트를 열고 어디서든 접속할 수 있도록 설정합니다.

마지막으로 Fargate의 보안 그룹입니다.

Fargate 보안 그룹에서는 로드 밸런서로의 접속을 허용 하도록 HTTP 80번 포트를 열고 로드 밸런서의 보안 그룹을 설정합니다.

로드 밸런서 생성

보안 그룹까지 생성했다면, 이번엥는 로드 밸런서를 생성합니다.

생성하는 리소스는 다음과 같습니다.

  • test-tg (대상 그룹)
  • test-alb (ALB)

먼저 대상 그룹을 생성합니다.

대상 그룹의 유형은 IP 주소를 선택합니다. Fargate는 awsvpc 네트워크 모드를 사용하기 때문에 대상 그룹 유형은 IP를 선택할 필요가 있습니다. Fargate의 경우 EC2 인스턴스를 생성하는 것이 아니라 컨테이너만으로 서비스가 움직이기 때문에 컨테이너 본인이 ENI를 관리할 필요가 있습니다. 그렇기 때문에 각 작업에 대해 ENI를 생성하고 관리할 수 있는 awsvpc 모드를 Fargate에서 사용해야 합니다.

보다 상세한 내용은 아래 블로그를 참고해 주세요.

그 외 설정 값은 디폴트 값을 유지하며 대상 그룹을 생성합니다.

로드 밸런서의 경우 ALB를 선택하며, 체계는 인터넷 경계를 선택합니다.

네트워크는 로드 밸런서를 생성할 VPC와 퍼블릭 서브넷을 선택합니다.

마지막으로 보안 그룹과 대상 그룹을 선택하여 로드 밸런서 생성을 끝마칩니다.

Fargate 생성

이어서 Fargate를 생성하는데, 생성 순서는 다음과 같습니다.

  • test-task (작업 및 작업 정의)
  • test-cluster (클러스터)
  • test-service (서비스)

먼저 태스크를 생성합니다.

태스크 정의 패밀리에는 태스크의 이름을 입력하고, 시작 유형은 AWS Fargate를 선택합니다.

그 외 값들은 디폴트를 유지합니다.

태스크 역할과 실행 역할에는 조금 전 생성한 IAM 역할을 선택합니다.

이어서 컨테이너 세부 정보에서 이미지 URI는 이전에 ECR에 푸시한 이미지의 URI를 입력합니다.

포트 매핑은 80번 포트를 입력하고 태스크 생성을 끝마칩니다.

다음으로 클러스터를 생성합니다.

클러스터 이름을 입력하고 인프라에는 AWS Fargate를 선택하고 생성을 끝마칩니다.

이제 생성한 클러스터로 진입하여 서비스를 생성합니다.

시작 유형은 Fargate를 선택합니다.

배포 구성에는 서비스를 선택하고, 패밀리에는 조금 전 생성한 태스크를 선택합니다.

이어서 서비스 이름을 입력하고, 생성하고자 하는 태스크를 입력합니다.

여기서 원하는 태스크는 EC2 인스턴스로 예를 들면 생성하고자 하는 EC2 인스턴스 대수를 의미합니다.

네트워킹에는 VPC와 프라이빗 서브넷, 보안 그룹을 선택합니다.

생성한 Fargate 컨테이너는 프라이빗 서브넷에 생성되기 때문에 퍼블릭 IP는 부여하지 않습니다.

마지막으로 로드 밸런싱에서는 조금 전 생성한 로드 밸런서를 선택합니다. 리스너와 대상 그룹 또한 조금 전 생성한 리소스를 선택하고 서비스 생성을 끝마칩니다.

생성한 Fargate로 접속

대상 그룹으로 이동하면 대상이 등록된 것을 확인할 수 있습니다.

마지막으로 브라우저에 로드 밸런서의 DNS 이름을 입력하면 성공적으로 웹 페이지가 출력되는 것을 확인할 수 있습니다.

여기까지가 Amazon EC2 on Fargate 셍성 과정이었습니다. Amazon ECS의 경우 아무래도 생성해야 하는 서비스와 설정이 많은 관계로 하나하나 파고들기보다는 간단한 설정으로 일단 구축해 보고 실제로 컨테이너가 어떻게 움직이는지 직접 확인해 보는 게 가장 중요한 것 같습니다. 이렇게 간단하게 구축할 수 있게 된다면 보다 상세하게 파고들어 직접 여러 설정을 만져본다면 보다 컨테이너에 익숙해지지 않을까 생각합니다.

본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 kis2702@naver.com로 보내주시면 감사하겠습니다.