GitHub Actions:「Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable」
ステップは、ACTIONS_ID_TOKEN_REQUEST_URL と ACTIONS_ID_TOKEN_REQUEST_TOKEN の2つの変数を通して GitHub に OIDC のトークンを頼みます。GitHub がこれを設定するのはトークンを持ってよいジョブだけで、このジョブはそうではありませんでした。アクションは Azure・AWS・Google Cloud などに届く前に止まったので、直すところはクラウドの信頼の設定ではなく、ワークフローのファイルです。
見え方
JavaScript のアクションの多くは @actions/core の core.getIDToken() で頼み、次のように失敗します:
Error: Error message: Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable
自分の言い方で出すアクションもあります:
azure/login:「Failed to fetch federated token from GitHub. Please make sure to give write permissions to id-token in the workflow.」のあと「Login failed with Error: Error message: Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable.」actions/deploy-pages:Ensure GITHUB_TOKEN has permission "id-token: write".google-github-actions/auth:「GitHub Actions did not inject $ACTIONS_ID_TOKEN_REQUEST_TOKEN or $ACTIONS_ID_TOKEN_REQUEST_URL into this job. This most likely means the GitHub Actions workflow permissions are incorrect, or this job is being run from a fork.」anthropics/claude-code-action:「Could not fetch an OIDC token. Did you remember to addid-token: writeto your workflow permissions?」aws-actions/configure-aws-credentialsはまた別の言い方です:AWS のページの4節。- trusted publishing の
npm publishはこれについて何も出さず、ログイン無しに戻ります:「ENEEDAUTH」。
1. ジョブの permissions に id-token: write が無い
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
- ワークフローが権限を1つでも書くと、書かなかった権限はすべて
noneになります(GitHub のワークフローの構文)。守りを固めるために先頭にpermissions: contents: readを足すと、トークンを持っていたジョブのどれからもトークンが消えます。id-tokenがとる値はwriteかnoneだけです。 - ジョブに
permissions:を書くと、そのジョブではワークフローの分が置き換わるので、そこにもid-token: writeが要ります。camunda-platform-helm #7771 では、contents: readとpull-requests: writeだけを持つリリース後のジョブと、ワークフローのpermissions: {}のままだった通知のジョブで、Vault へのログインが失敗しました。 - トークンのほかにも要るアクションがあります。
actions/deploy-pagesにはpages: write、actions/attestにはattestations: writeとartifact-metadata: writeも要ります(それぞれの README)。
ジョブが何を持っていたかは、「Set up job」のステップで見られます。トークンを頼めるジョブなら、「GITHUB_TOKEN Permissions」のグループに IdToken: write があります。
2. フォークからのプルリクエスト
フォークからの pull_request の実行では、permissions のキーで読む権限は足したり外したりできますが、書く権限はふつう与えられません(GitHub のワークフローの構文)。ファイルに id-token: write と書いても効きません。例外は、管理者が「Send write tokens to workflows from pull requests」を有効にしたプライベートのリポジトリです。よくある報告は、ブランチでは通るのに外からのプルリクエストではどれも落ちるジョブで、Nextstrain の共有の CI もそうでした(nextstrain/.github #178)。抜け道:
- フォークではそのステップを飛ばします。
pushにはプルリクエストが無いので、そちらは通す条件にします:if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
- Codecov:README によると、公開のリポジトリへのフォークからのプルリクエストはトークン無しでアップロードできるので、OIDC はトークンを持てる実行だけで使います:
- uses: codecov/codecov-action@v5 with: use_oidc: ${{ !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork) }} - claude-code-action のような AI のレビューのアクションは、フォークではそもそも動けません。そういう実行にはシークレットも渡らないからです。フォークでは飛ばすプロジェクトが多く、idvorkin.github.io #829 はすべてのプルリクエストで両方の問題が出ていました。
pull_request_targetは元のリポジトリのトークンで動き、id-token: writeも持てますが、フォークのコードをチェックアウトして実行してはいけません(GitHub の pull_request_target の案内)。
3. 再利用ワークフロー
呼ばれたワークフローは、受け取った権限を下げることはできても上げることはできません(GitHub の再利用ワークフローのドキュメント)。呼び出し側のジョブに id-token: write が無ければ、呼ばれたファイルに書いても足りません。組織や企業の外の再利用ワークフローには、呼び出し側で明示するようドキュメントに書かれています:
jobs:
deploy:
permissions:
id-token: write
contents: read
uses: octo-org/shared-workflows/.github/workflows/deploy.yml@v1
見分け方
- トークンは出たのに、クラウドが断った:Azure なら「AADSTS700213: No matching federated identity record found」、AWS なら「Not authorized to perform sts:AssumeRoleWithWebIdentity」、Google Cloud なら「The given credential is rejected by the attribute condition」。権限は足りていて、違うのは信頼の設定です。
- エラーコードつきの「Failed to get ID Token.」:変数はあって、GitHub への頼みが失敗しました。まずやり直してみます。
- 自分の
action.ymlに${{ env.ACTIONS_ID_TOKEN_REQUEST_URL }}と書いたアクションは、使うたびに「Set up job」で失敗します:action.yml の「Unrecognized named-value」。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。ほかの製品名はそれぞれの持ち主の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitHub Actions の OIDC で Azure に入れない · GitHub Actions の OIDC で AWS に入れない · 「Resource not accessible by integration」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English