既存設定取得して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




