<DAY169>Amazon AWS S3を用いた画像アップロード
●8/9(金)
●学習日数 169日
●学習時間(本日)6時間
●累計学習時間 777.0時間
●一日あたりの平均学習時間 4.72時間
前提条件
(1)CarrierWaveにて画像をアップロードしている
(2)capstranoにて自動デプロイ設定をしている
(3)IAMにて権限を制限したユーザーを登録している(s3だけに対応)
手順2 IAMユーザーにS3の登録
IAMユーザーにS3の登録をする必要があります。
IAMユーザーの情報が表示されますので、必要な情報を取得します。
後ほど 「ユーザーのARN」が必要になりますので、一度エディタなどに保存。
①に先ほどメモしておいたユーザーのARNを、②に作成したバケット名を記述しましょう。
{ "Version": "2012-10-17", "Id": "Policy1544152951996", "Statement": [ { "Sid": "Stmt1544152948221", "Effect": "Allow", "Principal": { "AWS": "************①****************" }, "Action": "s3:*", "Resource": "arn:aws:s3:::************②**********" } ] }
手順3 rails側の設定
画像をアップロードする際、外部のストレージを選択しアップロードするのを補助してくれるGemです。
AWSのサービスのみを利用する場合は、fog-awsというバージョンをインストールします。
#前略 gem 'fog-aws' そのあと bundle
手順4 CarrierWaveの設定変更
app/uploader/image_uploader.rb
storage :fogのコメントアウトを外す
class ImageUploader < CarrierWave::Uploader::Base #省略 storage :fog #省略 end
config/initializers/carrierwave.rbにてcarrierwave.rbファイル作成
require 'carrierwave/storage/abstract' require 'carrierwave/storage/file' require 'carrierwave/storage/fog' CarrierWave.configure do |config| config.storage = :fog config.fog_provider = 'fog/aws' config.fog_credentials = { provider: 'AWS', aws_access_key_id: Rails.application.secrets.aws_access_key_id, aws_secret_access_key: Rails.application.secrets.aws_secret_access_key, region: '自分で調べて入れてください' #例 'ap-northeast-1' } config.fog_directory = 'ここにバケット名を入れます' config.asset_host = 'https://s3-ここにリージョン名を入れます(※例 ap-northeast-1).amazonaws.com/ここにバケット名を入れます' end
手順5 環境変数の設定
セキュリティのためこのようなやり方をしています。
続いて、S3への接続に必要な認証情報を、環境変数として設定しましょう。
CSVファイルにはそのままaws_access_key_idとaws_secret_access_keyというカラムがあるので、こちらに書かれた値をローカル環境と本番環境の両方で設定していきます。
ローカル環境
$ vim ~/.bash_profile # iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。 # 編集が終わったらescapeキーを押してから:wqと入力して保存して終了 export AWS_SECRET_ACCESS_KEY='ここにCSVファイルに乗っている値をコピー' export AWS_ACCESS_KEY_ID='ここにCSVファイルに乗っている値をコピー' # 編集した.bash_profileを読み込み直して、追加した環境変数を使えるようにする $ source ~/.bash_profile
本番環境
$ vim ~/.bash_profile # iを押してインサートモードに移行し、下記を追記する。既存の記述は消去しない。 # 編集が終わったらescapeキーを押してから:wqと入力して保存して終了 export AWS_SECRET_ACCESS_KEY='ここにCSVファイルに乗っている値をコピー' export AWS_ACCESS_KEY_ID='ここにCSVファイルに乗っている値をコピー' # 編集した.bash_profileを読み込み直して、追加した環境変数を使えるようにする $ source ~/.bash_profile
手順6 secrets.ymlに登録
config/secrets.ymlに外部に公開したくないIDやパスワードなどを記述して管理します。
先ほど設定した環境変数をここで読み込むように記述を変更しましょ
development: secret_key_base: ~~~~~~~~ aws_access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %> aws_secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %> test: secret_key_base: ~~~~~~~~ production: secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> aws_access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %> aws_secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
手順7 capistranoの記述を変更
ここまでで設定した環境変数をcapistranoでの自動デプロイで利用するためには、明示的に環境変数を指定する必要があります。
Config/deploy.rb に、次の記述を追加してください。
set :default_env, { rbenv_root: "/usr/local/rbenv", path: "/usr/local/rbenv/shims:/usr/local/rbenv/bin:$PATH", AWS_ACCESS_KEY_ID: ENV["AWS_ACCESS_KEY_ID"], AWS_SECRET_ACCESS_KEY: ENV["AWS_SECRET_ACCESS_KEY"] }
同じファイルの内容を一部変更。
after 'deploy:publishing', 'deploy:restart' namespace :deploy do task :restart do invoke 'unicorn:restart' end desc 'upload secrets.yml' task :upload do on roles(:app) do |host| if test "[ ! -d #{shared_path}/config ]" execute "mkdir -p #{shared_path}/config" end upload!('config/secrets.yml', "#{shared_path}/config/secrets.yml") end end before :starting, 'deploy:upload' after :finishing, 'deploy:cleanup' end
手順8 .gitignoreを編集しよう
2 #ファイルの最下部に下記を追記 config/secrets.yml
.gitignoreに記載した変更は、一度gitの監視下に置かれてしまったファイルには適用されません。今.gitignoreに記載した変更を反映させるためには、config/secrets.ymlをgitの監視から外す必要があります。次のコマンドを実行して、config/secrets.ymlをgitの監視から外してください。
git rm --cached config/secrets.yml