GitHub Actionsを使ったAWSへのTerraformデプロイ方法について、OpenID Connect(OIDC)を使用したセキュアな認証方法を使用する方法で設定してみます。
この方法を使うことで、AWSのアクセスキーを直接GitHub Secretsに保存する必要がなくなり、よりセキュアなCI/CDパイプラインを構築することができます。
OIDCとは
OpenID Connect(OIDC)は、OAuth 2.0プロトコルの上に構築された認証レイヤーです。OIDCを使用することで、アプリケーション(この場合はGitHub Actions)は別のサービス(AWS)に対して安全に認証を行うことができます。
GitHub ActionsのOIDC認証フロー
GitHub ActionsでAWS IAMロールのOIDC認証フローは通常の下記のようになります。

以下に各ステップの詳細を説明します:
- GitHub Actionsワークフローが開始されると、GitHub OIDCプロバイダーにOIDCトークン(JWT) をリクエストします。
- GitHub OIDCプロバイダーは、ワークフローに対して一意のトークンを発行します。このトークンには、リポジトリ名、ブランチ名、ジョブ名などの情報が含まれます。
- GitHub Actionsは、このトークンを使用してAWS Security Token Service (STS) の AssumeRoleWithWebIdentity APIを呼び出します。
- AWS STSは、受け取ったトークンを使用してAWS IAMロールに対する認証を試みます。IAMロールには、GitHub OIDCプロバイダーを信頼するように設定されたトラストポリシーが定義されている必要があります。
- AWS IAMは、トークンの内容とトラストポリシーを照合し、ロールの引き受けを承認します。
- 承認が成功すると、AWS STSはGitHub Actionsに対して一時的なAWS認証情報を提供します。
- GitHub Actionsは、これらの一時的な認証情報を使用してAWSのサービス(S3、EC2、RDSなど)にアクセスし、必要なタスクを実行します。
- AWSサービスは、リクエストに応じてレスポンスを返します。
なぜOIDCを使用するのか
セキュリティの向上:長期的なAWSアクセスキーをGitHubに保存する必要がありません。
管理の簡素化:アクセスキーのローテーションが不要になります。
細かなアクセス制御:特定のリポジトリやブランチからのみAWSリソースにアクセスできるように制限できます。
2.AWSでOIDCプロバイダーを設定する
OIDCプロバイダーやIAMロールもTerraformで作成したほうが管理しやすいと思いますが、今回はマネージメントコンソールで作成していきます。
AWSマネージメントコンソールでIAMに移動し、「IDプロバイダー」→「プロバイダーを追加」を選択します

「プロバイダーの設定」で下記のように設定します
タイプ:OpenID Connect
プロバイダーURL:https://token.actions.githubusercontent.com
対象者(Audience):sts.amazonaws.com

シークレット名はASSUME_ROLE_ARNとし、Secretは3で作成したロールのARN(arn:aws:iam::374171135276:role/terraform-oidc)を設定します。
ロールの ARN =
「この AWS アカウントの、この IAM ロール」を
世界で一意に指し示すための識別子
.githubというフォルダを作成してフォルダを開き、なかにworkflowsというフォルダを作成します。workflowsフォルダ内にGitHub Actionsの動作を定義するYAMLファイルを下記のように作成します。
name: Terraform Deploy
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
on:
push:
branches:
- main
paths:
- "terraform/**"
jobs:
deploy:
runs-on: ubuntu-latest
# ジョブのタイムアウト設定
timeout-minutes: 10
# ジョブの権限設定
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{secrets.ASSUME_ROLE_ARN}}
aws-region: ap-northeast-1
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_version: 1.9.1
- name: Terraform Init
run: terraform -chdir=./terraform init
- name: Terraform Plan
run: terraform -chdir=./terraform plan
- name: Terraform Apply
run: terraform -chdir=./terraform apply -auto-approve


