プログラミング初心者が、オリジナルポートフォリオ作成にあたり、初めてAWS EC2 S3にデプロイした際に、つまずいたことをまとめています。
- deploy checkでエラー
- ed25519エラー
- branch名を間違えてエラー
- bundlerバージョンエラー
- サーバ立ち上げで「502 Bad Gateway」エラー
- sudoについて
- アプリケーション名について
- rbenvのインストール
- bundlerのバージョン変更
- Seedデータの入れ方
- DBリセット方法
- Nginxのreload
- S3接続
- 406エラー
- 404,500エラー画像が表示されない
- S3接続をした状態で、画像無し投稿をすると500エラーになる
- ROLEやDATA BASEを間違えて作ってしまったときの削除方法
- ローカルを変更したのに、デプロイで変更が反映されない時の対処法
- ログが表示されない
- S3の使用を本番環境のみにする(Carrierwaveの場合)
- 413 Request Entity Too Large
- Google APIキーの設定
deploy checkでエラー
app ~]$ bundle exec cap production deploy:check
Could not locate Gemfile or .bundle/ directory
原因
ローカル環境で実行しないといけないのにEC2環境で実行してた。
こんなしょうもないミスはしてはいけない、、、
ed25519エラー
エラー文抜粋
keys only supported if ED25519 is available (NotImplementedError)
Gem::LoadError : "ed25519 is not part of the bundle. Add it to your Gemfile."
NotImplementedError: OpenSSH keys only supported if ED25519 is available
Gemfileのgroup :development, :test do下に以下を追記してbundle install
gem ‘ed25519’
gem ‘bcrypt_pbkdf’
これで解決!
branch名を間違えてエラー
エラー文抜粋
it stderr: fatal: not a valid object name: master
以下を修正
set :branch, ENV['BRANCH'] || 'main'
この部分のmasterをmainに変更
bundlerバージョンエラー
エラー文抜粋
Exception while executing as app@18.180.41.193: bundle exit status: 7 (SSHKit::Runner::ExecuteError)
The deploy has failed with an error: Exception while executing as app@18.180.41.193: bundle exit status: 7
ローカルとEC2のバージョンを確認
ローカル
$ bundler -v
Bundler version 2.2.20
EC2
[app@ip-172-31-37-50 ~]$ bundler -v
Bundler version 2.1.4
バージョン不一致のためローカルをEC2に合わせることに。
ローカルのbundlerインストール状態を確認
$ gem list bundler
*** LOCAL GEMS ***
bundler (2.2.20, 2.2.18, 2.2.11, default: 1.17.2)
capistrano-bundler (2.0.1)
2.1.4がない!
インストールする
$ gem install bundler -v 2.1.4
バージョンを指定して実行$ bundle _2.1.4_ install
すると警告文
Warning: the running version of Bundler (2.1.4) is older than the version that created the lockfile (2.2.20). We suggest you to upgrade to the version that created the lockfile by running `gem install bundler:2.2.20`.
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for x86_64-darwin-20, ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
一度Gemfile.lockを削除する。
$ rm Gemfile.lock
再度実行$ bundle _2.1.4_ install
できた!
サーバ立ち上げで「502 Bad Gateway」エラー
Nginxをreloadしてみることに
[app ~]$ sudo nginx -s reload
こんなエラー
nginx: [emerg] duplicate upstream “unicorn” in /etc/nginx/conf.d/achieve.conf:1
ログを見ようとする
[root ~]# cat /var/log/nginx/achieve_access.log;
こんなエラー
cat: /var/log/nginx/achieve_access.log: No such file or directory
見れない
どこのディレクトリが悪さしてるのか、ディレクトリをひとつずつ遡って確認することに
[root ~]# cd /var
[root var]# cd log
[root log]# cd nginx
[root nginx]# ls
access.log error.log アプリケーション名_access.log アプリケーション名_error.log
変なファイルがある!
Nginxの設定ファイルを確認
[root ~]# cd /etc/nginx/conf.d
[root conf.d]# ls
210708_AWS.conf achieve.conf
ファイルが2つある!
この2つのファイルがダブってエラーになってた。
不要な方を削除
[root conf.d]# rm 210708_AWS.conf
[root conf.d]# ls
achieve.conf
lsで確認すると、achieveだけになった。
logもちゃんと見れるようになった!
[root ~]# cat /var/log/nginx/achieve_access.log;
sudoについて
・sudo で実行するコマンドはrootディレクトリに移動しなくても(appディレクトリでも)OK
アプリケーション名について
・アプリケーション名はEC2インスタンスで付けた名前。
Githubのリポジトリ名と合わせる必要は無く、この2つの名前が一緒である必要はない。
リポジトリ名はファイル名ではない。
rbenvのインストール
# rbenv install 2.6.5
これはめっちゃ時間かかる。放置するとそのままEC2の接続が切れてしまう。
途中でEnter押してinstallの手伝いをしてあげる必要あり。
bundlerのバージョン変更
上記では、bundlerのバージョンをEC2側に合わせ、ローカルを変更する方法を紹介していますが、
ローカル側を変更せず、EC2側のバージョンを変更する方法について。
その方法
[root ~]# rbenv exec gem install bundler -v 2.2.20
Successfully installed bundler-2.2.20
Parsing documentation for bundler-2.2.20
Done installing documentation for bundler after 2 seconds
1 gem installed
[root ~]# rbenv rehash
Seedデータの入れ方
EC2接続する。
[app ~]$ cd /var/www/makerawesome/current
[app current]$ bundle exec rake db:seed RAILS_ENV=production
DBリセット方法
[app current]$ RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop
これをすると、DBが削除される。これらの記事を参考に、再度DBをcreateしようとしてもできない。
方法としては、
EC2接続
$ sudo su -
# psql -U postgres
postgres=# CREATE DATABASE "データベース名";
方法としては、上記手順でデータベースを作成し直し、
再度deploy。
すると、できた!
Nginxのreload
EC2をいじる度にする。
$ sudo nginx -s reload
S3接続
EC2へのAWSのアクセスキーとシークレットキーの書き方
$ cd /var/www/makerawesome/shared
$ vi .env
ここに、以下を記述
AWS_ACCESS_KEY_ID=自分のID
AWS_SECRET_ACCESS_KEY=自分のSECRET_KEY
406エラー
解決法
unicornを停止し、再度deployする。
停止方法はこちら
[app ~]$ ps aux | grep unicorn
app 26678 0.0 11.7 564452 118540 ? Sl 8月23 0:01 unicorn master -c /var/www/makerawesome/current/config/unicorn/production.rb -E deployment -D
app 26682 0.0 15.1 604356 152800 ? Sl 8月23 0:04 unicorn worker[0] -c /var/www/makerawesome/current/config/unicorn/production.rb -E deployment -D
app 26683 0.0 13.1 590648 132796 ? Sl 8月23 0:03 unicorn worker[1] -c /var/www/makerawesome/current/config/unicorn/production.rb -E deployment -D
app 27529 0.0 0.0 119436 988 pts/4 S+ 16:41 0:00 grep --color=auto unicorn
[app ~]$ kill 26678
[app ~]$ ps aux | grep unicorn
app 27539 0.0 0.0 119436 964 pts/4 S+ 16:43 0:00 grep --color=auto unicorn
参考
https://teratail.com/questions/303247
404,500エラー画像が表示されない
以下ファイルの以下の部分を、trueに変更する。
config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
↓
config.public_file_server.enabled = true
参考
https://blog.f-arts.work/archives/658
S3接続をした状態で、画像無し投稿をすると500エラーになる
「S3データがある場合」という条件を付ける必要がある。
例
<%= image_tag @feed.image.url %>
これだけだと、画像無しで新規投稿した場合でもS3を探しにいってしまって?エラーになる。
対処法
<% if @feed.image.present? %>
<%= image_tag @feed.image.url %>
<% end %>
ROLEやDATA BASEを間違えて作ってしまったときの削除方法
ROLE
確認方法
postgres=# \dg
結果
List of roles
Role name | Attributes | Member of
---------------+------------------------------------------------+-----------
maker_awesome | Superuser | {}
makerawesome | Superuser | {}
postgres | Superuser, Create role, Create DB, Replication | {}
この中の「makerawesome」を削除する。
ostgres=# DROP ROLE "makerawesome" ;
DROP ROLE
セミコロンの前の半角スペースが必要なのがポイント!lこれないとできない。CREATEはいらないのに。なぜ???
DATA BASE
確認方法
postgres=# \l
結果
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
--------------------------+----------+-----------+---------+-------+-----------------------
maker_awesome_production | postgres | SQL_ASCII | C | C |
makerawesome_production | postgres | SQL_ASCII | C | C |
postgres | postgres | SQL_ASCII | C | C |
template0 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | SQL_ASCII | C | C | =c/postgres +
| | | | | postgres=CTc/postgres
(5 rows)
postgres=# DROP DATABASE "makerawesome_production" ;
DROP DATABASE
ローカルを変更したのに、デプロイで変更が反映されない時の対処法
インスタンスを再起動する。
AWS Webページを開いて、インスタンスを再起動する。
その後Nginxのreload
$ sudo nginx -s reload
DBの再接続
EC2接続
$ sudo su -
# /sbin/service postgresql restart
そしてデプロイ!
ログが表示されない
結論
少し待つ
ログ表示コマンド
[root ~]# cat /var/log/nginx/makerawesome_access.log;
S3の使用を本番環境のみにする(Carrierwaveの場合)
以下ファイルに以下のように条件を追加するのみ!
if Rails.env.production?
storage :fog
else
storage :file
end
S3接続ができているかどうかはWebサイトのバケットで確認ができる。
こちらがとても参考になりました。
413 Request Entity Too Large
アップロードファイルサイズが許容値を超えるとこのようなエラーとなる。
デフォルトでは1MBのようなので、
解決策としては、許容最大サイズを追記する。
EC2接続
$ sudo vi /etc/nginx/nginx.conf
これでvimを開き、
http{
keepalive_timeout 65;
types_hash_max_size 4096;
client_max_body_size 10M; ←この行を追記
その後、Nginxリロード
$ sudo nginx -s reload
Google APIキーの設定
EC2接続
$ sudo vim /etc/environment
ここに、開発環境と同じように記述する。
そして、Unicornを再起動。
Unicornの再起動方法は上記の「406エラー」の部分を参照
参考記事
コメント