S3のバケットに対して、特定のIPアドレスからのみ通信を受け付けるようにするためには、バケットポリシーに定義すればよい。
EC2インスタンスからのS3のアクセスについては、エンドポイントがない場合には、インターネットに一度パケットが出て行ってからS3にアクセスすることになってしまうため、IPアドレスでの制限が出来なくなってしまう。
解決方法としては、エンドポイントを設置して、通信をエンドポイント経由にすることでエンドポイントを使った制限とすることができる。
エンドポイントを介することによって、インターネットを経由しない通信にできるので、パケットがインターネットに出て行ってはいけないというセキュリティポリシーに準拠でき、EC2→S3への通信料課金が発生しなくなる。
下記バケットポリシーは、NNN.NNN.NNN.NNNとvpce-XXXXXXXXXXXXXからのみ通信を受け付ける定義になる。また、Principalには、*を定義しているが、厳密に権限定義が必要な場合には、AWS JSON ポリシーの要素:Principalを参考にして、記述する必要がある。
テストしている時には、 エンドポイントID(vpce-xxxxxx)ではなく、間違ってVPCID(vpc-xxxxxx)を指定してしまっていてハマってしまった。指定するIDがvpceから始まることを確認するとよい。
{
"Version": "2012-10-17",
"Id": "PolicyXXXXXXXXXXXX",
"Statement": [
{
"Sid": "XXXXXXXXXXXXX",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::(バケット名)",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "NNN.NNN.NNN.NNN"
},
"StringNotEquals": {
"aws:SourceVpce": "vpce-XXXXXXXXXXXXX"
}
}
}
]