0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub ActionsでOIDC接続する際の認証情報を変数化

Posted at

1.はじめに

GitHub Actionsを利用する際に一時トークンを発行し、そのトークンによってAssume RoleすることでAWSのリソースにアクセスさせるのは、実務でもよく目にする。推奨されている手法と言える。
その際確認されたのが、AWSのAssume Role先のARNをyamlにまとめて管理するという手法である。
安全の面から当初は懸念がないのか?と不安に思ったが、どうやら調べてみるとこれが推奨されている手段だという。
どうやって実現しているのか、自分でも検証して記事にしてみることとした。

記事の目的

environments.yamlというファイルを作成し、AWSのARNを記述。この情報をもってGitHub ActionsにAssume RoleさせAWS上のリソースにアクセスする権限を持たせる。

従来の課題

  • 機密情報がリークするリスクがある

  • CredentialsをGitHubで管理する危険性がある

概要

本記事では GitHub Actions から AWS へアクセスする際に、認証情報を Secrets として保持せず、OIDC を利用して動的に Assume Role する構成を採用する。
また、環境ごとに利用するロール ARN を environments.yaml にまとめて管理することで、
認証設定を「変数化」し、ステージング・本番など複数環境を安全かつ柔軟に扱えるようにしている。

GitHub Actions
     │(OIDC トークン)
     ▼
AWS IAM ロール(Assume Role)
     │(一時クレデンシャル)
     ▼
AWS CLI / CDK / Terraform / etc

Secretsを利用しない。

事前準備(AWS 側の設定)

事前にOIDC接続のため、IAM Roleを用意しAssume RoleさせるためのRoleを作成する必要がある。
「assume-role-terraform-github」というRoleを用意した。
スクリーンショット 2025-10-28 10.07.19.png

ウェブアイデンティティにチェックをいれ、
スクリーンショット 2025-10-28 10.09.20.png

その後の設定項目はスクショに従い「次へ」をクリックする。
スクリーンショット 2025-10-28 10.11.09.png

Assume Roleの際に認可するポリシーを問われるため、任意のポリシーを付与する。
(今回は個人環境で検証のため利用しているのでAdministrator権限を付与しているが、これは本来過剰でNGなことに留意する。)
スクリーンショット 2025-10-28 10.13.01.png

Role名を名付け、
スクリーンショット 2025-10-28 10.16.23.png

信頼されたエンティティを確認の後、
スクリーンショット 2025-10-28 10.18.09.png

「ロールを作成」をクリック。
スクリーンショット 2025-10-28 10.18.47.png

environments.yamlの内容

スクリーンショット 2025-10-26 16.35.29.png

ワークフロー全文

以下のワークフローを用意した。

terraform-plan.yaml
name: Terraform Plan

on:
  workflow_dispatch:
    inputs:
      environment:
        description: "Select environment"
        required: true
        type: choice
        options:
          - stg
          - prd
        default: prd
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

env:
  TF_BASE: projects/dev-jp

jobs:
  load-config:
    name: Load config
    runs-on: ubuntu-latest
    outputs:
      ROLE_ARN: ${{ steps.parse.outputs.role_arn }}
      AWS_REGION: ${{ steps.parse.outputs.aws_region }}
      BACKEND_BUCKET: ${{ steps.parse.outputs.backend_bucket }}
    steps:
      - uses: actions/checkout@v4

      - name: Install yq
        run: |
          sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq
          sudo chmod +x /usr/bin/yq

      - id: parse
        name: Parse environments.yml safely
        run: |
          ENV="${{ github.event.inputs.environment }}"
          if [ -z "$ENV" ]; then
            ENV="prd"
          fi

          FILE=".github/workflows/environments.yml"
          if [ ! -f "$FILE" ]; then
            echo "ERROR: $FILE not found" >&2
            exit 1
          fi

          role=$(yq ".${ENV}.role_arn" "$FILE" | tr -d '"')
          region=$(yq ".${ENV}.region" "$FILE" | tr -d '"')
          bucket=$(yq ".${ENV}.backend_bucket" "$FILE" | tr -d '"')

          echo "role_arn=$role" >> "$GITHUB_OUTPUT"
          echo "aws_region=$region" >> "$GITHUB_OUTPUT"
          echo "backend_bucket=$bucket" >> "$GITHUB_OUTPUT"

  plan:
    name: Terraform Plan
    needs: load-config
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Configure AWS (OIDC AssumeRole)
        uses: aws-actions/configure-aws-credentials@v3
        with:
          role-to-assume: ${{ needs.load-config.outputs.ROLE_ARN }}
          aws-region: ${{ needs.load-config.outputs.AWS_REGION }}

      - name: Verify identity
        run: aws sts get-caller-identity

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: 1.5.2

      - name: Terraform Init
        run: |
          terraform -chdir=${{ env.TF_BASE }}/${{ github.event.inputs.environment || 'prd' }} init \
            -backend-config="bucket=${{ needs.load-config.outputs.BACKEND_BUCKET }}" \
            -backend-config="region=${{ needs.load-config.outputs.AWS_REGION }}"

      - name: Terraform plan
        run: terraform -chdir=${{ env.TF_BASE }}/${{ github.event.inputs.environment || 'prd' }} plan -out=tfplan.binary

メリットの再確認

  • Secretsを利用することなく、より安全にGitHub ActuionsがAWSのリソースにアクセスできていること。
  • GitHub Actionsが参照できる権限に制限を設けられること。
  • ARNをまとめて1つのファイルで管理し、このARNをもってより安全な運用が可能なこと。
  • workflow_dispatch → inputs.environment に基づき、stg/prd を自動選択できること。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?