본문 바로가기
AWS/AWS Cloud School

[AWS] Amazon ECS를 위한 구성 배포

by parkkingcar 2023. 12. 3.

 

웹 기반 게임을 Docker 컨테이너 이미지로 빌드하여 Amazon Elastic Container Registry(Amazon ECR)를 푸시한 다음 AWS Fargate에서 Docker 컨테이너를 실행하여 Amazon ECS 클러스터를 생성합니다. 실습을 통해 아래 내용을 확인 할 수 있습니다.

 

 

- Amazon ECS 배포를 위해 Amazon ECR 리포지토리에 컨테이너 이미지 업로드 

- 리포지토리에서 Amazon ECS Fargate 클러스터로 컨테이너 배포 

- Amazon ECS 서비스 및 보관 생성 

- Amazon ECS Fargate 클러스터의 Docker 컨테이너에서 웹 기반 테스트 및 데모

 

 

아래 다이어그램은 이 실습을 위해 프로비저닝된 리소스 환경입니다. Amazon Elastic Container Service(Amazon ECS)는Docker 컨테이너를 지원하는 확장 가능한 재사용 컨테이너 관리 서비스입니다. Amazon ECS는 Amazon Elastic Compute Cloud(Amazon EC2)인스턴스의 관리형 클러스터에서 일하는 데 도움을 주는 데 도움이 됩니다. Amazon ECS를 사용하면 자체 클러스터 관리를 설치하고, 운영할 수 있고, 규모를 감당할 필요가 없습니다.

 

 

 

먼저 Amazon Linux 2를 실행하는 Amazon EC2 연결을 위해 실습에서 주어진 CommandHostSessionUrl 값을 복사하여 새 브라우저 탭에 삽입합니다.

 

 

docker -v && git --version

명령을 실행하여 Git 및 Docker 버전을 검사하고 설치를 확인합니다.

 

 

cd ~
git clone https://github.com/gabrielecirulli/2048

를 실행하여 해당 리포지토리를 clone합니다.

 

 

cat << EOF > Dockerfile
FROM nginx:latest

COPY . /usr/share/nginx/html

EXPOSE 80
EOF

2048 디렉터리로 이동하고 cat 명령으로 Dockerfile을 생성합니다.

 

 

Web2048은 웹 브라우저에서 실행되는 간단한 2048 게임입니다.2048게임을 도커 컨테이너 이미지로 생성합니다. docker 명령을 사용하기 위해 sudo su로 root로 전환합니다. (또는 $sudo usermod -aG docker ssm-user,   $newgrp docker 두 명령을 사용하여 사용자를 docker 그룹에 배치하면 sudo 권한 없이 docker 명령을 실행할 수 있고, 로컬 사용자 권한이 최소 권한 액세스 제어에 맞춰집니다.)

 

docker build -t web2048 .

다음 명령을 실행하여 Dockerfile을 기반으로 빌드합니다.

 

 

docker images

다음 명령으로 생성한 이미지목록을 확인합니다.

 

 

 

docker run -d -it -p 80:80 web2048

빌드된 이미지로 컨테이너를 실행합니다.

 

 

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/public-ipv4 -w "\n"

아래 명령으로 실행중인 EC2 인스턴스의 퍼블릭 IP 주소를 가져옵니다.

 

 

해당 퍼블릭 IP를 브라우저에 입력하면 생성한 컨테이너의 웹서버에 접근합니다.

 

 

앞서 생성한 Web2048 Docker 이미지를 Amazon ECR 리포지토리를 생성하고 Docker 이미지를 푸시합니다. aws configure를 이용해 리전 변수를 실습이 진행되는 리전으로 설정합니다. 

 

 

aws ecr create-repository --repository-name web2048

Docker 이미지용 Amazon ECR 리포지토리를 생성하려면 다음 명령을 실행합니다.

 

 

aws ecr describe-repositories --query 'repositories[].[repositoryName, repositoryUri]' --output table

방금 생성한 Amazon ECR 리포지토리를 보려면 다음 명령을 실행합니다.

 

 

export REPOSITORY_URI=$(aws ecr describe-repositories --query 'repositories[].[repositoryUri]' --output text)
echo ${REPOSITORY_URI}

리포지토리 URI 값을 환경 변수로 내보내려면 다음 명령을 실행합니다. echo 명령으로 ECR 리포지토리 URI가 표시됩니다.

 

 

export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`

export AWS_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region')

aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

Docker 이미지를 리포지토리에 푸시하려면 먼저 Amazon ECR에 로그인해야 합니다. get-login 명령은 12시간 동안 유효한 docker login 토큰을 반환합니다. 이 명령의 출력을 셸에 전달하여 docker login 명령을 실행하고 인증을 완료할 수 있습니다. Amazon ECR에 인증하려면 다음 명령을 실행합니다.

 

 

docker tag web2048:latest ${REPOSITORY_URI}:latest

이제 Docker 이미지가 저장된 리포지토리의 URI로 Docker 이미지를 태깅하고, latest 태그를 사용하여 최신 빌드임을 표시합니다.

 

 

docker push ${REPOSITORY_URI}:latest

docker push 명령을 사용하여 Docker 이미지를 리포지토리로 푸시합니다.

 

 

aws ecr describe-images --repository-name web2048

다음 명령을 실행하여 이미지 메타데이터를 보고 푸시가 성공했는지 확인합니다.

 

 

aws ecs create-cluster --cluster-name web2048

이제 ECS 클러스터를 생성합니다. 다음 명령을 실행하고 클러스터 이름 web2048을 인수로 전달하여 Amazon ECS 클러스터를 생성합니다.

 

 

cd ~
echo ${REPOSITORY_URI}

홈 디렉터리로 이동하고  Amazon ECR 리포지토리 URI를 가져와 텍스트 편집기에 복사합니다.

 

 

태스크 정의를 위한 파일을 생성합니다.

{
    "family": "web2048",
    "networkMode": "awsvpc",
    "taskRoleArn": "arn:aws:iam::000000000000:role/test-lab-3-ECSTaskExecutionRole-0000000000000",
    "executionRoleArn": "arn:aws:iam::000000000000:role/test-lab-3-ECSTaskExecutionRole-0000000000000",
    "containerDefinitions": [
        {
            "name": "web2048",
            "image": "000000000000.dkr.ecr.us-east-1.amazonaws.com/web2048:latest",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE"
    ],
    "cpu": "256",
    "memory": "512"
}

다음 내용을 태스크 정의 파일에 추가합니다. image: 키의 리포지토리 URI를 이전 단계의 값으로 바꾸고, executionRoleArn 및 taskRoleArn 값을 실습 지침 화면 왼쪽에 제공된 executionRoleArn 값으로 바꿉니다. 줄의 "executionRoleArn": , taskRoleArn: 또는 image: 부분은 삭제하지 말고, 콜론 뒤의 값만 삭제합니다. 또한 이미지는 값이 AWS 계정 ID로 시작하고 :latest 태그로 끝나야 합니다.

 

aws ecs register-task-definition --cli-input-json file://web2048_task_definition.json

다음 명령을 실행하여 새 태스크 정의를 등록합니다.

 

 

vi web2048_service.json

다음으로 서비스를 생성합니다. 서비스는 지정된 태스크 정의에서 원하는 수의 태스크를 실행하고 유지 관리합니다. 다음 명령으로 서비스의 새 입력 파일을 생성합니다.

{
    "cluster": "web2048",
    "serviceName": "web2048",
    "taskDefinition": "web2048",
    "loadBalancers": [
        {
            "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:000000000000:targetgroup/ECS-Target-Group/0000000000000000",
            "containerName": "web2048",
            "containerPort": 80
        }
    ],
    "desiredCount": 2,
    "launchType": "FARGATE",
    "platformVersion": "LATEST",
    "networkConfiguration": {
        "awsvpcConfiguration": {
            "subnets": [
                "PublicSubnet1",
                "PublicSubnet2"
            ],
            "securityGroups": [
                "ecsSecurityGroup"
            ],
            "assignPublicIp": "ENABLED"
        }
    }
}

targetGroupArn 값, PublicSubnet1, PublicSubnet2, ecsSecurityGroup을 실습 지침 왼쪽에 제공된 값으로 바꿉니다.

 

aws ecs create-service --cli-input-json file://web2048_service.json

이후 서비스를 생성합니다.

 

 

aws ecs describe-clusters --cluster web2048

다음 명령을 실행하여 태스크 상태를 볼 수 있습니다.

 

 

Lab-3-ALB-402151148.us-west-2.elb.amazonaws.com

이제 ALB의 DNS를 브라우저에 입력을 통해 아래와 같이 컨테이너에 접근이 가능합니다.

 

 

 

최종적으로 아래와 같은 다이어그램의 아키텍쳐를 구성하였습니다.

댓글