こんにちは、ちゃりおです。
CDK手動反映だと反映漏れが発生することもあり、今回はGithub Actionsを使ってCDKを自動デプロイしてみました。
以下の記事を参考にしました
参考 CDKとGithub ActionsによるCI/CDパイプライン
Github Actionsを使ってCDKを自動デプロイする
CDKのファイルはアプリケーションと同一リポジトリにあり、「cdk」フォルダ配下にある前提です。
- PR時にdiffを取得
- PRをマージしたタイミングでデプロイ
ワークフローファイル
name: deploy-cdk
on:
push:
branches:
- deploy
paths:
- "cdk/**"
pull_request:
paths:
- "cdk/**"
jobs:
deploy-cdk:
runs-on: ubuntu-latest
defaults:
run:
working-directory: cdk
steps:
- uses: actions/checkout@v2
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-1
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '14'
- name: Get yarn cache directory path
id: yarn-cache-dir-path
run: echo "::set-output name=dir::$(yarn cache dir)"
- name: Cache node modules
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
# yarn cache files are stored in `~/.cache/yarn` on Linux/macOS
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ env.cache-name }}-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-${{ env.cache-name }}-
${{ runner.os }}-yarn-
${{ runner.os }}-
- name: CDK package install
run: yarn install --frozen-lockfile
- name: CDK Diff Check
if: contains(github.event_name, 'pull_request')
run: |
cdk diff
- name: CDK Deploy
if: contains(github.event_name, 'push')
run: |
cdk deploy
CDKに変更があったときだけアクション実行
CDKに変更がない際にも、こちらのアクションが実行されるのは無駄に課金されてしますのでトリガーにディレクトリも含めています。
それに伴って、working-directoryにcdkディレクトリを指定しています。
on:
push:
branches:
- deploy
paths:
- "cdk/**"
pull_request:
paths:
- "cdk/**"
PR時にcdk diff、Push時にcdk deploy
PRでdiff確認、マージして自動デプロイの流れにしたかっため、それぞれifを使って実行されるようにしています。
- name: CDK Diff Check
if: contains(github.event_name, 'pull_request')
run: |
cdk diff
- name: CDK Deploy
if: contains(github.event_name, 'push')
run: |
cdk deploy
cdk.json requireApprovalをneverにしておく
デフォルトだとcdk deploy時に、変更があると適用するか(y/n)で聞かれます。
CI/CD上で上記があるとエラーになってしまうので、cdk.jsonに記述を追加して聞かれないようにします。
{
"app": "...",
"requireApproval": "never"
}
まとめ
手動実行だと複数環境があると、反映することを忘れてコード(STG当てたけど、PRD当ててないとか)と実際の環境が乖離している状態になる可能性があります。
自動デプロイすることで、コード上のCDKが常に環境に反映されていることを保証できて安心です。
また、ちょっとした変更を行ってもらう際にcdkの実行環境をローカルに用意する必要がなく楽です。
最近GA(2021/7/28)になったCDK Pipelineというツールもあるので、そちらも触ってみたいです。
https://chariosan.com/2021/07/25/aws-cdk-ecs-patterns_default_sg_allow_all/