AWS CLI에서 Amazon ECS 관리형 인스턴스에 대한 태스크를 생성하는 방법에 대해 알아봅니다. - Amazon Elastic Container Service

AWS CLI에서 Amazon ECS 관리형 인스턴스에 대한 태스크를 생성하는 방법에 대해 알아봅니다.

다음 단계는 AWS CLI를 사용하여 Amazon ECS 관리형 인스턴스를 통해 Amazon ECS에서 클러스터를 설정하고, 용량 공급자를 생성하며, 태스크 정의를 등록하고, Linux 태스크를 실행하며, 기타 일반적인 시나리오를 수행하는 데 도움이 됩니다. AWS CLI의 최신 버전을 사용합니다. 최신 버전으로 업그레이드하는 방법에 대한 자세한 내용은 AWS CLI 최신 버전의 설치 또는 업데이트를 참조하세요.

참고

듀얼 스택 서비스 엔드포인트를 사용하면 AWS AWS CLI, SDK 및 Amazon ECS API에서 IPv4 및 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있습니다. 자세한 내용은 Amazon ECS 듀얼 스택 엔드포인트 사용 섹션을 참조하세요.

사전 조건

자습서를 시작하기 전에 다음을 완료합니다.

  • Amazon ECS 설정에 나와 있는 단계를 완료했습니다.

  • 최신 버전의 AWS CLI가 설치 및 구성됩니다. AWS CLI 설치 또는 업그레이드에 대한 자세한 내용은 AWS Command Line Interface 사용 설명서최신 버전의 AWS CLI 설치 또는 업데이트를 참조하세요.

  • Amazon ECS 사용 설정의 단계가 완료되었습니다.

  • Amazon ECS 관리형 인스턴스에 필요한 IAM 역할이 있습니다. 여기에는 다음이 포함됩니다.

    • 인프라 역할 - Amazon ECS가 사용자를 대신해 AWS 서비스를 직접 호출하여 Amazon ECS 관리형 인스턴스 인프라를 관리하도록 허용합니다.

      자세한 내용은 Amazon ECS 인프라 IAM 역할 섹션을 참조하세요.

    • 인스턴스 프로파일 - 관리형 인스턴스에서 실행되는 Amazon ECS 컨테이너 에이전트 및 Docker 대몬에 대한 권한을 제공합니다.

      인스턴스 역할 이름에는 인프라 역할의 iam:PassRole 작업과 일치하도록 접두사로 ecsInstanceRole이 포함되어야 합니다.

      자세한 내용은 Amazon ECS 관리형 인스턴스의 인스턴스 프로파일 섹션을 참조하세요.

  • 사용할 VPC 및 보안 그룹이 생성되었습니다. 이 자습서에서는 Amazon ECR Public에서 호스팅되는 컨테이너 이미지를 사용하므로 인스턴스에서 인터넷에 액세스할 수 있어야 합니다. 인스턴스에 인터넷 경로를 제공하려면 다음 옵션 중 하나를 사용합니다.

    • 탄력적 IP 주소가 있는 NAT 게이트웨이와 함께 프라이빗 서브넷을 사용합니다.

    • 퍼블릭 서브넷을 사용하고 퍼블릭 IP 주소를 인스턴스에 할당합니다.

    자세한 내용은 Virtual Private Cloud 생성 섹션을 참조하세요.

    보안 그룹 및 규칙에 대한 자세한 내용은 Amazon Virtual Private Cloud 사용 설명서VPC에 대한 기본 보안 그룹규칙 예를 참조하세요.

  • (선택 사항) AWS CloudShell은 고객에게 자체 EC2 인스턴스를 생성할 필요 없이 명령줄을 제공하는 도구입니다. 자세한 내용은 AWS CloudShell 사용 설명서What is AWS CloudShell?을 참조하세요.

1단계: 클러스터 생성

계정에는 기본적으로 default 클러스터가 할당됩니다.

참고

제공된 default 클러스터를 사용하는 이점은 후속 명령에서 --cluster cluster_name 옵션을 지정할 필요가 없다는 것입니다. 기본 클러스터가 아닌 자체 클러스터를 생성하는 경우, 해당 클러스터에 사용할 각 명령에 --cluster cluster_name을 지정해야 합니다.

다음 명령을 사용하여 고유한 이름의 자체 클러스터를 생성합니다.

aws ecs create-cluster --cluster-name managed-instances-cluster

출력:

{ "cluster": { "status": "ACTIVE", "defaultCapacityProviderStrategy": [], "statistics": [], "capacityProviders": [], "tags": [], "clusterName": "managed-instances-cluster", "settings": [ { "name": "containerInsights", "value": "disabled" } ], "registeredContainerInstancesCount": 0, "pendingTasksCount": 0, "runningTasksCount": 0, "activeServicesCount": 0, "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/managed-instances-cluster" } }

2단계: Amazon ECS 관리형 인스턴스 용량 공급자 생성

Amazon ECS 관리형 인스턴스를 사용하여 태스크를 실행하려면 먼저 인프라 구성을 정의하는 용량 공급자를 생성해야 합니다. 용량 공급자에서는 관리형 인스턴스에 대한 IAM 역할, 네트워크 구성 및 기타 설정을 지정합니다.

용량 공급자 구성으로 JSON 파일을 생성합니다. 자리 표시자 값을 실제 리소스 식별자로 바꿉니다.

{ "name": "managed-instances-cp", "cluster": "managed-instances-cluster", "managedInstancesProvider": { "infrastructureRoleArn": "arn:aws:iam::aws_account_id:role/ecsInfrastructureRole", "instanceLaunchTemplate": { "ec2InstanceProfileArn": "arn:aws:iam::aws_account_id:instance-profile/ecsInstanceRole", "networkConfiguration": { "subnets": [ "subnet-abcdef01234567890", "subnet-1234567890abcdef0" ], "securityGroups": [ "sg-0123456789abcdef0" ] }, "storageConfiguration": { "storageSizeGiB": 100 }, "monitoring": "basic" } } }

이 구성을 managed-instances-cp.json으로 저장하고 용량 공급자를 생성합니다.

aws ecs create-capacity-provider --cli-input-json file://managed-instances-cp.json

명령은 생성이 완료된 후 용량 공급자에 대한 설명을 반환합니다.

3단계: 클러스터의 기본 용량 공급자 전략 구성

Amazon ECS 관리형 인스턴스 용량 공급자를 기본 용량 공급자 전략으로 사용하도록 클러스터를 업데이트합니다. 그러면 태스크 및 서비스에서 용량 공급자를 명시적으로 지정하지 않고 Amazon ECS 관리형 인스턴스를 자동으로 사용할 수 있습니다.

클러스터 용량 공급자 구성으로 JSON 파일을 생성합니다.

{ "cluster": "managed-instances-cluster", "capacityProviders": [ "managed-instances-cp" ], "defaultCapacityProviderStrategy": [ { "capacityProvider": "managed-instances-cp", "weight": 1 } ] }

이 구성 파일을 cluster-cp-strategy.json로 저장하고 클러스터를 업데이트합니다.

aws ecs put-cluster-capacity-providers --cli-input-json file://cluster-cp-strategy.json

4단계: Linux 태스크 정의 등록

클러스터에서 태스크를 실행하려면 먼저 태스크 정의를 등록해야 합니다. 태스크 정의는 그룹화된 컨테이너의 목록입니다. 다음 예제는 Docker Hub에서 호스팅되는 httpd 컨테이너 이미지를 사용하여 PHP 웹 앱을 생성하는 간단한 작업 정의입니다. 사용 가능한 태스크 정의 파라미터에 대한 자세한 정보는 Fargate에 대한 Amazon ECS 태스크 정의 파라미터 섹션을 참조하세요.

{ "family": "sample-managed-instances", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "managed-instances-app", "image": "public.ecr.aws/docker/library/httpd:latest", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html><head><title>Amazon ECS Sample App</title><style>body {margin-top: 40px; background-color: #333;} </style></head><body><div style=color:white;text-align:center><h1>Amazon ECS Sample App</h1><h2>Congratulations!</h2><p>Your application is now running on a container in Amazon ECS using Amazon ECS Managed Instances.</p></div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], "requiresCompatibilities": [ "MANAGED_INSTANCES" ], "cpu": "256", "memory": "512" }

작업 정의 JSON을 파일로 저장하고 --cli-input-json file://path_to_file.json 옵션을 사용하여 전달합니다.

컨테이너 정의에 JSON 파일을 사용하려면

aws ecs register-task-definition --cli-input-json file://$HOME/tasks/managed-instances-task.json

register-task-definition 명령은 등록을 완료한 후 작업 정의의 설명을 반환합니다.

5단계: 태스크 정의 나열

언제라도 list-task-definitions 명령을 사용하여 계정의 작업 정의를 나열할 수 있습니다. 이 명령은 family 또는 revision를 호출할 때 함께 사용할 수 있는 run-taskstart-task 값을 출력합니다.

aws ecs list-task-definitions

출력:

{ "taskDefinitionArns": [ "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1" ] }

6단계: 서비스 생성

계정에 대한 작업을 등록한 후 클러스터에서 등록된 작업에 대해 서비스를 생성할 수 있습니다. 이 예제에서는 클러스터에서 실행 중인 sample-managed-instances:1 작업 정의 인스턴스 하나를 사용하여 서비스를 생성합니다. 이 작업에는 인터넷 경로가 필요하므로 이 작업을 수행할 수 있는 두 가지 방법이 있습니다. 한 가지 방법은 퍼블릭 서브넷에서 탄력적 IP 주소가 있는 NAT 게이트웨이로 구성된 프라이빗 서브넷을 사용하는 것입니다. 또 다른 방법은 퍼블릭 서브넷을 사용하고 작업에 퍼블릭 IP 주소를 할당하는 것입니다. 아래 두 가지 예를 모두 제공합니다.

프라이빗 서브넷을 사용하는 예제.

aws ecs create-service --cluster managed-instances-cluster --service-name managed-instances-service --task-definition sample-managed-instances:1 --desired-count 1 --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234]}"

퍼블릭 서브넷을 사용하는 예제.

aws ecs create-service --cluster managed-instances-cluster --service-name managed-instances-service --task-definition sample-managed-instances:1 --desired-count 1 --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234],assignPublicIp=ENABLED}"

create-service 명령은 생성을 완료한 후 서비스의 설명을 반환합니다.

7단계: 서비스 나열

클러스터의 서비스를 나열합니다. 이전 섹션에서 생성한 서비스가 보일 것입니다. 이 명령에서 반환된 서비스 이름 또는 전체 ARN을 기록해 두었다가 나중에 서비스를 설명하는 데 사용할 수 있습니다.

aws ecs list-services --cluster managed-instances-cluster

출력:

{ "serviceArns": [ "arn:aws:ecs:region:aws_account_id:service/managed-instances-cluster/managed-instances-service" ] }

8단계: 실행 서비스 설명

앞서 검색한 서비스 이름으로 서비스를 설명하여 작업에 관한 정보를 더 많이 가져옵니다.

aws ecs describe-services --cluster managed-instances-cluster --services managed-instances-service

성공하면 서비스 실패 및 서비스에 대한 설명이 반환됩니다. 예를 들어 services 섹션에서 실행 중이거나 보류 중인 작업 상태와 같이 배포에 대한 정보를 찾을 수 있습니다. 작업 정의, 네트워크 구성 및 타임스탬프가 지정된 이벤트에 대한 정보도 찾을 수 있습니다. 실패 섹션에서는 호출과 관련된 실패(있는 경우)에 대한 정보를 찾을 수 있습니다.

출력에서는 서비스가 Amazon ECS 관리형 인스턴스 용량 공급자를 사용하고 있음을 보여줍니다.

{ "services": [ { "capacityProviderStrategy": [ { "capacityProvider": "managed-instances-cp", "weight": 1, "base": 0 } ], "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-abcd1234" ], "securityGroups": [ "sg-abcd1234" ], "assignPublicIp": "ENABLED" } }, "enableECSManagedTags": false, "loadBalancers": [], "deploymentController": { "type": "ECS" }, "desiredCount": 1, "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/managed-instances-cluster", "serviceArn": "arn:aws:ecs:region:aws_account_id:service/managed-instances-service", "serviceName": "managed-instances-service", "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1" } ], "failures": [] }

9단계: 테스트

배포를 테스트하려면 태스크를 실행하는 관리형 인스턴스의 퍼블릭 IP 주소를 찾아야 합니다.

퍼블릭 서브넷을 사용하여 배포된 작업 테스트

먼저 서비스에서 태스크 ARN을 가져옵니다.

aws ecs list-tasks --cluster managed-instances-cluster --service managed-instances-service

출력에는 태스크 ARN이 포함됩니다.

{ "taskArns": [ "arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE" ] }

컨테이너 인스턴스 ARN을 가져오기 위해 태스크를 설명합니다. tasks 파라미터에 대해 태스크 ARN을 사용합니다.

aws ecs describe-tasks --cluster managed-instances-cluster --tasks arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE

출력은 태스크가 Amazon ECS 관리형 인스턴스에서 실행되고 있음을 보여주며 컨테이너 인스턴스 ARN을 포함합니다.

{ "tasks": [ { "launchType": "MANAGED_INSTANCES", "capacityProviderName": "managed-instances-cp", "containerInstanceArn": "arn:aws:ecs:region:aws_account_id:container-instance/managed-instances-cluster/CONTAINER_INSTANCE_ID", "taskArn": "arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE", "taskDefinitionArn": "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1" } ] }

EC2 인스턴스 ID를 가져오기 위해 컨테이너 인스턴스를 설명합니다.

aws ecs describe-container-instances --cluster managed-instances-cluster --container-instances CONTAINER_INSTANCE_ID

출력에는 EC2 인스턴스 ID가 포함됩니다.

{ "containerInstances": [ { "ec2InstanceId": "i-1234567890abcdef0", "capacityProviderName": "managed-instances-cp", "containerInstanceArn": "arn:aws:ecs:region:aws_account_id:container-instance/managed-instances-cluster/CONTAINER_INSTANCE_ID" } ] }

퍼블릭 IP 주소를 가져오기 위해 EC2를 설명합니다.

aws ec2 describe-instances --instance-ids i-1234567890abcdef0

퍼블릭 IP 주소가 출력에 있습니다.

{ "Reservations": [ { "Instances": [ { "PublicIpAddress": "198.51.100.2", "InstanceId": "i-1234567890abcdef0" } ] } ] }

웹 브라우저에 퍼블릭 IP 주소를 입력하면 Amazon ECS 관리형 인스턴스에서 실행 중인 Amazon ECS 샘플 애플리케이션을 표시하는 웹 페이지가 보여야 합니다.

프라이빗 서브넷을 사용하여 배포된 작업 테스트

프라이빗 서브넷에 배포된 태스크의 경우 Amazon ECS Exec을 사용하여 컨테이너에 연결하고 해당 인스턴스 내에서 배포를 테스트할 수 있습니다. 위와 동일한 단계에 따라 태스크 ARN을 가져온 다음 ECS Exec를 사용합니다.

aws ecs execute-command --cluster managed-instances-cluster \ --task arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE \ --container managed-instances-app \ --interactive \ --command "/bin/sh"

대화형 쉘이 실행된 후 웹 서버를 테스트할 수 있습니다.

curl localhost

Amazon ECS 샘플 애플리케이션 웹 페이지에 해당하는 HTML이 표시됩니다.

10단계: 정리

이 자습서로 완료를 한 후에 사용하지 않는 리소스에 대해 요금이 발생하는 것을 방지하기 위해 연결된 리소스를 정리해야 합니다.

서비스를 삭제합니다.

aws ecs delete-service --cluster managed-instances-cluster --service managed-instances-service --force

서비스가 삭제되고 모든 태스크가 중지될 때까지 기다린 다음 용량 공급자를 삭제합니다.

aws ecs delete-capacity-provider --capacity-provider managed-instances-cp

클러스터를 삭제하십시오.

aws ecs delete-cluster --cluster managed-instances-cluster
참고

용량 공급자가 삭제되면 관리형 인스턴스가 자동으로 종료됩니다. EC2 인스턴스를 수동으로 종료하지 않아도 됩니다.