yujiroのプログラミング

勉強内容をアウトプットし、サボらないようにする為のブログ

<DAY169>Amazon AWS S3を用いた画像アップロード

\ Follow me!! /

●8/9(金)
●学習日数 169日
●学習時間(本日)6時間
●累計学習時間 777.0時間
●一日あたりの平均学習時間 4.72時間

前提条件

(1)CarrierWaveにて画像をアップロードしている
(2)capstranoにて自動デプロイ設定をしている
(3)IAMにて権限を制限したユーザーを登録している(s3だけに対応)


手順1 AWSにてs3のバケットを作成

AWSにてs3のバケットを作成する
名前とリージョンを決めるだけで簡単に作成。

f:id:yujiro0320:20190809165141p:plain

f:id:yujiro0320:20190809165205p:plain

f:id:yujiro0320:20190809165217p:plain

手順2 IAMユーザーにS3の登録

IAMユーザーにS3の登録をする必要があります。

IAMユーザーの情報が表示されますので、必要な情報を取得します。
後ほど 「ユーザーのARN」が必要になりますので、一度エディタなどに保存。

f:id:yujiro0320:20190809171030p:plain

f:id:yujiro0320:20190809171203p:plain

f:id:yujiro0320:20190809171219p:plain

①に先ほどメモしておいたユーザーの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

AWS単語

バケット

S3では、クラウドのストレージをバケットと呼びます。バケットを作成しRails側から指定することで、そのバケットに画像をアップロードしていきます。

参考文献

qiita.com