この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
渡辺です。
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トリガーでデプロイ完了(またはエラー)を通知するといいんじゃないでしょうか。