Invalid principal in policyが出たら確認したい!IAMロール・IAMユーザーが削除されるとPrincipal要素のARNがプリンシパルIDに置き換わります

2024.04.18

データアナリティクス事業本部インテグレーション部機械学習チーム・新納(にいの)です。最近躓いたIAMに関する小ネタをお届けします。

S3バケットポリシーのPrincipal要素に謎のIDが指定されている

皆さんは、バケットポリシーを確認したときに心当たりのない謎のIDがPrincipal要素に指定されていた経験はありませんか?私はあります。

IAMロール・IAMユーザーが削除されるとARNがプリンシパルIDに置き換わる

このIDの正体はIAMロール・IAMユーザーが削除された際にARNから置き換えられるプリンシパルIDです。

Principal要素に指定されたIAMロール・IAMユーザーは、このプリンシパルIDに変換されます。IAM ユーザーであればAIDA、IAM ロールであればAROAというプレフィックスを持ちます。

ところが、IAMロール・IAMユーザーが存在しない場合は有効なARNにマッピングできず、プリンシパルIDのみが表示されます。

参考:

Principal要素をこのままにしておくと、特にバケットポリシーを編集する際にInvalid principal in policyというエラーが発生します。

Invalid principal in policyが出たらまず確認すること

S3バケットポリシーのエラーでInvalid principal in policyが表示されたら、まずは以下の要素を確認します。

  • Principal要素に以下を指定していないこと
    • 存在しないAWS アカウント
    • 存在しないAWS アカウントがARNに含まれている
    • 存在しないIAMユーザー・IAMロール
  • 特にCloudFormationでIAMロールやIAMユーザーを作成している場合、バケットポリシーの作成がPrincipalに指定するIAMロール・IAMユーザーの作成よりも先に完了していないこと
  • Principal要素の書き方が有効なフォーマットに沿っている

参考:

今回は「存在しない IAM ユーザーもしくは IAM ロール」が指定されていることが原因ですので、プリンシパルIDを有効なARNに置き換える必要があります。

CloudFormationやCDKでS3バケットを管理している場合

CloudFormationやCDKでS3バケットを定義している場合、どの部分でエラーが発生しているのか分かりにくく、なかなか原因箇所に気付きづらいかもしれません。どの行でエラーが発生しているか、エラーメッセージからは読み取りにくいためです。

このような場合は、テンプレートに記述したバケットポリシーをS3バケットのマネジメントコンソール画面に貼り付けて確認すると問題箇所を指摘してくれます。

最後に

IAMロール・IAMユーザーが削除されるとPrincipal要素に指定したARNがプリンシパルIDとして表示され、Invalid principal in policyの原因となり得るという話でした。特に既存のポリシーに追加をしたい場合などで、過去分のPrincipalが置き換えられてる場合はなかなか気付きづらいかと思います。AIDAAROAの心当たりのないプレフィックスを持ったIDを見つけたらこのブログを思い出していただけると幸いです。