app runner 更新のスクリプトのメモ

意外とネットあまり見当たらなかったので書き残しておきます。

階層

階層は以下の通りです。

.
├── config
├── deploy.sh
├── push_image.sh
└── update_app_runner.sh

config

AWS のシークレット関連の値を設定します。

AWS_ACCOUNT_ID=123456789012
AWS_ECR_NAME="hoge-ecr"
AWS_APP_RUNNER_SERVICE_NAME="hoge-service"

push_image.sh

対象のイメージを ECR にプッシュするスクリプトです。
これはECRのページに載っているものと同じですが、dockerfile 名は dockerfile.production を指定しています。

#!/bin/sh

. "$PWD/config"

cd ../ &&
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com &&
docker build -t $AWS_ECR_NAME:latest -f dockerfile.production . &&
docker tag $AWS_ECR_NAME:latest $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/$AWS_ECR_NAME:latest &&
docker push $AWS_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/$AWS_ECR_NAME:latest

update_app_runner.sh

app runner をデプロイするスクリプトです。
対象の arn を取得してデプロイしているだけです。

デプロイ完了までは、教えてくれないみたいなので、状態を問い合わせを行うようにしています。

#!/bin/sh

. "$PWD/config"

# getting arn.
aws_app_runner_arn=$(aws apprunner list-services --query "ServiceSummaryList[?ServiceName=='$AWS_APP_RUNNER_SERVICE_NAME'].ServiceArn" --output text)

# start deploying.
aws apprunner start-deployment --service-arn "$aws_app_runner_arn"

while :
do
  # getting deploying status.
  status=$(aws apprunner describe-service --service-arn "$aws_app_runner_arn" --query "Service.Status" --output text)
  if [ "$status" = "RUNNING" ]; then
    echo "Success! Status: $status"
    break
  elif [ "$status" = "OPERATION_IN_PROGRESS" ]; then
    echo "Deploying... Status: $status"
    sleep 5
  else
    echo "Failed! Status: $status"
    exit 1
  fi
done

deploy.sh

あとは前述したスクリプトをまとめて実行します。

#!/bin/sh

sh push_image.sh &&
sh update_app_runner.sh
YouTube