Amazon S3 バケットにある特定のフォルダへのアクセス権を、ユーザーに付与するにはどうすればよいですか?
最終更新日: 2020 年 11 月 5 日
AWS Identity and Access Management (IAM) ユーザーに対し、Amazon Simple Storage Service (Amazon S3) バケットにある特定のフォルダーへのアクセス権を付与したいと思います。その方法を教えてください。
解決方法
IAM ユーザーが、S3 バケットと同じ AWS アカウントに属しているのであれば、IAM ポリシーを使用して、そのバケットの特定のフォルダーに対するアクセス権を、ユーザーに付与することができます。バケットのポリシーで、対象のフォルダーに対するユーザーからのアクセスを明示的に拒否していなければ、IAM ポリシーによりアクセス権を付与するだけで、バケット側のポリシーを変更する必要はありません。 IAM ポリシーは、個別の IAM ユーザーに追加することも、複数のユーザーが切り替えられるように IAM ロールにアタッチすることも可能です。
IAM ID(ユーザーもしくはロール)と S3 バケットが、それぞれ異なる AWS アカウントに属している場合は、IAM ポリシーとバケットポリシーの両方に、アクセス権を付与する必要があります。クロスアカウントのアクセスの詳細については、別の AWS アカウントのユーザーに、オブジェクトを Amazon S3 バケットにアップロードするアクセス権を与えるにはどうすれば良いですか?、を参照してください。
次に示す IAM ポリシーの例では、DOC-EXAMPLE-BUCKET/media フォルダーから、Amazon S3 コンソールを使用してオブジェクトをダウンロードすることを、ユーザーに許可しています。このポリシーには以下のようなステートメントが含まれています。
- AllowStatement1 により、ユーザーに対し、同じ AWS アカウントに属するバケットをリストする権限を付与します。ユーザーには、コンソールを使用して対象のバケットを開くために、この権限が必要です。
- AllowStatement2A により、ユーザーが DOC-EXAMPLE-BUCKET にあるフォルダーをリストできるように許可します。このリストは、ユーザーがコンソールを使用してフォルダーを開くために必要です。同時にこのステートメントでは、ユーザーがコンソールを使用して、プレフィックス media/ により検索することも許可しています。
- AllowStatement3 では、DOC-EXAMPLE-BUCKET/media にあるコンテンツをリストする権限を、ユーザーに対し付与します。
- AllowStatement4A により、DOC-EXAMPLE-BUCKET/media フォルダーからオブジェクト(s3:GetObject)をダウンロードすることを、ユーザーに対し許可します。
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowStatement1",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowStatement2A",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
"Condition":{"StringEquals":{"s3:prefix":["","media"]}}
},
{
"Sid": "AllowStatement3",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
"Condition":{"StringLike":{"s3:prefix":["media/*"]}}
},
{
"Sid": "AllowStatement4A",
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/media/*"]
}
]
}
別の例として次の IAM ポリシーでは、DOC-EXAMPLE-BUCKET/media に対するオブジェクトのダウンロードとアップロードを、(AWS Command Line Interface (AWS CLI) あるいは the Amazon S3 API などの)コンソールもしくはプログラム的な手段により実行することを、ユーザーに許可しています。前出の IAM ポリシーとの違いは次のとおりです。
- AllowStatement2B には "s3:delimiter":["/"] が含まれています。この記述により、オブジェクトのパスに含まれるフォルダーの区切り記号として、スラッシュ(/)を指定しています。ユーザーが、AWS CLI あるいは Amazon S3 API を使用してリクエストを生成する場合は、区切り記号を指定しておくことがベストプラクティスです。
- AllowStatement4B により、DOC-EXAMPLE-BUCKET/media フォルダーに対するオブジェクトのダウンロード(s3:GetObject)とアップロード(s3:PutObject)を、ユーザーに許可しています。
{
"Version":"2012-10-17",
"Statement": [
{
"Sid": "AllowStatement1",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::*"]
},
{
"Sid": "AllowStatement2B",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
"Condition":{"StringEquals":{"s3:prefix":["","media"],"s3:delimiter":["/"]}}
},
{
"Sid": "AllowStatement3",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET"],
"Condition":{"StringLike":{"s3:prefix":["media/*"]}}
},
{
"Sid": "AllowStatement4B",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": ["arn:aws:s3:::DOC-EXAMPLE-BUCKET/media/*"]
}
]
}