CodeDeployのリビジョン作成後、デプロイまで自動化する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

渡辺です。

CodeDeployでは、リビジョン(デプロイするパッケージ)を作成するプロセスと、リビジョンを各サーバにデプロイするプロセスは独立しています。 したがって、リビジョン作成は開発チームさんデプロイは運用チームさんと役割を分担できるようになっています。 また、デプロイプロセスが分離していることで、過去のバージョンへの再デプロイ(切り戻し)なども容易なのです。

codedeploy

とはいえ、本番環境や検証環境と異なり、開発環境では最新版をゴリゴリとデプロイできた方が便利ですね。

自動化するんよ

というわけで、AWSCLIを利用してリビジョン作成とデプロイを連動させてみました。

BUILD_DIR=.
REGION=ap-northeast-1
APP_NAME=app_development
DEPLOYMENT_GROUP=development_server
DEPLOYMENT_CONFIG=CodeDeployDefault.AllAtOnce
S3_BUCKET=revisions.app
TAG=`date '+%Y%m%d%H%M'`
S3_KEY=dev/${APP_NAME}_$TAG.zip

echo "#### create CodeDeploy revision: ${S3_KEY}"

aws deploy push --region ${REGION} --application-name ${APP_NAME} \
       --s3-location s3://${S3_BUCKET}/${S3_KEY} --source ${BUILD_DIR}

echo "#### deployment revision: ${S3_KEY}"
ETAG=`aws deploy list-application-revisions --region ${REGION} \
    --application-name ${APP_NAME} --s-3-bucket ${S3_BUCKET} --s-3-key-prefix ${S3_KEY} \
    --query 'revisions[0].s3Location.eTag' --output text`
aws deploy create-deployment --region ${REGION} --application-name ${APP_NAME} \
    --s3-location bucket=${S3_BUCKET},key=${S3_KEY},bundleType=zip,eTag=${ETAG} \
    --deployment-group-name ${DEPLOYMENT_GROUP} --deployment-config-name ${DEPLOYMENT_CONFIG}
echo ""

aws deploy pushaws deploy create-deploymentを利用しているだけですが、aws deploy pushの結果(出力)は次のようなメッセージでありcreate-deploymentのeTagがそのまま利用できません。

To deploy with this revision, run:
aws deploy create-deployment --application-name WordPress_App --deployment-config-name <deployment-config-name> --deployment-group-name <deployment-group-name> --s3-location bucket=CodeDeployDemoBucket,key=WordPressApp.zip,bundleType=zip,eTag="cecc9b8a08eac650a6e71fdb88EXAMPLE",version=LFsJAUd_2J4VWXfvKtvi79L8EXAMPLE

このため、aws deploy list-application-revisionsコマンドを利用し、デプロイしたリビジョンの情報からeTagを取得しています。 単一パラメータなのでqueryオプションが有効ですね!(jmespathチュートリアル) なお、Outputをパースすることも可能ですが、Outputが変更になったら動かなくなるのでやめましょう。

まとめ

CodeDeployは使いこなせるとデプロイが本当に楽になります。 あとはJenkinsなどのCIでリポジトリの変更をトリガーとして、ビルドからデプロイまでを自動化することができるでしょう。

なお、aws deploy create-deploymentはデプロイ開始の成否しか解りません。 デプロイの進捗は適宜マネジメントコンソールなどで確認してください。 SlackやChatworkを利用しているならば、SNSトリガーでデプロイ完了(またはエラー)を通知するといいんじゃないでしょうか。