インフラ

Github Actionsを使ってCDKを自動デプロイする

こんにちは、ちゃりおです。

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というツールもあるので、そちらも触ってみたいです。

Amzonで「AWS」の本を見てみる

楽天で「AWS」の本をみてみる!!

cdk
AWS CDK ecs-patternsで作成されるALBのセキュリティグループの全許可ルールを削除するこんにちは、ちゃりおです。 CDKのecs-patters簡単にecsの環境用意できて便利ですよね。 使ってみて1つ気になることがあ...
リポジトリにタスク定義ファイルを含めずにGitHub ActionsでECSにデプロイする方法こんにちは、ちゃりおです。 CDKでECS関連のリソースを作って、Github Actionsでデプロイしていました。 Github ...
cdk
CDK ecs-service-extensionsを使用してお手軽にAppMeshを有効化したECSサービスを作成するこんにちは、ちゃりおです。 最近AWS CDKのAmazon ECS拡張機能(ecs-service-extensions)を使ってみ...