우선 기존에 했던 것 처럼 EC2인스턴스를 하나 만들고 Django-Deploy를 깔고 ECR에 django image를 저장하는 과정을 스피디하게 짚고 넘어가도록 하겠습니다.
우선 django image의 빌드는 끝났다고 가정해 봅시다. 여기서의 핵심은 aws cli이니까요
$sudo apt-get install awscli
$aws configure
$aws ecr get-login --no-include-email --region ap-northeast-2
$docker login -u AWS -p eyJwYXlsb2FkIjoieGdYOVNwM2pNcWxDL3FBdkdhVXBVTVN3akd5UzVYam5Xb0Y0ZlYxWFNwbC9IU0ZwYUUxK2dSMnNUajUwb3EzOFlRcHYxMW9NMGtJckZkOFdmbXZsTzZZSmtMakJNNFZmWm5HbUx6L0xSb0JCQXhXT2VmM3dZMC9nUWpXRnp6RmxaWmgvODNKd1dUdkQrejN2R2ZHQUJ5c1ZxMVlVdXQ4VnluWUdpUC9Mb3c4b2pmZHVKc0kvR0pSdVd3bi9KNmxJSFlnSDBpcmFpcE1HcVlwYk4rbWNjR3JYRWRsa3N5UE5qQ2hmd2JpbGtVaC94NEV3Tkg0c0YrNTN2dlN4QU1aeHBKZVRRZ2xBbzU3c0VhdTYzaWo5bzdoMm5VaGlHTFR5OWdRWlcvQ0RjVHBmd1ZobXUrem9TZm5RMlRWcmVWeGZwQ0hVV2NYZHpRWngvNzk2emlTQk5rVW9ETkpuQzZDNGVkekJKTHNFMjRlV1ltTWV1R1pwQ3BCMHc1V1NBQkxqU3JUcHFkUTFMRVZ1VFpZOUd5Y2NrSFN6K1JjNlVlOXNyRWlKdkZHWlhMMjJCanE3Q0NQbE1LM2hpelFGdEx3ZDVBSnkzMTZacVEyRDlqSzVOUmJUbXlxZHMwWVBsNDJpUTdjQk16cEVIYnkzMHlmbkwvMWU1aWRyNEpaaU96M1pkY056RGJ1UXVQb3dpU2dQd2lTTXgzdy8zV0g4bitGVm5TU1lYUndULytvTFRGamt0WkJFV0NySWRKT0J4SUJ2d3lOK2pzUy9zcmtDOVNhT25tTjRDSHYrcEl4L2VKVjdqS3lCdlptK0JZd0ZXRmUvNk1PdmxJUTE3enMwQXV4RktOSmlBZExvVHJJVy9qbk8ySU05QlQ5QnNvRmM2Zjh4b1Q5NlhHNlJzd201c0lkaXorNm5EWU9HT3RzVDg3aXVuRkM2M1B0eEhVMXNWNWNJd0duMDIzVUkvNHlxekZlSnhmdGFtcWx4eng0b3dhUUpBNDFBdy9aM2d2Y05jYndYajJoR0lkOXBOY3hDUzZwOGRlWjkvSmI0VktkYnF2ZzJqU2JEeEhhM2tVdnBQcCtmcVFjZkt1UWs3OWtQTUc0Tk5qN1MraTdtOHkrbjNuenh3eGFOblpjT21CdlNpTFM1RllrTDFzZ1phS2E2Y0tDdVBWczEyVDVIQnkvZG01amtnOU9oMjdrZlJXQVhKTkU4M2FlTHZwOWp4aEdUdUNiQlBTLzRFZ0ZybFE3UzhDL3UxNjl6anQxeVB0eFFSVTZkejRvVDBFWC9pSnVVTUNlTUt0b2dsWWhSNVJXdmhXdlRIb0NIbmMzR3JHaFc5NGo2SlorQ3JBTml6dU8ySWF4aXVJdnhiVUhrZHJZZGJpeHVwcXhGSWJEL243VnNtbldnVENqSFZ1aTVLTTE1QkgxV3lPWmw3YTg9IiwiZGF0YWtleSI6IkFRSUJBSGhBT3NhVzJnWk4wOVdOdE5Ha1ljOHFwMTF4U2haL2RyRUVveTFIazhMWFdnRW1KT3h6Q3Ruai9SZC9DRnV0c3Fqa0FBQUFmakI4QmdrcWhraUc5dzBCQndhZ2J6QnRBZ0VBTUdnR0NTcUdTSWIzRFFFSEFUQWVCZ2xnaGtnQlpRTUVBUzR3RVFRTWFvZ3hwQjNvekpSaTcvZlZBZ0VRZ0R2TERUeUhkWVFLV256YStjTDZrWmJsbFFSb3ZXMThUdFh1dU1NYmliZSsrMFhsemVrY1Z2UWRFRG5jYTZUZnhBNElvMHdBYmlNL3hWNXVVZz09IiwidmVyc2lvbiI6IjIiLCJ0eXBlIjoiREFUQV9LRVkiLCJleHBpcmF0aW9uIjoxNjU3MDc4NjMxfQ== https://154309361967.dkr.ecr.ap-northeast-2.amazonaws.com
$aws ecr create-repository --repository-name hello-cli --region ap-northeast-2
$docker tag server_dev/django 154309361967.dkr.ecr.ap-northeast-2.amazonaws.com/hello-cli
$docker push 154309361967.dkr.ecr.ap-northeast-2.amazonaws.com/hello-cli
간단히 위 작업들을 해주면 만든 ECR에 이미지가 배포됩니다.
클러스터 작업 정의
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_AWSCLI_Fargate.html
공식문서에 있는 AWS CLI를 이용하여 Fargate의 task를 정의하는 방법을 위에서 부터 아래로 쭉 따라읽어 보겠습니다.
우선 그 전에 명령어를 치기 위해서는 aws configure에서 지역명과 default output type을 지정해 주어야 합니다.
$aws ecs create-cluster --cluster-name fargate-cluster
우선 이를 통해 클러스터를 만들어 줍니다.
클러스터를 생성했다면 이제 작업 정의를 해줄 때입니다. 작업 정의를 하기 위해서는 많은 매개변수를 json파일로 주입해 주어야 합니다.
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
위 공식 문서에 매개변수의 의미에 대해 알 수 있습니다. 기본적으로 아래와 같은 json파일을 공식문서에서 줍니다.
/task1.json
{
"family": "sample-fargate",
"networkMode": "awsvpc",
"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"
}
이렇게 하고 아래 명령어를 쳐줍니다.
# 공식문서
$aws ecs register-task-definition --cli-input-json file://$HOME/tasks/fargate-task.json
# 내 환경
aws ecs register-task-definition --cli-input-json file://./task1.json
다음과 같이 sample-fargate-1이라는 태스크가 정의됩니다. 하지만 이는 저희가 원하는 태스크가 아닙니다. 다시 만들어 보겠습니다. \
/task2.json
{
"family": "fargate-cli",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "django-cli",
"image": "154309361967.dkr.ecr.ap-northeast-2.amazonaws.com/hello-cli",
"portMappings": [
{
"containerPort": 8000,
"protocol": "tcp"
}
],
"essential": true,
"entryPoint": [
"sh",
"-c"
]
}
],
"requiresCompatibilities": [
"FARGATE"
],
"cpu": "256",
"memory": "512"
}
family에는 작업 이름을 주어주면 됩니다. 그리고 containerDefinitions에서 container의 이름을 django-cli로 바꾸어 주었고 이미지를 위에서 만든 ECR레포지토리 이름을 적어 주었습니다. 여기서 팁이 있는데 cli상에서 ECR레포 리스트를 확인하는 방법은 아래와 같습니다.
https://docs.aws.amazon.com/cli/latest/reference/ecr/describe-repositories.html
다음과 같이 저는 두번쨰 레포를 사용하도록 하겠습니다.
그 다음으로는 portMappings 옵션입니다. faragate를 사용하는한 hostPort와 containerPort는 같으므로 생략해도 된다고 공식문서에 나와 있습니다. 그래서 8000만 적어 주었습니다. 그다음에 필요없는 command도 삭제 해 주었습니다.
# 내 환경
aws ecs register-task-definition --cli-input-json file://./task2.json
위 명령어를 실행하면 아래와 같은 오류가 뜹니다.
이는 User에 ECR의 image를 읽을 수 있는 권한이 없음을 의미합니다. 따라서 cli상에서 이를 추가해 주는 작업을 진행해 보도록 하겠습니다.
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html
저희는 aws에서 ecs에 대한 모든 권한을 가지는 role을 아래 명령어를 통해 만들겠습니다.
/ecs-task.json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ecs-tasks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
$aws iam create-role --role-name ecsTaskRole --assume-role-policy-document file://./ecs-task.json
ecsTaskRole이라는 역할이 IAM에 생성되었을 겁니다.
그리고 이를 지금 사용자에 attach하기 위한 명령어를 쳐주겠습니다.
$aws iam attach-role-policy --role-name ecsTaskRole --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
하지만 아직도 막 ECS의 작업을 실행할 수 있는 권힌이 없다면서 불평을 할겁니다.
이제부터는 다음 포스팅에 진행하도록 하겠습니다.