AWS CLI 로 Fargate cluster 생성

Max
8 min readNov 16, 2021

--

AWS Console 의 GUI 가 아닌 aws cli 사용

Cluster 생성

$ aws ecs create-cluster --cluster-name 'cluster 이름'
  • cluster template 은 default 로 Networking 전용으로 생성됨

Task Definition json file 생성

  • ( 참고 링크: https://docs.aws.amazon.com/ko_kr/ko_kr/AmazonECS/latest/userguide/task_definition_parameters.html)
{
"family": "sample-fargate",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "fargate-app",
"image": "httpd:2.4",
"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"
}
  • familiy : task definition 이름. 필수 O
  • networkMode : 작업의 컨테이너에 사용할 도커 네트워킹 모드. awsvpc 로 설정. 필수 X
  • containerDefinitions : 컨테이너 정의
  • name : 컨테이너 이름. 필수 O
  • image : 컨테이너를 시작하는 데 사용되는 이미지. 필수 O.
    ex ) repository-url/image:tag
  • portMappings : 컨테이너가 호스트 컨테이너 인스턴스의 포트에 액세스하여 트래픽을 송수신하도록 허용.
    awsvpc 네트워크 모드를 사용하는 작업 정의의 경우 containerPort만 지정. hostPort는 빈 칸으로 둘 수 있음. 아니면 containerPort와 같은 값 이어야 함.
  • containerPort : portMappings 사용 시 필수 O. 사용자 지정 또는 자동 할당된 호스트 포트에 바인딩되는 컨테이너 포트 번호. Fargate 시작 유형으로 작업의 컨테이너를 사용하는 경우 containerPort를 사용해 외부로 노출된 포트를 지정.
  • hostPort : 컨테이너용으로 예약할 컨테이너 인스턴스 포트 번호. 필수 X. Fargate 시작 유형으로 작업에서 컨테이너를 사용하는 경우 hostPort는 빈 칸 또는containerPort와 같은 값으로 지정.
  • protocol : 포트 매핑에 사용되는 프로토콜. 유효 값은 tcpudp default 는 tcp 필수 X
  • essential : Boolean. 필수 X. true 의 경우 해당 컨테이너가 어떤 이유로든 실패 또는 중지하는 경우 작업의 일부인 다른 모든 컨테이너도 중지. 생략시 true
  • entryPoint : 컨테이너로 전달되는 진입점. 필수 X.
  • command : 컨테이너로 전달되는 명령. 필수 X. Dockerfile CMD 로 대체 가능.
  • requiresCompatibilities : 시작 유형 지정. EC2 | FARGATE | EXTERNAL
  • cpu : 작업에 대해 표시되는 CPU 단위의 하드 제한. 256(.25vCPU). FARGATE 선택시 필수 O.
  • memory : 작업에 표시할 메모리의 하드 제한(MiB). 512(0.5GB). FARGATE 선택시 필수 O.
  • healthCheck, dependsOn, startTimeout 등 기타 옵션 확인 필요

Task Register

$ aws ecs register-task-definition --cli-input-json file://'파일위치'
  • 권한 관련 에러 발생
An error occurred (ClientException) when calling the RegisterTaskDefinition operation: Fargate requires task definition to have execution role ARN to support ECR images.
  • Fargate 에서 ECR image 에 접근하기 위한 권한이 필요

IAM Role 생성 및 권한 부여

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
  • iam role 생성
$ aws iam create-role --role-name 'Role_이름' --assume-role-policy-document file://'파일경로'
  • role 생성 확인
$ aws iam get-role --role-name 'Role_이름'
  • 현재 user 에 생성한 role attach
$ aws iam attach-role-policy --role-name 'Role_이름' --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
  • Task definition json 파일에 executionRoleArn 파라미터 추가
...
"executionRoleArn" : "Role_이름"
...

Task register

$ aws ecs register-task-definition --cli-input-json file://'파일위치'
  • Task Definition List
$ aws ecs list-task-definitions

Create a Service

  • Task execution 을 위해 service 생성 필요
  • subnet id 조회
$ aws ec2 describe-subnets
  • security group id 조회
$ aws ec2 describe-security-groups --group-name '보안그룹이름'
  • create service
$ aws ecs create-service --cluster 'cluster_이름' --service-name 'service_이름' --task-definition 'task_이름:1' --desired-count 1 --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=['subnet_id'], securityGroups=['보안그룹_id'], assignPublicIp=ENABLED}"
  • 생성 확인
$ aws ecs describe-services --cluster 'cluster_이름' --services 'service_이름'
  • detele service
$ aws ecs delete-service --cluster 'cluster_이름' --service 'service_이름' --force
  • delete cluster
$ aws ecs delete-cluster --cluster 'cluster_이름'
  • delete image
$ aws ecr batch-delete-image --repository-name 'repository_이름' --image-ids imageTag=latest
  • delete repository
$ aws ecr delete-repository --repository 'repository_이름'

--

--