Herokuアプリケーションに投稿した画像をAWS S3に保存できるようにする
こんにちは。ずみーです。 Herokuでは、アプリケーションにアップロードした画像ファイルなどは定期的に削除されてしまいます。 そこで、アップロードしたファイルの保存先をAWS S3に変更する方法について学びました。
まずは専門用語の理解から
バケット
S3でのデータ保存場所のこと。 名前がURLに使用されるため、全世界で一意にする必要がある。
リージョン
バケットのサーバー上での在り処のこと。
バケットポリシー
どのようなアクセスに対してCRUDを許可するかを決定する。
バケットを作成し、バケットポリシーを設定する
バケットに一意な名前をつけたあとのアクセスコントロール設定画面で以下の設定を行います。
- 「パブリックアクセスを全てブロック」を外す
- 次の2つを許可するように設定:
バケットポリシー設定
今回は、特定のIAMユーザからのアクセスのみを許可するように設定します。
{ "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に変更することができました。