Principalsに指定したIAMユーザを削除するとS3バケットポリシーが変化する

まさにこれに遭遇した。

dev.classmethod.jp

S3バケットポリシーにIAMユーザのアクセス許可を付与していた。 IAMユーザを削除したが、S3バケットポリシーの修正もれが生じていた。 S3バケットポリシーはterraformで管理していたが、IAMユーザの指定ではIAMユーザリソースで構成せず文字列で "arn:aws:iam::${data.aws_caller_identity.current.account_id}:user/temporary-user" のように指定していた。 このため削除時には気付けず後日ドリフトとして検知された。

誰が更新したのか調べるためにCloudTrailログを調査したがバケットポリシーの更新ログが存在しなかった。 また、バケットポリシーは不適切な内容に思え、実際マネコンのバケットポリシー編集画面で確認・保存しようとしたらエラーになった。

バケットポリシー編集画面で保存しようとするとエラーになる

上記の警告メッセージにある通り、IAMユーザarnから置き換えられた文字列はPrincipal IDで、Principal IDをマネコン等で確認することはできないもののPrincipal IDを指定してS3バケットポリシーを構築することはできるみたい。だからバケットポリシーの編集画面ではエラーではなく警告扱いになっている。 実際には非推奨であり、かつ存在しないPrincipal IDを指定することはできないので保存時にエラーとして弾いてくれる。

docs.aws.amazon.com

注意点として、このように置き換えてくれるのはPrincipalとして指定した場合のみで、Condition句などで利用しても置き換えられない。 これはPrincipal要素にIAMユーザやIAMロールを指し示すarnが含まれている場合に変換されることがドキュメントに記載されている。このためPrincipal要素以外で指定しても置き換えられない。 また、Principal要素にクロスアカウントでIAMユーザarnを指定することはできず、クロスアカウントの場合はAWSアカウントIDを指定する必要がある。

docs.aws.amazon.com