目次
CloudFormationでLambdaをデプロイする時、差分が無かったら更新しない
change setを作らない(change set作成エラーにする)ことで差分デプロイを防ごうとするやり方です。
この記事の続きです。
変更点一覧
AWS側
CodePipeline
ファイル側
buildspec.yaml
CodePipelineの変更
change setの作成

codepipelineのbuildの下にdeployのステージを作りましょう。


アクション名はchange setを作成するのでcreate-change-setにしました。
入力アーティファクトは名前が違うかもしれませんが、buildステージの出力アーティファクトの名前選択してください。
change setとは?
cloudformationにはchange setというものがあり、スタックの更新時にchange setの作成(新しいスタックの準備材料)とchange setの実行(新しいスタックで上書き)を行っています。
1つ前の記事ではpackage化→deployを行っていましたね。
ただ、このdeployコマンドですが、実態はchange setの作成とchange setの実行になっています。
今回はそのchange setの作成とchange setの実行をdeployコマンドを使わずCodePipelineを使って実現しようとしています。
change setの実行
change set作成の後にアクショングループを追加し、change setの実行を行います。

ここでは入力アーティファクトをchange setの作成で指定した出力アーティファクトにします。
buildspec.yamlの修正
version: 0.2
phases:
install:
commands:
- npm install -g typescript
- npm ci
build:
commands:
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
- unzip awscliv2.zip
- ls -l /root/.pyenv/shims/aws
- ./aws/install --bin-dir /root/.pyenv/shims --install-dir /usr/local/aws-cli --update
- cd layers/nodejs
- npm ci
- cd ${CODEBUILD_SRC_DIR}
- tsc src/functions/test/index.ts
post_build:
commands:
- aws --version
- sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket cicd-test-bucket-2021
- cat packaged.yaml
artifacts:
files:
- packaged.yaml
- sam package --template-file template.yaml --output-template-file packaged.yaml --s3-bucket cicd-test-bucket-2021
上記でaws cloudformation packageだった部分をsam packageに修正しています。
また、ビルド以降の処理をCodePipelineで設定したため、こちらではデプロイを削除しています。
sam package と aws cloudformation package の違い
aws cloudformation packageで指定したcodeUriは毎回新しく生成され、新しいUriがpackage化されたタイミングで記述されますが、
sam packageはcodeUriが差分がない場合はcodeUriが更新されず、change set作成時に現在デプロイされているスタックと差分を見つけられないためchange setが作成されなくなります。
パイプライン実行
実行に失敗する場合はcloudformationのスタックを削除してから再度実行を行ってください。
2回目以降、差分存在しない場合はパイプラインが成功し、change set作成エラーになり、Lambdaは再作成されなくなります。

コメントを残す