Bitbucket Pipelines の OIDC で AWS:「Not authorized to perform sts:AssumeRoleWithWebIdentity」
OpenID Connect を使うと、Pipelines のステップは保存した AWS のキーの代わりに署名つきのトークンを受け取り、それをロールの一時的な認証情報に替えます。AWS はトークンを、アカウントに登録した ID プロバイダとロールの信頼ポリシーに照らします。どこかが合わないと、AWS CLI は次のどちらかで止まります。
An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity An error occurred (InvalidIdentityToken) when calling the AssumeRoleWithWebIdentity operation: Incorrect token audience
ステップと変数
Atlassian の記事 OIDC authentication issues troubleshooting(英語・2025年9月25日更新)は、最初にステップを見ます。oidc: true が要ります。トークンは BITBUCKET_STEP_OIDC_TOKEN で届き、ステップごとに別のものです。新しい概要の OIDC を使用して Pipelines とリソース サーバーを統合するには、いまは既定で有効とあります。ただ、この記事も AWS のページもステップに書いているので、書いておいて損はありません。
そのうえで AWS CLI には、リージョン、ロール、トークンを入れたファイルが要ります。Atlassian の Bitbucket Pipelines OpenID Connect を使用して AWS にデプロイするから:
image: amazon/aws-cli
pipelines:
default:
- step:
oidc: true
script:
- export AWS_REGION=us-west-2
- export AWS_ROLE_ARN=arn:aws:iam::XXXXXXXXXXXX:role/oidc-demo
- export AWS_WEB_IDENTITY_TOKEN_FILE=$(pwd)/web-identity-token
- echo $BITBUCKET_STEP_OIDC_TOKEN > $(pwd)/web-identity-token
- aws s3 cp s3://bucket/XXXXXX ./XXXXXXX
上の記事は、3つ目の変数を AWS_WEB_IDENTITY_ROLE_FILE と書いています。AWS CLI はこの名前を読みません。AWS CLI の環境変数(英語)にあるのは、上の例と同じ AWS_WEB_IDENTITY_TOKEN_FILE です。
ID プロバイダとオーディエンス
リポジトリの設定の Pipelines の下の OpenID Connect に、Identity provider URL と Audience が出ています。AWS の IAM では、Identity providers、Add provider、OpenID Connect でこの2つを入れます。Atlassian のトークンの例によると、URL は https://api.bitbucket.org/2.0/workspaces/<ワークスペース>/pipelines-config/identity/oidc、オーディエンスは ari:cloud:bitbucket::workspace/<ワークスペースの UUID> の形です。プロバイダはワークスペースごとなので、別のワークスペースのリポジトリには、そのワークスペースのプロバイダが要ります。
「Incorrect token audience」は、トークンのオーディエンスが AWS に登録したものと違うということです。Atlassian のこのエラーの記事(Troubleshooting pipeline build failing with ... Incorrect token audience、英語・2025年9月25日更新)は、Bitbucket の値をプロバイダのオーディエンスにもう一度写すよう書いています。もう1つの道もあります。YAML のステップか options に oidc: audiences: を書くと、トークンのオーディエンスを自分で決められます(10個まで・Atlassian の概要)。その場合、AWS のプロバイダにもトークンが持つ値が要ります。
信頼ポリシーと sub
ロールの信頼されたエンティティは Web identity で、そのプロバイダとオーディエンスを選びます。さらに絞るときは、信頼ポリシーでトークンの sub を見ます。Atlassian はこう組み立てています。
{REPOSITORY_UUID}[:{ENVIRONMENT_UUID}]:{STEP_UUID}
- 環境の部分は、ステップに
deploymentの環境があるときだけ入ります。環境を求めるポリシーは、環境の無いステップを全部断ります。 - UUID は、Atlassian の例のとおり波かっこつきです。Bitbucket の OpenID Connect の画面の例のペイロードの下に出ていて、デプロイ環境は一覧から選べます。
- 条件のキーは、プロバイダのアドレスから
https://を除いたものに:subを付けた形です。
1つのリポジトリだけを許す Atlassian のポリシー:
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::{AWS_ACCOUNT_NUMBER}:oidc-provider/api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringLike": {
"api.bitbucket.org/2.0/workspaces/{WORKSPACE}/pipelines-config/identity/oidc:sub": "{REPO_UUID}:{*}"
}
}
}
デプロイのステップだけにするとき、同じページは "{REPO_UUID}*:{ENVIRONMENT_UUID}:*" を使っています。
ロールは引き受けたのに、呼び出しが断られる
その後の呼び出しが AccessDeniedException ... because no identity-based policy allows the ... action で止まることもあります。Atlassian の記事 Pipelines gives an error "An error occurred (AccessDeniedException) when calling the operation" despite providing authorization via OIDC(英語・2025年9月25日更新)が、わけの1つを書いています。ワークスペース・リポジトリ・デプロイの変数はステップに環境変数として届きます。そして AWS CLI は、Web ID でロールを引き受けるより先に、環境変数の AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY を使います。古いキーが変数に残っていると、そちらが勝つわけです。消すか、意図して書き換えます。そうでなければロールの権限が足りないので、ロールの許可ポリシーにその操作を足します。
IntelliJ IDEA で Bitbucket Pipelines を見る
Pipeline Inbox for Bitbucket Pipelines は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。Bitbucket Cloud の全部のリポジトリのパイプラインを IDE のツールウィンドウに並べ、ステップ、失敗したステップと止まったコマンド、Bitbucket が書くそばから伸びるステップのログを見せます。一覧・ステップ・ログは無料。パイプラインの実行・やり直し・停止は Pro(月 US$1.50・30日の無料試用つき)。
Atlassian・Bitbucket・Bitbucket Pipelines は Atlassian の商標、AWS は Amazon.com, Inc. またはその関連会社の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは Atlassian・Amazon・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:テストの結果が出ない · 変数が空になる · 「Host key verification failed」(SSH) · 「Cannot connect to the Docker daemon」 · 「authorization denied by plugin pipelines」(Docker) · 「Container 'docker' exceeded memory limit.」 · push したのに Pipelines が動かない · 「Container 'Build' exceeded memory limit.」 · 「Exceeded build time limit of 120 minutes」 · キャッシュが効かない · 「unexpected system error」 · 「command not found」 · サブモジュールを取ってこない · 「We couldn't clone the repository」 · 「No online runner available」 · 「No space left on device」 · 「Step exceeded processing limits」 · 次のステップにアーティファクトが無い · 前は通ったビルドが今は落ちる · Build setup に時間がかかる · ビルド時間を使い切った · 「Permission denied to update branch」 · 「You have reached your pull rate limit」(Docker Hub) · 「There is an error in your bitbucket-pipelines.yml」 · 「This pipeline was paused」(デプロイ) · サービスに「Connection refused」(MySQL・PostgreSQL・Redis) · 「Container 'build' failed to pull image」 · IntelliJ IDEA の Bitbucket Pipelines 用プラグインの比較 · English