はじめに
まずS3のバケットに対して、指定したIPからのみアクセス許可するIAMポリシーを紹介します。VPCプライベートサブネットからのアクセスを許可する場合は、NATゲートウェイのグローバルIPを指定するのではなく、「VPCエンドポイント」を指定する方が良いため、こちらの設定を紹介します。
設定方法
IPアドレスによるアクセス制限
グローバルIPを指定したアクセス制限のIAMポリシーの例です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "XXXXXXXXXX",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<バケット名>",
"Condition": {
"IpAddress": {
"aws:SourceIp": "<IPアドレス>/32"
}
}
},
{
"Sid": "XXXXXXXXXX",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::<バケット名>/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "<IPアドレス>/32"
}
}
}
]
}
VPCエンドポイントによるアクセス制限
VPCプライベートサブネットからS3のバケットにアクセスする場合でも、NATゲートウェイを使用して、上記の設定でNATのグローバルIPを指定することも可能です。
しかしVPCプライベートサブネットからのアクセス制限をする場合、NATゲートウェイ経由とするのではなく、VPCエンドポイントを使用することをおすすめします。
メリットとして、インターネット経由でのアクセスからではなくなるためセキュアとなります。さらにNATを通過しないため、NATのネットワーク負荷が軽減させることができます。
またインターネット経由で接続するよりも料金も安く、デメリットは特にないです。
注意点としては、VPCエンドポイントを経由したアクセスにする場合、S3のバケットとVPCが同じリージョンである必要があるため気をつけてください。
-
VPCエンドポイントを、プライベートサブネット上に作成します。
作成はVPCのメニューから可能です。 -
IAMポリシーの設定
IPアドレスを指定するのでなく、VPCエンドポイントIDを指定して、アクセス制限をすることが可能です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "xxxxxxxxxx",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::<バケット名>",
"Condition": {
"StringEquals": {
"aws:sourceVpce": "<VPCエンドポイントID>"
}
}
},
{
"Sid": "xxxxxxxxxx",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::<バケット名>/*",
"Condition": {
"StringEquals": {
"aws:sourceVpce": "<VPCエンドポイントID>"
}
}
}
]
}
参考
https://qiita.com/flat-8-kiki/items/5392d931d8e34a4e2ae4
https://dev.classmethod.jp/cloud/vpc-endpoint-for-s3/
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html