Amazon S3 バケットにアクセスできる VPC エンドポイントまたは IP アドレスを指定するにはどうすればよいですか?
最終更新日: 2020 年 12 月 18 日
特定の Amazon Virtual Private Cloud (VPC) エンドポイントまたは特定の外部 IP アドレスからのトラフィックでない限り、Amazon Simple Storage Service (Amazon S3) バケットへのトラフィックをすべてブロックしたいと考えています。あるいは、バケットを使用して静的ウェブサイトをホストしており、特定の VPC エンドポイントまたは IP アドレスからのみウェブサイトにアクセスできるようにしたいと考えています。どうすればそれができますか?
解決方法
バケットポリシーを使用して、S3 バケットにアクセスできる VPC エンドポイントまたは外部 IP アドレスを指定します。
注意: 外部 IP アドレスは、VPC 内または VPC 外からのパブリック IP アドレスです。たとえば、外部 IP アドレスは、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの Elastic IP アドレス、または VPC の NAT ゲートウェイまたはプロキシサーバーの IP アドレスにすることができます。
以下のバケットポリシーの例は、リクエストが指定された VPC エンドポイント (aws:sourceVpce) からのものでない限り、バケットへのトラフィックをブロックします。
{
"Id": "VPCe",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VPCe",
"Action": "s3:*",
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
],
"Condition": {
"StringNotEquals": {
"aws:SourceVpce": [
"vpce-1111111",
"vpce-2222222"
]
}
},
"Principal": "*"
}
]
}
次の点に注意してください。
- aws:sourceVpce 条件でこのポリシーを使用するには、Amazon S3 の VPC エンドポイント が EC2 インスタンスのサブネットのルートテーブルにアタッチされている必要があります。VPC エンドポイントは、バケットと同じ AWS リージョンにある必要があります。
- ユーザーが VPC エンドポイントまたは IP アドレスからバケットで S3 アクションを実行できるようにするには、ユーザーレベルのアクセス許可を明示的に許可する必要があります。AWS Identity and Access Management (IAM) ポリシーまたはバケットポリシーの別のステートメントのいずれかで、ユーザーレベルのアクセス許可を明示的に許可できます。
以下のバケットポリシーの例は、リクエストが指定された外部 IP アドレス (aws:SourceIp) からのものでない限り、バケットへのトラフィックをブロックします。
{
"Id": "SourceIP",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SourceIP",
"Action": "s3:*",
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::DOC-EXAMPLE-BUCKET",
"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"11.11.11.11/32",
"22.22.22.22/32"
]
}
},
"Principal": "*"
}
]
}
警告: これらのバケットポリシーの例では、許可された VPC エンドポイントまたは IP アドレス外のリクエストへのアクセスを明示的に拒否します。バケットポリシーを入力したユーザーであっても、ユーザーが条件を満たさない場合、バケットへのアクセスを拒否できます。バケットポリシーを保存する前に、慎重に確認する必要があります。誤ってロックアウトされた場合は、「誤って全ユーザーの Amazon S3 バケットへのアクセスを拒否してしまいました。」をご参照ください。アクセスを再取得するにはどうすればよいですか?
ユーザーが許可された VPC エンドポイントまたは IP アドレスからリクエストを送信していない場合でも、特定のユーザーに (同じ AWS アカウント内の) バケットへのアクセスを許可する必要があるときは、バケットポリシーの同じ Condition ブロック内に次のステートメントを含めることができます。
- AROAEXAMPLEID は許可する IAM ロールのロール ID です。
- AIDAEXAMPLEID は許可する IAM ユーザーのユーザー ID です。
- 111111111111 はアカウントのルート認証情報を表すバケットの AWS アカウント ID です。
"StringNotLike": {
"aws:userId": [
"AROAEXAMPLEID:*",
"AIDAEXAMPLEID",
"111111111111"
]
}
特定の IAM ロールへのアクセスを許可する方法の詳細については、「How to restrict Amazon S3 bucket access to a specific IAM role」を参照してください。