はじめに
AWS のサービスにアクセスする場合にはアクセスキーとシークレットを発行して Credentials の設定を行い、 AWS CLI や SDK を使ってアクセスするということが多いと思います。
S3 ではこの他にバケットポリシーを設定して特定の IPアドレスからのアクセスや VPCエンドポイントからのアクセスを許可するように設定することができます。
調査や解析用のログのデータがバケットに保存されていて 色々な環境から利用していたり、AWS を普段使わないプロジェクトのメンバーなども利用する場合に バケットポリシーでアクセス許可すると管理しやすいのではないかと思います。
バケットポリシーの使い方について色々調べて見て分かったことについてまとめておきます。
バケットポリシー覚え書き
バケットポリシーとユーザーポリシーの使用 - Amazon Simple Storage Service
ドキュメントはここにありました。
EffectAllowまたはDenyを指定します。 ポリシーを複数種類していする場合はStatementの要素を増やして指定できるようです。PrincipalPrincipalは使用者のような項目です。*設定の場合はすべての使用者が許可設定されます。 特定のIAMユーザーやIAMロールを指定することもできます。ActionActionは対象のサービスで行えることを設定します。 詳しくはここに書かれていました。 ポリシーでのアクセス許可の指定 - Amazon Simple Storage ServiceS3 のリードオンリーのアクションを設定するには
s3:Get*とs3:List*を設定するようです。ResourceResourceで対象のバケットを指定します。arn:aws:s3:::examplebucketは examplebucketバケットへの権限でファイル一覧を取得したりバケット情報取得に必要です。arn:aws:s3:::examplebucket/*は examplebucket に存在する全てのファイルに対する権限の指定です。Condition
IPアドレスの許可
社内からのアクセスなどはIPアドレスでの許可が設定しやすいと思います。
バケットポリシーの例 - Amazon Simple Storage Service
こちらに例がありました。
下のは IPアドレスにリードオンリー権限を与える例です。
Action, Principal, Resource などは配列で複数指定することができます。
(x.x.x.x/x, y.y.y.y/y, z.z.z.z/z に特定のIPを指定します)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IPAllow",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:Get*",
"s3:List*"
]
"Resource": [
"arn:aws:s3:::examplebucket",
"arn:aws:s3:::examplebucket/*"
]
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"x.x.x.x/x",
"y.y.y.y/y"
]
}
}
}
]
}
VPCの許可
VPCエンドポイントとアクセス元VPCの設定をすることができます。 VPCからのアクセスとして扱われるためにはVPCエンドポイント設定が必要になるようなので この二つの設定は似たような意味になると思います。
通常は EC2 などから S3 のリソースにアクセスするとインターネットを通してアクセスすることになりますが、 VPCエンドポイントを設定すると AWSネットワーク内で通信できるようになるようです。 おそらくプライベートIPで通信してアクセス元IPで判定される感じになるんじゃないかと思います。
https://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints-s3.html
料金の計算の仕方などがいまいちよくわからないのですが
ゲートウェイ VPC Endpoints - Amazon Virtual Private Cloud
ここを見ると追加料金なしで利用できますとかかれていました。
S3 の料金のページを見ると S3 から他のサービスへの転送は無料と書かれていたので、もしかすると 同一リージョンEC2 からダウンロードは安くなるのかもしれません。
ポリシー書き方の例はこちらにありました。
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/example-bucket-policies-vpc-endpoint.html
IAMユーザーやIAMロールの許可
バケットポリシーの例 - Amazon Simple Storage Service
Principal にIAMユーザー、IAMロールを指定して許可することができます。
IAM側に設定を追加するよりもバケットポリシーで設定する方が管理しやすいという場合もあると思います。
AWS CLIから使う
AWS CLI から使う場合にバケットポリシーでIP許可されていても認証しようとしてエラーになってしまう場合があります。
これは Credentials を設定していない場合はインスタンスメタデータを取得してIAMロールの判定を行おうとするからのようです。
この場合は --no-sign-request というオプションを使うことで回避できるようです。
s3 — AWS CLI 1.15.53 Command Reference
aws s3 cp requires credentials even for public files · Issue #904 · aws/aws-cli · GitHub
AWS SDKから使う
AWS SDK から使う場合も認証をしない方法が用意されているようです。
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.AwsClient.html#___construct
aws-sdk-php の場合は credentials を false にすることで認証しないということになるようでした。