目次
1.はじめに
2.構成図
3.マネジメントコンソールから S3 を操作できなくなった原因
4.対応策
5.まとめ
1.はじめに
「VPC上の特定のエンドポイントからのみS3バケットにアクセスさせたい」という要件は結構あると思います。
私はある案件で、S3のバケットポリシー上で上記のようなポリシーを作成した結果、マネジメントコンソールからS3操作ができなくなった経験がありますので、自分への戒めとしてブログに残します。
2.構成図
実際の案件で作成した構成はもっと複雑なものになりますが、分かりやすいように簡素化しております。
EC2(Amazon Linux) から VPC ゲートウェイエンドポイント経由で S3 へアクセスする構成です。
3.マネジメントコンソールから S3 を操作できなくなった原因
S3 バケットで以下のようなバケットポリシーを設定しました。
(VPC エンドポイントを経由しない場合は、すべての操作を拒否するバケットポリシーです。)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAccessIfNotFromSpecificVPCE",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<S3バケット名>",
"arn:aws:s3:::<S3バケット名>/*"
],
"Condition": {
"StringNotEquals": {
"aws:sourceVpce": "<VPCエンドポイントのID>"
}
}
}
]
}
結果、「オブジェクトを一覧表示するアクセス許可が不十分です」というメッセージが表示されるようになり、S3 の設定値の確認や変更ができなくなりました。
4.対応策
VPC エンドポイント経由であれば、S3 に対しての Put 権限があるため、バケットポリシーを記載した json ファイルを S3 にアップロードすることを考えました。
① 以下のコマンドを実行し、vi エディタを開きます。
vi Bucket-Policy.json
② vi エディタが開くので、以下のバケットポリシーを記述して保存します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAllS3ActionsOnSpecificBucket",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<S3バケット名>",
"arn:aws:s3:::<S3バケット名>/*"
]
}
]
}
③ 以下のコマンドを実行し、バケットポリシーを記載した json ファイルを S3 にアップロードします。
aws s3api put-bucket-policy --bucket <your-bucket-name> --policy file://Bucket-Policy.json
⇒ 結果、バケットポリシーを設定する権限がないと言われました。
An error occurred (AccessDenied) when calling the PutBucketPolicy operation: User: arn:aws:sts::<Account ID>:assumed-role/PutS3Role/<インスタンス ID> is not authorized to perform: s3:PutBucketPolicy on resource: "arn:aws:s3:::<S3バケット名>" because no identity-based policy allows the s3:PutBucketPolicy action
⇒ そのため、EC2 にアタッチしている IAM ロールに対して一時的に AdministratorAccess ポリシーを追加します。
リトライ(1回目)
① 再度以下のコマンドを実行し、バケットポリシーを記載した json ファイルを S3 にアップロードします。
aws s3api put-bucket-policy --bucket <your-bucket-name> --policy file://Bucket-Policy.json
⇒ 結果、パブリックアクセスと思われ拒否された模様。
An error occurred (AccessDenied) when calling the PutBucketPolicy operation: User: arn:aws:sts::<Account ID>:assumed-role/PutS3Role/<インスタンス ID> is no
t authorized to perform: s3:PutBucketPolicy on resource: "arn:aws:s3:::<S3バケット名>" because public policies are blocked by the BlockPublicPolicy block publ
ic access setting.
⇒ なので、パブリックアクセスブロックを無効化してみます。
② 以下のコマンドを実行し、vi エディタを開きます。
vi Public-Access.json
③ vi エディタが開くので、以下の設定を記述して保存します。
{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": false,
"RestrictPublicBuckets": true
}
④ 以下のコマンドを実行し、パブリックアクセスブロックを無効にします。
aws s3api put-public-access-block \
--bucket <S3バケット名> \
--public-access-block-configuration file://Public-Access.json
リトライ(2回目)
① 再度以下のコマンドを実行し、バケットポリシーを記載した json ファイルを S3 にアップロードします。
aws s3api put-bucket-policy --bucket <your-bucket-name> --policy file://Bucket-Policy.json
⇒ 今回はエラーなし!
② マネジメントコンソールに戻り、リロードしてみると「オブジェクトを一覧表示するアクセス許可が不十分です」というメッセージが表示されなくなりました。(よかった)
5.まとめ
今回はバケットポリシーの設定ミスによって、マネジメントコンソールから S3 の操作が行えなくなった際の対処方法を記載しました。
私の場合は、エンドポイント経由での S3 操作権限があったので何とかなりましたが、そうでない場合はルートユーザーを利用するなどして対応する必要があるかと思います。
バケットポリシーを設定する際は気を付けましょう。


