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 이름. 필수 OnetworkMode
: 작업의 컨테이너에 사용할 도커 네트워킹 모드.awsvpc
로 설정. 필수 XcontainerDefinitions
: 컨테이너 정의name
: 컨테이너 이름. 필수 Oimage
: 컨테이너를 시작하는 데 사용되는 이미지. 필수 O.
ex ) repository-url/image:tagportMappings
: 컨테이너가 호스트 컨테이너 인스턴스의 포트에 액세스하여 트래픽을 송수신하도록 허용.awsvpc
네트워크 모드를 사용하는 작업 정의의 경우containerPort
만 지정.hostPort
는 빈 칸으로 둘 수 있음. 아니면containerPort
와 같은 값 이어야 함.containerPort
:portMappings
사용 시 필수 O. 사용자 지정 또는 자동 할당된 호스트 포트에 바인딩되는 컨테이너 포트 번호. Fargate 시작 유형으로 작업의 컨테이너를 사용하는 경우containerPort
를 사용해 외부로 노출된 포트를 지정.hostPort
: 컨테이너용으로 예약할 컨테이너 인스턴스 포트 번호. 필수 X. Fargate 시작 유형으로 작업에서 컨테이너를 사용하는 경우hostPort
는 빈 칸 또는containerPort
와 같은 값으로 지정.protocol
: 포트 매핑에 사용되는 프로토콜. 유효 값은tcp
및udp
default 는tcp
필수 Xessential
: Boolean. 필수 X. true 의 경우 해당 컨테이너가 어떤 이유로든 실패 또는 중지하는 경우 작업의 일부인 다른 모든 컨테이너도 중지. 생략시 trueentryPoint
: 컨테이너로 전달되는 진입점. 필수 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 생성 및 권한 부여
- ( 참고 링크 : https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)
- json 파일 생성
{
"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_이름'