GitHub Actions の OIDC で AWS に入れない:「Not authorized to perform sts:AssumeRoleWithWebIdentity」
GitHub はジョブにトークンを渡し、AWS はそれをロールの信頼ポリシーと照らし合わせました。条件のどれかが一致せず、ほとんどの場合は sub の条件です。どの条件で落ちたかは AWS が教えてくれないので、トークンの中身とポリシーが期待するものを見比べるのが近道です。
見え方
Assuming role with OIDC Retry AssumeRole: attempt 1 of 12 failed: Could not assume role with OIDC: Not authorized to perform sts:AssumeRoleWithWebIdentity. Retrying after 32ms. ... Error: Could not assume role with OIDC: Not authorized to perform sts:AssumeRoleWithWebIdentity
aws-actions/configure-aws-credentials のメッセージです。再試行しますが、一致しないポリシーは何回試しても通りません。
1. 2026年7月15日より後に作ったリポジトリ:sub に ID が入る
GitHub の2026年4月23日の変更履歴によると、2026年7月15日より後に作られたリポジトリは自動で新しい不変の形式になり、7月15日より後の名前の変更と移管も新しい形式に移ります。名前のあとにオーナーの ID とリポジトリの ID が付きます:
repo:octo-org/octo-repo:ref:refs/heads/main これまで repo:octo-org@123456/octo-repo@456789:ref:refs/heads/main 不変の形式
これまでの形で書いた信頼ポリシーは、そういうリポジトリのトークンにはどれにも一致しません。2026年10月の報告には、10月8日に作ったリポジトリ(gha-runner #89)、environment を通すデプロイ(smart-farm-monitoring #87)、plan と apply のロール一式(Openflows-Infra #54)があります。自分のリポジトリの接頭辞を読みます:
gh api repos/OWNER/REPO/actions/oidc/customization/sub
答えには use_immutable_subject と sub_claim_prefix があり、たとえば repo:octo-org@123456/octo-repo@456789 です。その接頭辞をポリシーに書きます:
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com",
"token.actions.githubusercontent.com:sub": "repo:octo-org@123456/octo-repo@456789:ref:refs/heads/main"
}
}
- 動いていたロールが、リポジトリやオーナーの名前の変更・移管のあとで止まることがあります。
- 古いリポジトリは、リポジトリか組織の OIDC の設定で新しい形式を有効にしない限り、これまでの形のままです。
- 4月の記事の最初の版を見て設定した場合:2026年6月10日までは、名前と ID の間が
-と書かれていました。形式は@です。 - GitHub Enterprise Server はこの変更に含まれません。
2. リポジトリのあとの部分
environment:のあるジョブは、ref の代わりに…:environment:名前になります。smart-farm-monitoring の本当のsubは、接頭辞に:environment:evaluationが付いた形でした。pull_requestの実行は…:pull_requestですが、ジョブに environment が無いときだけです。- それ以外は ref です:
…:ref:refs/heads/main、タグなら…:ref:refs/tags/v1.2.0。 - 値の中のコロンは
%3Aになるので、Production:V1という environment はenvironment:Production%3AV1と出ます。 - リポジトリや組織で独自のテンプレート(
include_claim_keys)を使うと、sub全体が変わります。不変の形式では、そのときもオーナーとリポジトリの ID は残る、と GitHub のドキュメントにあります。
3. StringEquals の中のワイルドカード
repo:octo-org@123456/octo-repo@456789:* がすべてのブランチに当たるのは StringLike の中だけです。StringEquals の中では * はただの文字で、何にも当たりません。configure-aws-credentials の README は、Allow の中の ForAllValues: も、クレームが無いときや綴りが違うときに真になるので避けるよう書いています。
4. ジョブがトークンを頼んでいない
id-token: write が無いとトークンが無く、メッセージも違います。アクションは「It looks like you might be trying to authenticate with OIDC. Did you mean to set the id-token permission?」と記録し、「Credentials could not be loaded, please check your action inputs: Could not load credentials from any providers」で失敗します。
permissions: id-token: write contents: read
ジョブに permissions: を書くと、そのジョブではワークフローの分が置き換わるので、そこにも id-token: write が要ります。企業や組織の外の再利用ワークフローには、呼び出し側で設定するようドキュメントに書かれています。
トークンの中身を見る
README は github/actions-oidc-debugger を挙げています。デコードしたクレームを表示するので、プライベートのリポジトリでだけ走らせます。sub と aud を、信頼ポリシーと1文字ずつ見比べます。
見分け方
- 「Incorrect token audience」:トークンの
audが、ID プロバイダーのクライアント ID の一覧にありません。アクションは、audienceの入力で変えない限りsts.amazonaws.comを送ります。 - 「No OpenIDConnect provider found in your account for https://
token.actions. githubusercontent.com」:ロールのあるアカウントに、IAM の ID プロバイダーがありません。 - Bitbucket Pipelines からの同じ AWS のメッセージは、原因が違います:Bitbucket Pipelines の OIDC で AWS に入れない。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、AWS は Amazon.com, Inc. またはその関連会社の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・Amazon・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「Resource not accessible by integration」 · 「Waiting」でレビューを待つ実行の承認 · Bitbucket Pipelines の OIDC で AWS に入れない · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English