既存設定取得してIMAGE_URIを更新するパターン
buildspec.yaml
version: 0.2 env : variables: AWS_REGION: ap-northeast-1 ECS_CLUSTER_NAME_PREFIX: sample-backup-to-gcp SERVICE_ARN_PREFIX: sample-backup-to-gcp-service phases: install : commands: pre_build: # ビルド前処理 commands: - echo Clean file ... - rm -rf .git .gitignore README.md - echo Logging in to Amazon ECR... - pip install awscli --upgrade - sudo apt -y update - sudo apt -y install jq - aws --version - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin {●AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com - IMAGE_NAME_GCLOUD_SDK=sample-backup-to-gcp-cloudsdk-${ENVIRONMENT} - REPOSITORY_URI_GCLOUD_SDK={●AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_NAME_GCLOUD_SDK} - COMMIT_HASH=$( echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} - REPOSITORY_URI_GCLOUD_SDK_AND_IMAGE_TAG=${REPOSITORY_URI_GCLOUD_SDK}:${IMAGE_TAG} build: commands: - echo ${ENVIRONMENT} - echo Build started on ` date ` - echo Building the Docker image... - pwd - ls -laht - docker build -t ${REPOSITORY_URI_GCLOUD_SDK}:latest --build-arg ENVIRONMENT=${ENVIRONMENT} -f . /environments/ ${ENVIRONMENT} /docker/GCLOUD_SDK/Dockerfile . - docker tag ${REPOSITORY_URI_GCLOUD_SDK}:latest ${REPOSITORY_URI_GCLOUD_SDK_AND_IMAGE_TAG} post_build: commands: - echo Build completed on ` date ` - echo Pushing the Docker images... # ECRにpush - docker push ${REPOSITORY_URI_GCLOUD_SDK}:$IMAGE_TAG - echo Writing image definitions file ... - echo ${ENVIRONMENT} # 現在のタスク定義取得 - SRC_TASKDEF_ARN=$(aws ecs describe-services --cluster ${ECS_CLUSTER_NAME_PREFIX}-${ENVIRONMENT} --services ${SERVICE_ARN_PREFIX}-${ENVIRONMENT} | jq -r '.services[0].taskDefinition' ) - echo ${SRC_TASKDEF_ARN} # 現在のタスク定義をJSONで取得し、イメージを指定して更新 - aws ecs describe-task-definition --task-definition ${SRC_TASKDEF_ARN} | jq '.taskDefinition | del(.taskDefinitionArn, .status, .requiresAttributes, .compatibilities, .revision)' | jq '(.containerDefinitions[] | select(.name == "' ${ECS_CLUSTER_NAME_PREFIX}-${ENVIRONMENT} '")).image = "' ${REPOSITORY_URI_GCLOUD_SDK_AND_IMAGE_TAG} '"' > tmp_task_definition.json # エラー原因となるプロパティを削除 - cat tmp_task_definition.json | jq 'del(.registeredAt, .registeredBy)' > task_definition.json # タスク定義を更新 - NEW_TASKDEF=`aws ecs register-task-definition --cli-input-json file : //task_definition .json | jq -r '.taskDefinition.taskDefinitionArn' ` - echo ${NEW_TASKDEF} # サービスを更新 - aws ecs update-service --cluster ${ECS_CLUSTER_NAME_PREFIX}-${ENVIRONMENT} --service ${SERVICE_ARN_PREFIX}-${ENVIRONMENT} --task-definition ${NEW_TASKDEF} artifacts: files: - task_definition.json |
task_definition.json
{ "containerDefinitions" : [ { "name" : "sample-backup-to-gcp-develop" , "image" : "{●AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/sample-backup-to-gcp-cloudsdk-develop:d84059a" , "cpu" : 0, "portMappings" : [ { "containerPort" : 443, "hostPort" : 443, "protocol" : "tcp" } ], "essential" : true , "environment" : [], "mountPoints" : [], "volumesFrom" : [], "logConfiguration" : { "logDriver" : "awslogs" , "options" : { "awslogs-group" : "/ecs/sample-backup-to-gcp-develop" , "awslogs-region" : "ap-northeast-1" , "awslogs-stream-prefix" : "ecs" } } } ], "family" : "sample-backup-to-gcp-develop" , "taskRoleArn" : "{●ROLE_ARN}" , "executionRoleArn" : "{●ROLE_ARN}" , "networkMode" : "awsvpc" , "volumes" : [], "placementConstraints" : [], "requiresCompatibilities" : [ "FARGATE" ], "cpu" : "2048" , "memory" : "4096" } |
テンプレートファイルを用意しておいて、文字列置換で生成するパターン
task_definition_develop.json
{ "containerDefinitions" : [ { "name" : "sample-backup-to-gcp-develop" , "image" : "<IMAGE_URI>" , "cpu" : 0, "portMappings" : [ { "containerPort" : 443, "hostPort" : 443, "protocol" : "tcp" } ], "essential" : true , "environment" : [], "mountPoints" : [], "volumesFrom" : [], "logConfiguration" : { "logDriver" : "awslogs" , "options" : { "awslogs-group" : "/ecs/sample-backup-to-gcp-develop" , "awslogs-region" : "ap-northeast-1" , "awslogs-stream-prefix" : "ecs" } } } ], "family" : "sample-backup-to-gcp-develop" , "taskRoleArn" : "{●ROLE_ARN}" , "executionRoleArn" : "{●ROLE_ARN}" , "networkMode" : "awsvpc" , "volumes" : [], "placementConstraints" : [], "requiresCompatibilities" : [ "FARGATE" ], "cpu" : "1024" , "memory" : "2048" } |
buildspec.yaml
version: 0.2 env : variables: AWS_REGION: ap-northeast-1 ECS_CLUSTER_NAME_PREFIX: sample-backup-to-gcp SERVICE_ARN_PREFIX: sample-backup-to-gcp-service phases: install : commands: pre_build: # ビルド前処理 commands: - echo Clean file ... - rm -rf .git .gitignore README.md - echo Logging in to Amazon ECR... - pip install awscli --upgrade - sudo apt -y update - sudo apt -y install jq - aws --version - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin {●AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com - IMAGE_NAME_GCLOUD_SDK=sample-backup-to-gcp-cloudsdk-${ENVIRONMENT} - REPOSITORY_URI_GCLOUD_SDK={●AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${IMAGE_NAME_GCLOUD_SDK} - COMMIT_HASH=$( echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} - REPOSITORY_URI_GCLOUD_SDK_AND_IMAGE_TAG=${REPOSITORY_URI_GCLOUD_SDK}:${IMAGE_TAG} build: commands: - echo ${ENVIRONMENT} - echo Build started on ` date ` - echo Building the Docker image... - pwd - ls -laht - docker build -t ${REPOSITORY_URI_GCLOUD_SDK}:latest --build-arg ENVIRONMENT=${ENVIRONMENT} -f . /environments/ ${ENVIRONMENT} /docker/GCLOUD_SDK/Dockerfile . - docker tag ${REPOSITORY_URI_GCLOUD_SDK}:latest ${REPOSITORY_URI_GCLOUD_SDK_AND_IMAGE_TAG} post_build: commands: - echo Build completed on ` date ` - echo Pushing the Docker images... # ECRにpush - docker push ${REPOSITORY_URI_GCLOUD_SDK}:$IMAGE_TAG - echo Writing image definitions file ... - echo ${ENVIRONMENT} # 現在のタスク定義取得 - sed -e "s@<IMAGE_URI>@$REPOSITORY_URI_GCLOUD_SDK_AND_IMAGE_TAG@g" task_definition_develop.json > task_definition.json # タスク定義を更新 - NEW_TASKDEF=`aws ecs register-task-definition --cli-input-json file : //task_definition .json | jq -r '.taskDefinition.taskDefinitionArn' ` - echo ${NEW_TASKDEF} # サービスを更新 - aws ecs update-service --cluster ${ECS_CLUSTER_NAME_PREFIX}-${ENVIRONMENT} --service ${SERVICE_ARN_PREFIX}-${ENVIRONMENT} --task-definition ${NEW_TASKDEF} artifacts: files: - task_definition.json |