2019/05/06
今回は、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を利用しています。
下記の様な構成です
これでデプロイ出来たものが、下記のURLです。
http://3.112.115.114/
ここから、今日の失敗をまとめます。
開発環境では正常に動作していた画像アップロードですが、本番環境ではエラーが発生してしまい、正常に動作しませんでした。
エラーログを確認して見ると、下記の様な内容でした。
rake stderr: rake aborted!
NoMethodError: undefined method `match' for nil:NilClass
色々調べて見ると、どうやらAWSのアクセスキーの読み込みが上手く行っていなかった様でした。
これまで、secrets.yml
で読み込ませる方法しか実践した事が無かったのですが、今回Rails5.2を利用する事にした為、secrets.yml
がcredentials.yml
に置き換わっていた事を失念していました。
なので、credentials.yml
からアクセスキーを読み込ませる様に設定を変更しました。
なお、credentials.yml
は直接エディタで編集を行えない為、ターミナルから下記コマンドを実行して、編集を行う必要があります。
$ EDITOR="vi" bin/rails credentials:edit
また、復号化に必要なmaster.key
は、デフォルトで.gitignoreに追加されているため、Capistranoの自動デプロイに関する設定ファイルに読み込ませる為の記述を追加する必要があります。
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::Error (storage :cache isn't registered on ImageUploader):
公式のリファレンスも確認して、コードを書き換えたりしたのですが、これが一向に解消されません。
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
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
これについては、今日中の解決が困難だった為、一旦持ち越しにしています。
結局、当初予定していた機能を期間内で全て実装する事が出来ませんでした・・・
工数の見積もりって、本当に難しいと改めて感じました。
この経験を次の開発で活かしていきたいと思います!
(おわり)