プログラミング

AWS S3で「Access Denied」の発生原因と対応策

この記事は、S3でオブジェクトURLにアクセスで発生する「Access Denied」の原因と対応策をまとめたものです。

この記事で解決できるお悩み

  • S3にアップロードしたオブジェクトを公開したい。
  • S3のオブジェクトURLにアクセス時の「Access Denied」を解決したい。
  • S3のバケットポリシーの指定方法がわからない。
  • S3のバケットポリシーとACLはどちらで設定するべきか知りたい。

エラー内容

今回のエラー内容をまとめます。

発生パターン

  • S3にオブジェクトのアップロードは問題なくできている。
  • オブジェクトURLにアクセスすると「Access Denied」となり、オブジェクトを表示できない。

オブジェクトURLにアクセスすると次のようなレスポンスがあります。

S3で「Access Denied」の発生原因は?

発生原因をまとめると次のとおりです。

発生原因は?

  • バケットのアクセス許可で「パブリックアクセスをすべて ブロック」が有効である。
  • バケットのバケットポリシーが未設定、または正しく設定されていない。

S3で「Access Denied」の対応策は2ステップ

1:ブロックアクセスリストで「パブリックアクセスをすべてブロック」をオフにする

AWS マネジメントコンソールでS3に移動します。対象のバケットを開きます。

「アクセス許可」タブを選択します。

「ブロックパブリックアクセス (バケット設定)」の[編集]ボタンを押下します。

「パブリックアクセスをすべて ブロック」のチェックを外します。配下の4個のチェックボックスも自動で外れます。

[変更の保存]ボタンを押下します。

警告が表示されるため入力欄に「確認」と入力して、[確認]ボタンを押下します。

2:バケットポリシーでバケット内のオブジェクトにアクセス許可を付与する

次に「バケットポリシー」の[編集]ボタンを押下します。

ポリシーに下記のJSONをコピーして貼り付けます。「{ご自身のバケット名}」の部分はご自身のバケット名で置き換えます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Read",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::{ご自身のバケット名}/*"
        }
    ]
}

バケットポリシーが反映されました。

以上で設定ができました。オブジェクトURLにアクセスして表示できるか確認しましょう。

番外編:バケットポリシー未指定であれば、オブジェクト単位で公開設定可能

この章は番外編ですので、興味のある方だけどうぞ。

バケットポリシーを利用せずに、オブジェクト単位で公開設定可能です。

なお、前提として『ブロックアクセスリストで「パブリックアクセスをすべてブロック」をオフにする』は設定しておく必要があります。

オブジェクト所有者でACL(アクセスコントロールリスト)を有効にする

AWS マネジメントコンソールでS3に移動します。対象のバケットを開きます。

「アクセス許可」タブを選択します。

「オブジェクト所有者」の[編集]ボタンを押下します。

「ACL有効」を選択します。

「私は、ACL が復元されることを了承します。」をチェックします。

[変更を保存]を押下します。

対象オブジェクトのアクセス許可で設定変更する

公開設定するオブジェクトを選択して「アクセス許可」タブを開きます。

「アクセスコントロールリスト (ACL)」で[編集]ボタンを押下します。

「全員 (パブリックアクセス)」の「オブジェクト」で「読み込み」をチェックします。

「私は、これらの変更がこのオブジェクトに与える影響について理解しています。」をチェックします。

[変更を保存]ボタンを押下します。

バケットポリシーとACLの違いは?

アクセス制御は、バケットポリシーとACLの2つの設定方法があるため、整理すると次のとおりです。

バケットポリシーとACLの違いは?

  • バケットポリシー:バケットにアクセス権限を設定する
  • ACL:バケット内のオブジェクト他院でアクセス権限を設定する

基本的にはバケットポリシーを用いる運用で良さそうですね。

なぜなら、バケットポリシーとACLの両方が設定されている場合、バケットポリシーが優先されます。

また、ACLでオブジェクト個別に権限を設定するのであれば、はじめからバケットを分ける方が管理しやすいためです。

オブジェクトが追加されるたびに手動でACLで権限の設定はしんどすぎますね。

まとめ

ここまでの内容をまとめます。

ポイント

  • S3で「Access Denied」の発生原因は権限が付与されていないため。
  • 設定手順は2ステップ
    • バケットのアクセス許可で「パブリックアクセスをすべて ブロック」をオフにする
    • バケットのバケットポリシーですべてのオブジェクトで誰でも読み込み可能な設定を行う
  • バケット毎に用途がとこなるのであれば、別々のバケットを用いたほうが管理がしやすい。

S3はAWSのサービスの主要機能の1つですので、確実に理解しておきましょう。

-プログラミング
-