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を用意した。

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

environments.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 を自動選択できること。





