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 push
とaws 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トリガーでデプロイ完了(またはエラー)を通知するといいんじゃないでしょうか。