AWS EC2 S3 デプロイで躓いたことまとめ

プログラミング初心者が、オリジナルポートフォリオ作成にあたり、初めてAWS EC2 S3にデプロイした際に、つまずいたことをまとめています。

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 EC2本番環境にデプロイしたのに変更が反映されない...の対処法を写真つきで解説 - Qiita
##概要AWSでEC2にデプロイした際に、「ローカルでは変更が反映されているのに本番環境で変更が反映されない...!!」となってしまい詰んだので解決した方法をメモ書きとして共有します。ローカルで…

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エラー」の部分を参照

参考記事

AWSのEC2上に環境変数を設定する方法 - Qiita
環境macOS: Big Sur Ver11.2.3Rails: 6.1.1Ruby: 2.6.5インフラ:AWS(EC2)Webサーバ:Unicorn困っていることAWSのEC2を使…

コメント