![見出し画像](https://assets.st-note.com/production/uploads/images/152744993/rectangle_large_type_2_1468e68b0ab356337a5feb12fe94133e.png?width=1200)
Github ActionsでTerraformコマンドを実行する #488
Terraformコマンドを本番環境に向けて実行する手段はいくつかありますが、Github Actionsを活用すると、認証系の情報を一元管理したり、管理する情報を減らせたりしてセキュアに運用できます。
今回はアクセスキーなどは使わずに、IAMロールから認証情報を取得する方法をシェアします。
Github ActionsでIAMロールから認証情報を取得する
IAMロールの一時的なクレデンシャルでアクセスできる方法です。
以下のサイトにほぼ全て網羅されていました。
IAMコンソールの設定
上記のブログの内容に沿う形ですが、まず以下の2点を対応します。
OIDCプロバイダ追加
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権限にするためには明示的な指定が必要です。
stepsのusesにあるaws-actions/configure-aws-credentialsがこの機能を実現してくれてます。
あとはterraformコマンドを実行する処理を書いていくだけです。
ここまでお読みいただきありがとうございました!