見出し画像

Github ActionsでTerraformコマンドを実行する #488

Terraformコマンドを本番環境に向けて実行する手段はいくつかありますが、Github Actionsを活用すると、認証系の情報を一元管理したり、管理する情報を減らせたりしてセキュアに運用できます。

今回はアクセスキーなどは使わずに、IAMロールから認証情報を取得する方法をシェアします。

Github ActionsでIAMロールから認証情報を取得する

IAMロールの一時的なクレデンシャルでアクセスできる方法です。
以下のサイトにほぼ全て網羅されていました。

IAMコンソールの設定

上記のブログの内容に沿う形ですが、まず以下の2点を対応します。

  1. OIDCプロバイダ追加

  2. IAMロール作成

どちらもIAMコンソールから作成可能で、手順は上記ブログの通りに実行すればOKです。

IAMロールの「信頼関係」部分のサンプルコードだけ転記しておきます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:<GitHubユーザー名>/<GitHubリポジトリ名>:*"
        }
      }
    }
  ]
}

ここで自分のアカウントIDとGitHubリポジトリを指定して、IAMロールにアクセスできるようにします。

GitHub Actions ワークフロー修正

今回はterraform planを実行する設定で書いてみました。

env:
  AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
  AWS_REGION: "ap-northeast-1"
  TF_VERSION: "1.9.5"

jobs:
  plan:
    runs-on: ubuntu-22.04
    timeout-minutes: 60
    permissions:
      id-token: write
      contents: read
      pull-requests: write
      statuses: write
    strategy:
      fail-fast: false
    defaults:
      run:
        working-directory: ./terraforms
    steps:
      - uses: actions/checkout@v3

      - uses: aws-actions/configure-aws-credentials@master
        with:
          role-to-assume: arn:aws:iam::${{ env.AWS_ACCOUNT_ID }}:role/my-github-actions-role
          aws-region: ${{ env.AWS_REGION }}

      - uses: hashicorp/setup-terraform@v2
        with:
          terraform_version: ${{ env.TF_VERSION }}

      - name: Check format
        id: fmt
        run: terraform fmt -check -recursive

      - name: Init
        run: terraform init -upgrade -no-color

      - name: Check validate
        run: terraform validate

      - name: Plan
        id: plan-chdir
        run: terraform plan -no-color -input=false -parallelism=20

permissionsの説明を参考ブログから引用します。

permissionsでGitHub Actionsの実行ごとに発行されるGitHubのTokenの権限を設定します。

id-token: writeは、GitHubのOIDCプロバイダが発行されるトークンを利用するために必要となります。

またpermissionsで権限を変更すると、指定しなかった権限はnoneになってしまいます。そのためcontentsをデフォルトのread権限にするためには明示的な指定が必要です。

GitHub ActionsにAWSクレデンシャルを直接設定したくないのでIAMロールを利用したい

stepsのusesにあるaws-actions/configure-aws-credentialsがこの機能を実現してくれてます。

あとはterraformコマンドを実行する処理を書いていくだけです。


ここまでお読みいただきありがとうございました!

参考


この記事が気に入ったらサポートをしてみませんか?