AWS S3のバケットポリシーのサイズ制限に対する
プリンシパルタグによる対応方法
投稿日: 2025/01/20
はじめに
S3バケットポリシーには、ポリシーサイズが20,480バイト(20 KB)以内である必要があるという制限があります。
S3バケットをデータレイクとして利用するにあたり、利用グループごとに異なるプリフィックス(フォルダ)へのアクセス権限を定義しようとした結果、この制限に直面し、ポリシーの見直しが必要となりました。
IAMユーザ、ロール、またはグループのポリシーにS3のアクセス権を定義すればサイズ制限が回避できます。しかしながら、S3へのアクセス権限を可能な限りバケットポリシーに集約する方針としていたこともあり別の方法を模索いたしました。
結果としてプリンシパルタグを活用して、バケットポリシーの記述量を大幅に抑える方法にたどり着き実際に採用いたしました。
本稿では、この際に検証した内容を踏まえて、プリンシパルタグを利用したバケットポリシーの設定方法について解説します。
想定ユースケース
想定するユースケースは以下の通りです。データレイク用のバケットの下に、グループ別の情報を格納するための「Groups」フォルダを作成し、その下に、それぞれのグループ専用のフォルダを作成してアクセス権限を制御することを想定します。
フォルダ構成は以下の通りです。
└─groups
├─GroupA ・・ (グループAメンバーのみアクセス可能なフォルダ)
└─GroupB ・・(グループBメンバーのみアクセス可能なフォルダ)
設定内容
グループに対応するロールの作成および権限設定
バケットポリシーで直接グループに対する権限制御を行うことは出来ない為、グループと1対1に対応するロールを作成します。また、グループメンバーがロールを引き受けることができるようにグループポリシーにAssumeRole権限を設定します。
以下がグループAに対するグループポリシー設定例です。(グループBについても同様に設定します。)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::[アカウントID]:role/GroupARole"
}
]
}
ロールへのタグの付与
作成したロールにタグを付与します。「GroupName」というキーでグループ名を設定します。
以下がグループAロール(GroupARole)に対するタグ設定例です。
値:GroupA
バケットポリシー設定
以下のように設定することで、プリンシパルタグによるアクセス制御が可能になります。
ロールに設定したGroupNameタグの内容とフォルダ名が一致することを条件にするように設定しています。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGetObjectMatchingGroupNamePrefix",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::[アカウントID]:role/GroupARole",
"arn:aws:iam::[アカウントID]:role/GroupBRole"
]
},
"Action": "s3:GetObject",
"Resource":"arn:aws:s3:::example-bucket-xxxxxxxx/groups/${aws:PrincipalTag/GroupName}/*"
},
{
"Sid": "AllowListBucketMatchingGroupNamePrefix",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::[アカウントID]:role/GroupARole",
"arn:aws:iam::[アカウントID]:role/GroupBRole"
]
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::example-bucket-xxxxxxxx",
"Condition": {
"StringLike": {
"s3:prefix": "groups/${aws:PrincipalTag/GroupName}/*"
}
}
}
]
}
この設定の何が良いのか?
プリンシパルタグを用いない場合は、アクセス権を付与するフォルダとロールの組み合わせ毎にSIDを追加してポリシーを作成する必要があります。
それに対して、プリンシパルタグを用いることで、今回採用したグループ名とフォルダ名を一致させる方針においてはバケットポリシーに対してロールを追加するだけで済むため大幅な記述量の削減になりポリシーサイズの制限への対策になります。
補足事項
- IAM Identity Center が AWS アカウントで作成した対応するロールにはタグを適用できないため、この対応方法は使えません。
- 同一のAWSアカウントにプリンシパル(ユーザ/ロール)がある場合は、バケットポリシーにアクセス権を設定しなくても、プリンシパルのポリシーにバケットへのアクセス権限を定義すればアクセスは可能となります。したがって、バケットポリシー側でのアクセス権を制御する方針を徹底したい場合は、プリンシパルとバケットを別のアカウントに配備すると実現できます。
- S3バケットポリシーのサイズ制限への対応方法は、Lake FormationやS3 Access Grantsも候補になります。
まとめ
S3バケットポリシーのサイズ制限に対処するため、プリンシパルタグを活用した例をご紹介いたしました。これにより、バケットポリシーの記述量を大幅に削減し、アクセス権限の管理を効率化できます。
CTCは、AWSのビジネス利活用に向けて、お客様のステージに合わせた幅広い構築・運用支援サービスを提供しています。
経験豊富なエンジニアが、ワンストップかつ柔軟にご支援します。
ぜひ、お気軽にお問い合わせください。