S3オブジェクトの取得に必要な権限について検証してみた

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 でオブジェクト取得を試みます。

【ステップ1: s3:GetObject のみで試す】

以下の 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 権限がないためです。

【ステップ2: s3:ListBucket を追加】

今度は 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サイトをご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.