kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Digger で複数の AWS アカウントに terraform apply を実行する

Digger で複数の AWS アカウント(たとえば stg 環境と prd 環境)にデプロイする仕組みを作ってみたので簡単にまとめておこうと思う.基本的にはドキュメントに載っている通りに設定すれば OK だった👌

docs.digger.dev

動作イメージ

まず,適当に Terraform コードを変更してプルリクエストを出す.すると自動的に stg 環境と prd 環境に対して terraform plan が実行される💡

そして -p オプションでプロジェクトを指定して digger apply -p stg コマンドを実行すると,stg 環境に対して terraform apply が実行される❗️

同じように digger apply -p prd コマンドを実行すると,prd 環境に対して terraform apply が実行される❗️

問題がないことを確認できたらプルリクエストをマージすれば OK👌

ちなみに -p オプションでプロジェクトを指定しないと,同時に stg 環境と prd 環境に対して terraform apply が実行された.正直同時にデプロイする機会は少なそうだし,むしろ誤って実行しないように抑止できると良さそうだけど...😅

コード紹介

ディレクトリ構成

├── .github
│   └── workflows
│       ├── digger-run-prd.yml
│       └── digger-run-stg.yml
├── digger.yml
├── prd
│   ├── provider.tf
│   └── main.tf
└── stg
    ├── provider.tf
    └── main.tf

👾 digger.yml

プロジェクトとして stg 環境と prd 環境を作って,ディレクトリ名と GitHub Actions ワークフローファイル名を設定した👌

projects:
  - name: stg
    dir: stg
    workflow_file: digger-run-stg.yml
  - name: prd
    dir: prd
    workflow_file: digger-run-prd.yml

👾 .github/workflows/digger-run-stg.yml

基本的にドキュメントに載っているワークフロー設定を参考にしてるけど,AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY は設定したくなく,aws-role-to-assume で OIDC (OpenID Connect) で IAM Role を引き受けられるようにしている👌

docs.digger.dev

name: Digger Workflow (stg)

on:
  workflow_dispatch:
    inputs:
      spec:
        required: true
      run_name:
        required: false

run-name: '${{inputs.run_name}}'

jobs:
  digger-job:
    runs-on: ubuntu-latest
    environment: stg
    permissions:
      contents: write      # required to merge PRs
      actions: write       # required for plan persistence
      id-token: write      # required for workload-identity-federation
      pull-requests: write # required to post PR comments
      issues: read         # required to check if PR number is an issue or not
      statuses: write      # required to validate combined PR status

    steps:
      - uses: actions/checkout@v4
      - name: ${{ fromJSON(github.event.inputs.spec).job_id }}
        run: echo "job id ${{ fromJSON(github.event.inputs.spec).job_id }}"
      - uses: diggerhq/digger@v0.6.91
        with:
          digger-spec: ${{ inputs.spec }}
          setup-terraform: true
          terraform-version: v1.11.0
          setup-aws: true
          aws-role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
          aws-region: ap-northeast-1
          cache-dependencies: true
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

👾 .github/workflows/digger-run-prd.yml

namejobs.digger-job.environment 以外は同じ.

name: Digger Workflow (prd)

on:
  workflow_dispatch:
    inputs:
      spec:
        required: true
      run_name:
        required: false

run-name: '${{inputs.run_name}}'

jobs:
  digger-job:
    runs-on: ubuntu-latest
    environment: prd
    permissions:
      contents: write      # required to merge PRs
      actions: write       # required for plan persistence
      id-token: write      # required for workload-identity-federation
      pull-requests: write # required to post PR comments
      issues: read         # required to check if PR number is an issue or not
      statuses: write      # required to validate combined PR status

    steps:
      - uses: actions/checkout@v4
      - name: ${{ fromJSON(github.event.inputs.spec).job_id }}
        run: echo "job id ${{ fromJSON(github.event.inputs.spec).job_id }}"
      - uses: diggerhq/digger@v0.6.91
        with:
          digger-spec: ${{ inputs.spec }}
          setup-terraform: true
          terraform-version: v1.11.0
          setup-aws: true
          aws-role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
          aws-region: ap-northeast-1
          cache-dependencies: true
        env:
          GITHUB_CONTEXT: ${{ toJson(github) }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

GitHub Environments

あとは GitHub Environments に stgprd を作って,シークレット AWS_ROLE_TO_ASSUME に IAM Role の ARN を設定すれば OK👌

まとめ

Digger を使えば比較的簡単に Terraform のブランチデプロイと IssueOps を実現できてイイ感じ \( 'ω')/

github.blog

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com