S3オブジェクトの取得に必要な権限について検証してみた
はじめに
こんにちは、パオの人ことさすけです!
今回は Amazon S3 からオブジェクトを取得する際の IAM 権限について、初心者向けに解説します。
さっそく結論
S3 からオブジェクトを取得する際、AWS CLI を使用する場合に必要な権限は以下の通りです。
s3:GetObject
: オブジェクトを取得するための権限s3:ListBucket
: バケット内のオブジェクト一覧を確認するための権限(推奨)
GetObject
アクション自体は s3:GetObject
権限だけで動作しますが、オブジェクトが存在しない場合、AWS CLI では s3:ListBucket
がないと「403 Access Denied」エラーが返されます。s3:ListBucket
を付与すると「404 Not Found」が返り、エラー原因が明確になります。
そのため、実運用では両方の権限を付与することをおすすめします。
検証
実際に、s3:GetObject
だけで動作するのか、s3:ListBucket
がどのように影響するのかを検証します。
テスト用 IAM ポリシーを作成し、AWS CLI でオブジェクト取得を試みます。
s3:GetObject
のみで試す】
【ステップ1: 以下の IAM ポリシーをテスト用 IAM ユーザーに付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGetObject",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*"
}
]
}
このポリシーは s3:GetObject
のみを許可しています。
まず、存在するオブジェクトを取得します。
$ aws s3 cp s3://バケット ./ファイル名
download: s3://バケット名/オブジェクト名 to ./ファイル名
オブジェクトが存在する場合、s3:GetObject
だけで正常に取得できました。
次に、存在しないオブジェクト(例: no_such_file.png
)を試します。
$ aws s3 cp s3://バケット名/no_such_file.png ./no_such_file.png
fatal error: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
「403 Access Denied」エラーが発生しました。これは、CLI がオブジェクトの存在確認を行おうとした際に、s3:ListBucket
権限がないためです。
s3:ListBucket
を追加】
【ステップ2: 今度は s3:ListBucket
を追加したポリシーを適用します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowGetObject",
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::バケット名/*"
},
{
"Sid": "AllowListBucket",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::バケット名"
}
]
}
s3:GetObject
はオブジェクト(/*
)、s3:ListBucket
はバケットそのものに適用されるため、リソースを分離しています。
再度、存在しないオブジェクトを取得してみます。
$ aws s3 cp s3://バケット名/no_such_file.png ./no_such_file.png
fatal error: An error occurred (404) when calling the GetObject operation: Not Found
今度は「404 Not Found」が返されました。s3:ListBucket
により、CLI がオブジェクトの不在を正しく判定できたためです。
存在するオブジェクトの取得も、引き続き問題なく成功します。
まとめ
以上、S3 のオブジェクト取得に必要な権限を検証しました。ポイントは以下の通りです。
- オブジェクトが存在する場合、
s3:GetObject
だけで取得可能です。 - オブジェクトが存在しない場合、
s3:ListBucket
がないと「403 Access Denied」だが、付与されていると「404 Not Found」が返ります。
マネジメントコンソールではバケット一覧表示のために s3:ListAllMyBuckets
が必要になるなど、環境によって必要な権限が異なる場合があります。ぜひ、ご自身の環境で試してみてください。
アノテーション株式会社
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。