AWS CLI를 사용하여 Fargate 시작 유형에 대한 Amazon ECS Linux 작업 생성
다음 단계는 AWS CLI를 사용하여 Amazon ECS에서 클러스터를 설정하고, 태스크 정의를 등록하고, Linux 태스크를 실행하고, 기타 일반적인 시나리오를 수행하는 데 도움이 됩니다. AWS CLI의 최신 버전을 사용합니다. 최신 버전으로 업그레이드하는 방법에 대한 자세한 내용은 AWS CLI 최신 버전 설치 또는 업데이트를 참조하세요.
주제
사전 조건
이 자습서에서는 다음 사전 조건이 충족되었다고 가정합니다.
-
최신 버전의 AWS CLI가 설치 및 구성됩니다. AWS CLI 설치 또는 업그레이드에 대한 자세한 내용은 AWS CLI 최신 버전 설치 또는 업데이트를 참고하세요.
-
Amazon ECS 사용 설정의 단계가 완료되었습니다.
-
AWS 사용자는 AmazonECS_FullAccess IAM 정책 예제에 지정된 필수 권한을 가집니다.
-
사용할 VPC 및 보안 그룹이 생성되었습니다. 이 자습서에서는 Amazon ECR Public에서 호스팅되는 컨테이너 이미지를 사용하므로 태스크에서 인터넷에 액세스할 수 있어야 합니다. 작업에 인터넷 경로를 제공하려면 다음 옵션 중 하나를 사용합니다.
-
탄력적 IP 주소가 있는 NAT 게이트웨이와 함께 프라이빗 서브넷을 사용합니다.
-
퍼블릭 서브넷을 사용하고 퍼블릭 IP 주소를 작업에 할당합니다.
자세한 내용은 Virtual Private Cloud 생성 단원을 참조하십시오.
보안 그룹 및 규칙에 대한 자세한 내용은 Amazon Virtual Private Cloud 사용 설명서의 VPC에 대한 기본 보안 그룹과 규칙 예를 참조하세요.
-
-
프라이빗 서브넷을 사용하여 이 자습서를 따르면 Amazon ECS Exec을 사용하여 컨테이너와 직접 상호 작용하고 배포를 테스트할 수 있습니다. ECS Exec을 사용하려면 작업 IAM 역할을 생성해야 합니다. 태스크 IAM 역할 및 기타 사전 조건에 대한 자세한 내용은 Amazon ECS Exec을 사용하여 Amazon ECS 컨테이너 모니터링을 참조하세요.
-
(선택 사항) AWS CloudShell은 고객에게 자체 EC2 인스턴스를 생성할 필요 없이 명령줄을 제공하는 도구입니다. 자세한 내용은 AWS CloudShell 사용 설명서의 AWS CloudShell이란 무엇입니까? 섹션을 참조하십시오.
1단계: 클러스터 생성
계정에는 기본적으로 default
클러스터가 할당됩니다.
참고
제공된 default
클러스터를 사용하는 이점은 후속 명령에서 --cluster
옵션을 지정할 필요가 없다는 것입니다. 기본 클러스터가 아닌 자체 클러스터를 생성하는 경우, 해당 클러스터에 사용할 각 명령에 cluster_name
--cluster
을 지정해야 합니다.cluster_name
다음 명령을 사용하여 고유한 이름의 자체 클러스터를 생성합니다.
aws ecs create-cluster --cluster-name
fargate-cluster
출력:
{
"cluster": {
"status": "ACTIVE",
"defaultCapacityProviderStrategy": [],
"statistics": [],
"capacityProviders": [],
"tags": [],
"clusterName": "fargate-cluster",
"settings": [
{
"name": "containerInsights",
"value": "disabled"
}
],
"registeredContainerInstancesCount": 0,
"pendingTasksCount": 0,
"runningTasksCount": 0,
"activeServicesCount": 0,
"clusterArn": "arn:aws:ecs:region
:aws_account_id
:cluster/fargate-cluster
"
}
}
2단계: Linux 태스크 정의 등록
ECS 클러스터에서 작업을 실행하려면 먼저 작업 정의를 등록해야 합니다. 태스크 정의는 그룹화된 컨테이너의 목록입니다. 다음 예제는 Docker Hub에서 호스팅되는 httpd 컨테이너 이미지를 사용하여 PHP 웹 앱을 생성하는 간단한 작업 정의입니다. 사용 가능한 태스크 정의 파라미터에 대한 자세한 정보는 Amazon ECS 작업 정의 섹션을 참조하세요. 이 자습서에서 taskRoleArn
는 프라이빗 서브넷에 작업을 배포하고 배포를 테스트하려는 경우에만 필요합니다. taskRoleArn
을 사전 조건에 설명한 대로 ECS Exec을 사용하기 위해 생성한 IAM 작업 역할로 바꿉니다.
{ "family": "sample-fargate", "networkMode": "awsvpc",
"taskRoleArn": "arn:aws:iam::aws_account_id:role/execCommandRole",
"containerDefinitions": [ { "name": "fargate-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.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], "requiresCompatibilities": [ "FARGATE" ], "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/fargate-task.json
register-task-definition 명령은 등록을 완료한 후 작업 정의의 설명을 반환합니다.
3단계: 작업 정의 나열
언제라도 list-task-definitions 명령을 사용하여 계정의 작업 정의를 나열할 수 있습니다. 이 명령은 run-task 또는 start-task를 호출할 때 함께 사용할 수 있는 family
및 revision
값을 출력합니다.
aws ecs list-task-definitions
출력:
{
"taskDefinitionArns": [
"arn:aws:ecs:region
:aws_account_id
:task-definition/sample-fargate:1"
]
}
4단계: 서비스 생성
계정에 대한 작업을 등록한 후 클러스터에서 등록된 작업에 대해 서비스를 생성할 수 있습니다. 이 예제에서는 클러스터에서 실행 중인 sample-fargate:1
작업 정의 인스턴스 하나를 사용하여 서비스를 생성합니다. 이 작업에는 인터넷 경로가 필요하므로 이 작업을 수행할 수 있는 두 가지 방법이 있습니다. 한 가지 방법은 퍼블릭 서브넷에서 탄력적 IP 주소가 있는 NAT 게이트웨이로 구성된 프라이빗 서브넷을 사용하는 것입니다. 또 다른 방법은 퍼블릭 서브넷을 사용하고 작업에 퍼블릭 IP 주소를 할당하는 것입니다. 아래 두 가지 예를 모두 제공합니다.
프라이빗 서브넷을 사용하는 예. Amazon ECS Exec을 사용하려면 이 enable-execute-command
옵션이 필요합니다.
aws ecs create-service --cluster
fargate-cluster
--service-namefargate-service
--task-definitionsample-fargate:1
--desired-count1
--launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234
],securityGroups=[sg-abcd1234
]}" --enable-execute-command
퍼블릭 서브넷을 사용하는 예.
aws ecs create-service --cluster
fargate-cluster
--service-namefargate-service
--task-definitionsample-fargate:1
--desired-count1
--launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234
],securityGroups=[sg-abcd1234
],assignPublicIp=ENABLED
}"
create-service 명령은 등록을 완료한 후 작업 정의의 설명을 반환합니다.
5단계: 서비스 나열
클러스터의 서비스를 나열합니다. 이전 섹션에서 생성한 서비스가 보일 것입니다. 이 명령에서 반환된 서비스 이름 또는 전체 ARN을 기록해 두었다가 나중에 서비스를 설명하는 데 사용할 수 있습니다.
aws ecs list-services --cluster
fargate-cluster
출력:
{
"serviceArns": [
"arn:aws:ecs:region
:aws_account_id
:service/fargate-cluster/fargate-service"
]
}
6단계: 실행 서비스 설명
앞서 검색한 서비스 이름으로 서비스를 설명하여 작업에 관한 정보를 더 많이 가져옵니다.
aws ecs describe-services --cluster
fargate-cluster
--servicesfargate-service
성공하면 서비스 실패 및 서비스에 대한 설명이 반환됩니다. 예를 들어 services
섹션에서 실행 중이거나 보류 중인 작업 상태와 같이 배포에 대한 정보를 찾을 수 있습니다. 작업 정의, 네트워크 구성 및 타임스탬프가 지정된 이벤트에 대한 정보도 찾을 수 있습니다. 실패 섹션에서는 호출과 관련된 실패(있는 경우)에 대한 정보를 찾을 수 있습니다. 문제 해결에 대한 자세한 정보는 서비스 이벤트 메시지를 참조하세요. 서비스 설명에 대한 자세한 정보는 서비스 설명을 참조하세요.
{ "services": [ { "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "
subnet-abcd1234
" ], "securityGroups": [ "sg-abcd1234
" ], "assignPublicIp": "ENABLED" } }, "launchType": "FARGATE", "enableECSManagedTags": false, "loadBalancers": [], "deploymentController": { "type": "ECS" }, "desiredCount": 1, "clusterArn": "arn:aws:ecs:region
:aws_account_id
:cluster/fargate-cluster", "serviceArn": "arn:aws:ecs:region
:aws_account_id
:service/fargate-service", "deploymentConfiguration": { "maximumPercent": 200, "minimumHealthyPercent": 100 }, "createdAt": 1692283199.771, "schedulingStrategy": "REPLICA", "placementConstraints": [], "deployments": [ { "status": "PRIMARY", "networkConfiguration": { "awsvpcConfiguration": { "subnets": [ "subnet-abcd1234
" ], "securityGroups": [ "sg-abcd1234
" ], "assignPublicIp": "ENABLED" } }, "pendingCount": 0, "launchType": "FARGATE", "createdAt": 1692283199.771, "desiredCount": 1, "taskDefinition": "arn:aws:ecs:region
:aws_account_id
:task-definition/sample-fargate:1", "updatedAt": 1692283199.771, "platformVersion": "1.4.0", "id": "ecs-svc/9223370526043414679", "runningCount": 0 } ], "serviceName": "fargate-service", "events": [ { "message": "(service fargate-service) has started 2 tasks: (task 53c0de40-ea3b-489f-a352-623bf1235f08) (task d0aec985-901b-488f-9fb4-61b991b332a3).", "id": "92b8443e-67fb-4886-880c-07e73383ea83", "createdAt": 1510811841.408 }, { "message": "(service fargate-service) has started 2 tasks: (task b4911bee-7203-4113-99d4-e89ba457c626) (task cc5853e3-6e2d-4678-8312-74f8a7d76474).", "id": "d85c6ec6-a693-43b3-904a-a997e1fc844d", "createdAt": 1510811601.938 }, { "message": "(service fargate-service) has started 2 tasks: (task cba86182-52bf-42d7-9df8-b744699e6cfc) (task f4c1ad74-a5c6-4620-90cf-2aff118df5fc).", "id": "095703e1-0ca3-4379-a7c8-c0f1b8b95ace", "createdAt": 1510811364.691 } ], "runningCount": 0, "status": "ACTIVE", "serviceRegistries": [], "pendingCount": 0, "createdBy": "arn:aws:iam::aws_account_id
:user/user_name
", "platformVersion": "LATEST", "placementStrategy": [], "propagateTags": "NONE", "roleArn": "arn:aws:iam::aws_account_id
:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS", "taskDefinition": "arn:aws:ecs:region
:aws_account_id
:task-definition/sample-fargate:1" } ], "failures": [] }
7단계: 테스트
퍼블릭 서브넷을 사용하여 배포된 작업 테스트
태스크에 대한 탄력적 네트워크 인터페이스(ENI)를 가져올 수 있도록 서비스의 태스크를 설명합니다.
먼저 태스크 ARN을 가져오세요.
aws ecs list-tasks --cluster
fargate-cluster
--servicefargate-service
출력에는 태스크 ARN이 포함됩니다.
{
"taskArns": [
"arn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE
]
}
태스크를 설명하고 ENI ID를 찾습니다. tasks
파라미터에 태스크 ARN을 사용합니다.
aws ecs describe-tasks --cluster
fargate-cluster
--tasksarn:aws:ecs:us-east-1:123456789012:task/service/EXAMPLE
연결 정보가 출력에 나열됩니다.
{
"tasks": [
{
"attachments": [
{
"id": "d9e7735a-16aa-4128-bc7a-b2d5115029e9",
"type": "ElasticNetworkInterface",
"status": "ATTACHED",
"details": [
{
"name": "subnetId",
"value": "subnetabcd1234"
},
{
"name": "networkInterfaceId",
"value": "eni-0fa40520aeEXAMPLE"
},
]
}
…
}
퍼블릭 IP 주소를 가져오기 위해 ENI를 설명합니다.
aws ec2 describe-network-interfaces --network-interface-id
eni-0fa40520aeEXAMPLE
퍼블릭 IP 주소가 출력에 있습니다.
{
"NetworkInterfaces": [
{
"Association": {
"IpOwnerId": "amazon",
"PublicDnsName": "ec2-34-229-42-222.compute-1.amazonaws.com",
"PublicIp": "198.51.100.2"
},
…
}
웹 브라우저에 퍼블릭 IP 주소를 입력하면 Amazon ECS 샘플 애플리케이션이 표시되는 웹 페이지가 보여야 합니다.
프라이빗 서브넷을 사용하여 배포된 작업 테스트
작업을 설명하고 ExecuteCommandAgent
가 실행 중인지 확인하기 위해 managedAgents
를 찾습니다. 나중에 사용할 수 있도록 privateIPv4Address
를 기록해 둡니다.
aws ecs describe-tasks --cluster
fargate-cluster
--tasksarn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE
관리형 에이전트 정보가 출력에 나열됩니다.
{
"tasks": [
{
"attachments": [
{
"id": "d9e7735a-16aa-4128-bc7a-b2d5115029e9",
"type": "ElasticNetworkInterface",
"status": "ATTACHED",
"details": [
{
"name": "subnetId",
"value": "subnetabcd1234"
},
{
"name": "networkInterfaceId",
"value": "eni-0fa40520aeEXAMPLE"
},
{
"name": "privateIPv4Address",
"value": "10.0.143.156
"
}
]
}
],
...
"containers": [
{
...
"managedAgents": [
{
"lastStartedAt": "2023-08-01T16:10:13.002000+00:00",
"name": "ExecuteCommandAgent",
"lastStatus": "RUNNING"
}
],
...
}
ExecuteCommandAgent
가 실행 중인지 확인한 후 다음 명령을 실행하여 작업의 컨테이너에서 대화형 셸을 실행할 수 있습니다.
aws ecs execute-command --cluster
fargate-cluster
\ --taskarn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE
\ --containerfargate-app
\ --interactive \ --command "/bin/sh"
대화형 셸을 실행한 후 다음 명령을 실행하여 cURL을 설치합니다.
apt update
apt install curl
cURL을 설치한 후 이전에 얻은 프라이빗 IP 주소를 사용하여 다음 명령을 실행합니다.
curl
10.0.143.156
Amazon ECS 샘플 애플리케이션 웹 페이지에 해당하는 HTML이 표시됩니다.
<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.</p>
</div>
</body>
</html>
8단계: 정리
이 자습서로 완료를 한 후에 사용하지 않는 리소스에 대해 요금이 발생하는 것을 방지하기 위해 연결된 리소스를 정리해야 합니다.
서비스를 삭제합니다.
aws ecs delete-service --cluster
fargate-cluster
--servicefargate-service
--force
클러스터를 삭제합니다.
aws ecs delete-cluster --cluster
fargate-cluster