S3に格納したオブジェクトをなるべく簡単に公開する方法

July 24, 2019

「S3に格納したオブジェクトをとりあえず素早く公開したい。でも、アクセスコントロールの設定が多くて時間がかかりそう。。」 今回は、こんな要望に答えていきたいと思います。記事の前半で必要な設定の紹介を行い、後半で設定の解説をしていきます。


目次

  • S3に格納したオブジェクトを外部に公開する方法
  • Terraformのコード解説

それでは解説していきます。
※各種設定にはTerraformを使っています。

S3に格納したオブジェクトを外部に公開する方法

時間のない方のために。下記がコードの全量です。これを使ってterraform applyすれば、オブジェクトを外部に公開することができるバケットの完成です。(ここで注意点が1つ。今回のコードでは、バケット自体は非公開にしています。あくまで、格納するオブジェクトのみ公開可能にするだけです。)

provider "aws" {
  region = "ap-northeast-1"
  profile = "test"
}

resource "aws_s3_bucket" "katsuya-place" {
  bucket = "katsuya-place"
  acl    = "private"
}

resource "aws_s3_bucket_public_access_block" "katsuya-place" {
  bucket = "${aws_s3_bucket.katsuya-place.id}"
  block_public_acls   = false
  block_public_policy = false
}

Terraformのコード解説

それでは、Terraformのコードを抜粋し、解説していきたいと思います。

profile = "katsuya-place"
これはAWSに接続するために使うプロファイルを指定しています。プロファイルはTerraform実行前にAWS CLIで登録しておきます。 aws confugure -—profile="katsuya-place"

acl = "private"
バケットの所有者のみFULL_CONTROLが与えられ、それ以外のユーザーのアクセスは許可しません。(あくまでバケットへのアクセスです。ここに追加していくオブジェクトへのアクセスは個別に設定可能です。)

resource "aws_s3_bucket_public_access_block" "katsuya-place" {
  bucket = "${aws_s3_bucket.katsuya-place.id}"
  block_public_acls   = false
  block_public_policy = false
}

ブロックパブリックアクセスに関する設定になります。まず、bucketで対象のバケットを指定します。そして、block_public_aclblock_public_policy共にfalseにし、オブジェクトを公開できるようにしています。


ブロックパブリックアクセス設定は、acl、policyの設定を上書きます。そのため、acl等で許可していてもブロックパブリックアクセスを有効にしていると、非公開設定になります。


以上で、公開可能なバケットの作成が完了しました。後は、このバケットに対してオブジェクトをアップロードするだけです。(オブジェクト毎にアクセス設定可能なので、「Aは公開して、Bは非公開」みたいなこともできます。)
アクセス設定が多いS3ですが、基本的な使い方であれば簡単に導入できるので、是非参考にしてみてください。