脱・長期クレデンシャル:GitHub ActionsとOIDCによるAWS認証の完全パスワードレス化
「AWSのアクセスキーをGitHubのSecretsに保存して、ローテーションを忘れて泣きを見たことはないか?」
もし君がまだ `AWS_ACCESS_KEY_ID` と `AWS_SECRET_ACCESS_KEY` をGitHub Secretsに叩き込んでいるなら、今すぐその習慣を捨てるべきだ。それは「いつか爆発する時限爆弾」をリポジトリに埋め込んでいるのと同じだ。
今回は、DevOpsのプロフェッショナルとして、GitHub ActionsとAWS間の認証をOpenID Connect (OIDC)で完全パスワードレス化する方法を伝授する。これは単なるセキュリティ対策ではない。「鍵管理」という無駄な作業をこの世から抹消し、開発スピードを加速させるための必須技術だ。
—
1. なぜ「IAMユーザー」は死ぬべきなのか
従来のIAMユーザー方式には、以下の3つの致命的な欠陥がある。
1. 長期クレデンシャルのリスク: 一度漏洩すれば、誰かがローテーションを強制するまで攻撃者はフリーパスだ。
2. 管理コスト: 90日ごとの鍵の更新、環境ごとのキー管理、これらは自動化の敵だ。
3. 権限の肥大化: 大抵の場合、`AdministratorAccess` が付与されたままの鍵が放置されている。
OIDCを使えば、GitHub Actionsのジョブが実行されるその瞬間に、「使い捨ての短期トークン」をAWSから動的に発行させる。ジョブが終わればトークンは無効化される。これが「究極の自動化」の第一歩だ。
—
2. 実装:AWS側の信頼関係設定(Terraform/CloudFormation推奨)
AWS側では、GitHubを「信頼できるプロバイダー」として登録する必要がある。
信頼関係の構築(IAMロール)
以下のポリシーを、GitHub Actionsに与えたいIAMロールの「信頼関係」に設定する。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Effect”: “Allow”,
“Principal”: { “Federated”: “arn:aws:iam::YOUR_ACCOUNT_ID:oidc-provider/token.actions.githubusercontent.com” },
“Action”: “sts:AssumeRoleWithWebIdentity”,
“Condition”: {
“StringLike”: {
“token.actions.githubusercontent.com:sub”: “repo:YOUR_ORG/YOUR_REPO:”
}
}
}
]
}
- プロのヒント: `sub`(サブジェクト)には `repo:owner/repo:ref:refs/heads/main` のようにブランチを指定することで、「本番デプロイはmainブランチからしか受け付けない」という制約をIAMレベルで強制できる。
—
3. GitHub Actions設定:これが「神」のYAML構成だ
公式の `aws-actions/configure-aws-credentials` を使う。これを使うだけで、内部的に面倒なトークン交換をすべて自動でやってくれる。
jobs:
deploy:
runs-on: ubuntu-latest
# OIDCトークンの発行許可
permissions:
id-token: write
contents: read
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::YOUR_ACCOUNT_ID:role/GitHubActionsRole
aws-region: ap-northeast-1
- name: Run AWS CLI
run: aws s3 ls # ここでは既に認証済み!
—
4. 現場で差がつく「極限の最適化」テクニック
① GitHub Actionsの「隠れたキーボードショートカット」
GitHub Actionsのログ画面で、`Shift + /` を押すとコマンドパレットが開く。また、ログの特定の行にリンクを貼りたい場合は、行番号をクリックしてURLをコピーするだけだ。チーム内での障害共有が劇的に速くなる。
② チーム開発で絶対に入れるべき神プラグイン
- [GitHub Actions Extension for VS Code](https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-github-actions): エディタ内でワークフローの実行状況を確認し、失敗したジョブを再実行できる。ブラウザとエディタを行き来する時間は「無」だ。
③ 設定の共有化ルール:Reusable Workflows
個々のリポジトリに複雑なYAMLを書かせるな。OIDCの設定や環境変数の注入は、「共通リポジトリ」にReusable Workflowとして切り出せ。
.github/workflows/deploy-template.yml (共通リポジトリ側)
on:
workflow_call:
inputs:
role-arn: { type: string, required: true }
jobs:
aws-auth:
runs-on: ubuntu-latest
permissions: { id-token: write, contents: read }
steps:
- uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ inputs.role-arn }}
aws-region: ap-northeast-1
各リポジトリからはこれを呼び出すだけにすれば、AWS側の設定変更があった際も1箇所の修正で全チームのパイプラインをアップデートできる。
—
最後に:テックリードからの提言
OIDC化は単なるセキュリティ対策ではない。「セキュアな環境を、努力せずに維持する仕組み」を作ることだ。
パスワードレス化が完了すれば、君たちのチームは「鍵のローテーション」という非生産的なタスクから解放される。その浮いた時間で、パイプラインのテスト時間を1秒でも短くすることに集中してほしい。
自動化の極意は「ツールに使われる」のではなく、「ツールを使って、人間が本来やるべきクリエイティブな仕事にリソースを全振りする」ことにある。
さあ、今すぐSecretsからアクセスキーを削除せよ。それが君のエンジニアとしてのランクを一つ上げる瞬間だ。