みんなの「作ってみた」

【10日間でポートフォリオ作成に挑戦】10日目:AWSでのデプロイ

2019/05/06

ryoutaku
ryoutaku
2018年12月から3年間「毎日技術ブログ書く」と宣言して現在も継続中。IBMのWatsonきっかけでエンジニアに憧れて、28歳未経験で転職。バックエンドの開発を担当(Ruby,AWS)社会にインパクトを与えるプロダクトの開発に携わりたい一心で、愚直にアウトプットを継続。今の関心事は自然言語処理。

概要

今回は、2019年のGW期間(10日間)を全て費やして取り組むポートフォリオの製作過程を取りまとめた内容を投稿させて頂きます。(投稿は毎日行う予定)

全体通した取り組みの詳細については、前回までの記事をご参照ください。

【10日間でポートフォリオ作成に挑戦】1日目:要件定義〜記事投稿のCRUD
【10日間でポートフォリオ作成に挑戦】2日目:アクセス制限〜コメントのCRUD機能
【10日間でポートフォリオ作成に挑戦】3日目:ページネーション~CKEditorの導入
【10日間でポートフォリオ作成に挑戦】4日目:テーブル分割〜CKEditorのフォームへの反映
【10日間でポートフォリオ作成に挑戦】5日目:CKEditorへ画像アップロード機能を追加
【10日間でポートフォリオ作成に挑戦】6日目:テストコードの実装
【10日間でポートフォリオ作成に挑戦】7日目:検索機能〜いいね機能の実装
【10日間でポートフォリオ作成に挑戦】8日目:記事ストック機能〜ユーザーフォロー機能の実装
【10日間でポートフォリオ作成に挑戦】9日目:フロントエンドの実装〜各種機能の修正

今日一日の作業内容

ここからは、今日1日で取り組んだ作業内容をご説明します。

本番環境へのデプロイ

一通りの機能の実装が完了したので、本番環境へのデプロイを行います。
デプロイにあたっては、AWSを利用しています。

下記の様な構成です

  • 仮想サーバー:EC2(AWS)
  • ストレージ:S3(AWS)
  • アプリケーションサーバー:Unicorn
  • WEBサーバー:Nginx
  • データベース:MySQL
  • 自動デプロイ:Capistrano

これでデプロイ出来たものが、下記のURLです。
http://3.112.115.114/

今日の失敗

ここから、今日の失敗をまとめます。

画像アップロードが本番環境で動作しない

開発環境では正常に動作していた画像アップロードですが、本番環境ではエラーが発生してしまい、正常に動作しませんでした。

アクセスキーの設定ミス

エラーログを確認して見ると、下記の様な内容でした。

rake stderr: rake aborted!
NoMethodError: undefined method `match' for nil:NilClass

色々調べて見ると、どうやらAWSのアクセスキーの読み込みが上手く行っていなかった様でした。

これまで、secrets.ymlで読み込ませる方法しか実践した事が無かったのですが、今回Rails5.2を利用する事にした為、secrets.ymlcredentials.ymlに置き換わっていた事を失念していました。

なので、credentials.ymlからアクセスキーを読み込ませる様に設定を変更しました。
なお、credentials.ymlは直接エディタで編集を行えない為、ターミナルから下記コマンドを実行して、編集を行う必要があります。

$ EDITOR="vi" bin/rails credentials:edit

また、復号化に必要なmaster.keyは、デフォルトで.gitignoreに追加されているため、Capistranoの自動デプロイに関する設定ファイルに読み込ませる為の記述を追加する必要があります。

config/deploy.rb
set :linked_files, %w{ config/master.key }

(中略)

  desc 'upload master.key'
  task :upload do
    on roles(:app) do |host|
      if test "[ ! -d #{shared_path}/config ]"
        execute "mkdir -p #{shared_path}/config"
      end
      upload!('config/master.key', "#{shared_path}/config/master.key")
    end
  end
  before :starting, 'deploy:upload'
  after :finishing, 'deploy:cleanup'
end

私は、前に実装したコードをそのまま引用した為に、master.keyと指定すべき箇所を、secrets.ymlと指定してエラーになってしまいました。

Shrineの設定

上記のアクセスキーの設定を行った後も、別のエラーが発生しました。

Shrine::Error (storage :cache isn't registered on ImageUploader):

公式のリファレンスも確認して、コードを書き換えたりしたのですが、これが一向に解消されません。

uploaders/image_uploader.rb
require 'image_processing/mini_magick'

class ImageUploader < Shrine
  plugin :remove_attachment
  plugin :pretty_location
  plugin :processing
  plugin :versions
  plugin :delete_raw
  plugin :store_dimensions, analyzer: :mini_magick

  process(:store) do |io, _|
    versions = { original: io }

    io.download do |original|
      pipeline = ImageProcessing::MiniMagick.source(original)
      versions[:standard] = pipeline.resize_to_limit!(400, 400)
    end

    versions
  end
end
config/initializers/shrine.rb
require 'shrine/storage/s3'

if Rails.env.production?
  s3_options = {
      access_key_id: Rails.application.credentials.dig(:aws, :access_key_id),
      secret_access_key: Rails.application.credentials.dig(:aws, :secret_access_key),
      region:            'ap-northeast-1',
      bucket:            'gooderorrs',
  }

  Shrine.storages = {
      cache: Shrine::Storage::S3.new(prefix: "cache", **s3_options),
      store: Shrine::Storage::S3.new(**s3_options),
  }
else
  require 'shrine/storage/file_system'

  Shrine.storages = {
      cache: Shrine::Storage::FileSystem.new('public', prefix: 'uploads/cache'),
      store: Shrine::Storage::FileSystem.new('public', prefix: 'uploads')
  }
end

Shrine.plugin :activerecord
Shrine.plugin :backgrounding
Shrine.plugin :logging
Shrine.plugin :determine_mime_type
Shrine.plugin :cached_attachment_data
Shrine.plugin :restore_cached_data

これについては、今日中の解決が困難だった為、一旦持ち越しにしています。

結果

結局、当初予定していた機能を期間内で全て実装する事が出来ませんでした・・・
工数の見積もりって、本当に難しいと改めて感じました。

この経験を次の開発で活かしていきたいと思います!

(おわり)