ずみーBlog

元クラゲ研究者(見習い)の92年生まれがエンジニアを目指しながら日々寄り道するブログです。

Herokuアプリケーションに投稿した画像をAWS S3に保存できるようにする

こんにちは。ずみーです。 Herokuでは、アプリケーションにアップロードした画像ファイルなどは定期的に削除されてしまいます。 そこで、アップロードしたファイルの保存先をAWS S3に変更する方法について学びました。

まずは専門用語の理解から

バケット

S3でのデータ保存場所のこと。 名前がURLに使用されるため、全世界で一意にする必要がある。

リージョン

バケットのサーバー上での在り処のこと。

バケットポリシー

どのようなアクセスに対してCRUDを許可するかを決定する。

バケットを作成し、バケットポリシーを設定する

バケットに一意な名前をつけたあとのアクセスコントロール設定画面で以下の設定を行います。

  1. 「パブリックアクセスを全てブロック」を外す
  2. 次の2つを許可するように設定:
    • 新しACLを介して許可されたバケットとオブジェクトへのパブリックアクセス
    • 任意のACLを介して許可されたバケットとオブジェクトへのパブリックアクセス

バケットポリシー設定

今回は、特定のIAMユーザからのアクセスのみを許可するように設定します。

  1. アクセス許可したいIAMユーザの「ユーザーのARN」をコピーしておく
  2. バケットの「アクセス権限」>「バケットポリシー」と遷移する
  3. バケットポリシー入力欄に以下のJSONを記載
{
   "Version": "2012-10-17",
   "Id": "Policy1544152951996",
   "Statement": [
       {
           "Sid": "Stmt1544152948221",
           "Effect": "Allow",
           "Principal": {
               "AWS": "ユーザーのARN"
           },
           "Action": "s3:*",
           "Resource": "arn:aws:s3:::バケット名"
       }
   ]
}

画像保存先をS3に変更する(開発環境の場合)

以下の手順で実装: 1. Gemのインストール 2. 保存先指定 3. 環境変数設定

Gemのインストール

Gemfile

gem 'aws-sdk-s3', require: false
bundle install

保存先指定

development.rbで:localとなっていた部分を:amazonに変えます。

config/environments/development.rb

config.active_storage.service = :amazon

次に、storage.ymlにAWSの情報を記述します。

config/storage.yml

amazon:
 service: S3
 access_key_id: <%= ENV['AWS_ACCESS_KEY_ID'] %>
 secret_access_key: <%= ENV['AWS_SECRET_ACCESS_KEY'] %>
 region: ap-northeast-1
 bucket: 保存先のバケット名

上で使っているENV['AWS_ACCESS_KEY_ID']ENV['AWS_SECRET_ACCESS_KEY']の部分は環境変数なので、これから設定していきます。

環境変数設定

IAMユーザ設定時にダウンロードしたCSVファイルを開き、.zshrcにキーを書き込みます。

~/.zshrc

export AWS_ACCESS_KEY_ID="ここにCSVファイルのAccess key IDの値をコピー"
export AWS_SECRET_ACCESS_KEY="ここにCSVファイルのSecret access keyの値をコピー"
source ~/.zshrc

以上で保存先変更の設定完了です。

本番環境(Heroku)でS3への保存を可能にする

heroku config:set AWS_ACCESS_KEY_ID="ここにCSVファイルの「Access key ID」の値をコピー"
heroku config:set AWS_SECRET_ACCESS_KEY="ここにCSVファイルの「Secret access key」の値をコピー"

正しく設定できているかの確認

heroku config

Herokuにプッシュ

git push heroku master

以上で、Herokuに公開したアプリの画像保存先をAWS S3に変更することができました。