0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

マスクされて読めない CircleCI の OIDC 用 Role ARN を、AWS の信頼ポリシーから逆引きする

0
Posted at

CircleCI から AWS へ OpenID Connect(OIDC)でデプロイする構成では、引き受ける IAM Role の ARN を AWS_ROLE_ARN などの環境変数として Context や Project に登録します。ところがこの値は登録後に CircleCI の画面で読めなくなり、複数の Role を運用していると「どの Role を設定したのか」が後から分からなくなります。

スクリーンショット 2026-06-23 17.02.04.png

この記事では、「自組織の CircleCI OIDC プロバイダーを信頼している IAM Role」をaws iam list-rolesjq で特定する方法を紹介します。

なお、AWSとCircleCIをOIDCで連携する方法については、以下の記事をご覧ください。

記事中のコマンド例は <AWS_ACCOUNT_ID><ORG_ID> をプレースホルダで記載しています。掲載しているスクリーンショットは実際の環境で実行した結果のため、これらの箇所には具体的な値が表示されています。コマンドを実行する際は、ご自身の AWS アカウント ID と CircleCI 組織 ID に置き換えてください。

AWS CLIでCircleCIが利用しているIAMロールを取得する

OIDC で AWS に接続する IAM Role は、その信頼ポリシー(AssumeRolePolicyDocument)の Principal.Federated に、組織ごとに一意な OIDC プロバイダーの ARN を持っています。この ARN を手がかりに Role の取得を試みます。

取得方法は以下の3ステップです。

  1. CircleCI の組織 ID(Organization ID)を取得する
  2. その組織 ID から OIDC プロバイダーの ARN を組み立てる
  3. AWS CLI でその ARN を信頼している IAM Role を逆引きする

ステップ1:CircleCI の Organization ID を取得する

OIDC プロバイダーの ARN には、組織ごとに一意な組織 ID が含まれます。まずこの値を取得します。CircleCI のダッシュボードから Organization Settings を開き、Overview ページに表示される Organization ID をコピーします。

CircleCI Organization Settings の Overview ページに表示される Organization ID

組織 ID は UUID 形式の文字列です。このあとのステップで OIDC プロバイダー ARN の組み立てに使用します。

ステップ2:OIDC プロバイダーの ARN を組み立てる

CircleCI の OIDC プロバイダーは、IAM 上では次の構造の ARN で表されます。<AWS_ACCOUNT_ID> には AWS アカウント ID を、<ORG_ID> にはステップ1 で取得した組織 ID を入れます。

arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/oidc.circleci.com/org/<ORG_ID>

この ARN は手で組み立てられますが、アカウント内に実際に存在するプロバイダーの ARN を確認したい場合は、マネジメントコンソールの Amazon Q に組織 ID を渡して検索する方法が手軽です。次のように依頼すると、該当する OIDC プロバイダーを見つけてくれます。

circleci org id: <ORG_ID> の oidc provider を探してください。ARN が必要です。

Amazon Q が組織 ID から CircleCI 用 OIDC プロバイダーを 1 件見つけた様子

特定の組織 ID に対応するプロバイダーを 1 件だけ探すような単発の調べ物は、Amazon Q が手早く答えてくれます。

ステップ3:AWS CLI で信頼している IAM Role を逆引きする

組み立てた OIDC プロバイダーの ARN を使って、それを信頼している IAM Role を逆引きしましょう。

aws iam list-roles で全 Role を取得し、jq で各 Role の信頼ポリシーの Principal.Federated がプロバイダー ARN に一致するものだけを抽出します。

次のコマンドは、一致した Role の名前・ARN・作成日時・最終使用日時を出力します。<AWS_ACCOUNT_ID><ORG_ID> はご自身の値に置き換えてお使いください。

aws iam list-roles --output json | jq -r '
  .Roles[]
  | select(
      .AssumeRolePolicyDocument.Statement[]?
      | select(.Principal.Federated? == "arn:aws:iam::<AWS_ACCOUNT_ID>:oidc-provider/oidc.circleci.com/org/<ORG_ID>")
    )
  | {
      RoleName: .RoleName,
      Arn: .Arn,
      CreateDate: .CreateDate,
      RoleLastUsed: .RoleLastUsed.LastUsedDate
    }
'

実行すると、次のように一致した Role の情報が得られます。

{
  "RoleName": "circleci-oidc-deploy",
  "Arn": "arn:aws:iam::<AWS_ACCOUNT_ID>:role/circleci-oidc-deploy",
  "CreateDate": "2026-04-01T09:12:33+00:00",
  "RoleLastUsed": "2026-06-20T14:08:51+00:00"
}

OIDC 用の Role が複数見つかった場合は、RoleLastUsed(最終使用日時)で現在実際に使われている Role を、CreateDate(作成日時)でいつ作られた Role かを判断できます。Role 名と ARN だけが必要であれば、jq の出力部分を .Arn などに絞れば一覧だけが得られます。

list-rolesページネーション対応の操作で、AWS CLI は全件を取得するために必要な API 呼び出しを自動的に繰り返します。そのため Role の数が多いアカウントでも漏れなく取得できます。同じ検索をマネジメントコンソールの Amazon Q に依頼したところ、Amazon Q 自身が「アカウント内に 356 個の Role があるのに 80 個分しか取得しておらず、ページネーションがあるのに全件を検索していなかった」と報告しました。網羅的に探す用途では、自動ページングで全件を扱う AWS CLI が確実です。

Amazon Q が 356 件中 80 件しか取得できておらずページネーションを行っていなかったと報告している様子

マネジメントコンソールしか使えない場合でも、CloudShell を開けば同じ AWS CLI コマンドをそのまま実行できます。

うまくいかない場合の確認ポイント

逆引きの結果が空になる、あるいは期待した Role が出てこない場合は、次の点を確認してください。

一致する Role が 1 件も出力されない場合

Principal.Federated に指定した ARN の文字列が、実際の信頼ポリシーの値と完全に一致しているかを確認します。AWS アカウント ID や組織 ID の取り違え、oidc.circleci.com/org/ 部分の打ち間違いが主な原因です。ステップ2 で Amazon Q に確認した実際のプロバイダー ARN と突き合わせると確実です。

信頼ポリシーに複数のフェデレーション主体がある場合

Principal.Federated が単一の文字列ではなく配列になっている Role では、== "..." による完全一致では拾えないことがあります。その場合は jq の比較を contains や配列を考慮した書き方に変更すると、取りこぼしを防げます。

コマンドがエラーになる場合

iam:ListRoles 権限が不足していると失敗します。実行中の認証情報とアタッチされた権限を aws sts get-caller-identity で確認してください。

まとめ

CircleCI の Context や Project に登録した OIDC 用の Role ARN は、保存後に画面で読めなくなるため、複数の Role を運用していると判別できなくなります。この記事では、CircleCI 側の値を復元するのではなく、AWS 側で OIDC プロバイダーを信頼している IAM Role を aws iam list-rolesjq で逆引きして特定する方法を紹介しました。

予防策としては、CircleCIの設定についてもTerraformでIaC化する方法があります。Terraformを利用してコードでContextや設定を管理することができますので、AWSのIAMロール等の管理と併せてご利用ください。

より詳しく学ぶためのリソース

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?