Agile育成ブログ
未来を変える喜びを
未分類

GitHub ActionsでOpenID Connect(OIDC)認証を使ってTerraformをデプロイする(AWS)

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認証フローは通常の下記のようになります。

以下に各ステップの詳細を説明します:

  1. GitHub Actionsワークフローが開始されると、GitHub OIDCプロバイダーにOIDCトークン(JWT) をリクエストします。
  2. GitHub OIDCプロバイダーは、ワークフローに対して一意のトークンを発行します。このトークンには、リポジトリ名、ブランチ名、ジョブ名などの情報が含まれます。
  3. GitHub Actionsは、このトークンを使用してAWS Security Token Service (STS) の AssumeRoleWithWebIdentity APIを呼び出します。
  4. AWS STSは、受け取ったトークンを使用してAWS IAMロールに対する認証を試みます。IAMロールには、GitHub OIDCプロバイダーを信頼するように設定されたトラストポリシーが定義されている必要があります。
  5. AWS IAMは、トークンの内容とトラストポリシーを照合し、ロールの引き受けを承認します。
  6. 承認が成功すると、AWS STSはGitHub Actionsに対して一時的なAWS認証情報を提供します。
  7. GitHub Actionsは、これらの一時的な認証情報を使用してAWSのサービス(S3、EC2、RDSなど)にアクセスし、必要なタスクを実行します。
  8. 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 とはそもそも何?

ロールの 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