概要
アプリケーションを作成していて,S3に画像を置いて公開したかった.
既にユーザーからの入力などを保存しておく非公開のバケットを作成していた.
画像を配信するには公開用のバケットを別途作成しなければいけないかと思っていたが,バケットの一部分のファイルのみを公開することができるらしい
これにより1つのアプリケーションで複数のバケットを使用せずに済んだ.
また複数のバケットを作成,管理する必要がなくなった.
手順をメモしておく
やったこと
バケットの一部のフォルダの中に入っているファイルのみパブリックアクセス可能にした.
その他のファイルは全て非公開になっている.
やり方
-
公開したいバケットのページにいき,アクセス許可からブロックパブリックアクセスを編集
デフォルトではパブリックアクセスを全てブロックにチェックがついているが,これを外して4つの項目のうち下2つのチェックを外した状態で変更の保存をする.
-
バケットポリシーを作成する
バケットのページのアクセス許可からバケットポリシーを編集する
バケットポリシーには以下のjsonを記入する{ "Version":"2012-10-17", "Statement":[ { "Sid":"AddPerm", "Effect":"Allow", "Principal": "*", "Action":["s3:GetObject"], "Resource":["arn:aws:s3:::DOC-EXAMPLE-BUCKET/publicprefix/*"] } ] }
ここで
DOC-EXAMPLE-BUCKET
にはバケットの名前,publicprefix
には公開したいフォルダの名前を書く
以上で一部のフォルダのみを公開することができる.
試しに公開設定をしたフォルダの中のオブジェクトのオブジェクトURL(https://bucket-name.s3-ap-northeast-1.amazonaws.com/hoge/hoge.png のようなurl.各オブジェクトのページに記載されている)を開くと公開されていることがわかる.
また公開設定していないフォルダの中のオブジェクトのオブジェクトURLを開くとアクセス拒否されるのでこちらはきちんと非公開になっていることがわかる.
参考
AWS公式
こちらのページにはフォルダ以下を公開するやり方以外にもオブジェクトにタグをつけて特定のタグがついているオブジェクトのみ公開する方法なども紹介されている.