Windows環境からAWS EC2にRails6+PostgreSQLのWEBアプリをデプロイする際ハマったことまとめ
こんにちは、エンジニア業デザイナーのみなせしゅんです。
先日、AWS EC2に現在開発中のRailsアプリをデプロイする機会があったので、Qiitaのこちらのシリーズ記事を参考にさせていただきながら作業を進めていました。
その際、自身のローカル環境が上記の記事で想定されている環境と異なるOS(Windows)だったこともあってか、だいぶ色々な箇所でハマり完了まで2日かかったので、自分への備忘録も兼ねてハマったポイントを淡々とまとめてみます。
※自動デプロイ(Capistrano)は使用しない想定です。
Contents
pemを使用したEC2インスタンスへのログイン
第1ハードル、EC2へのログインです。
ネットで検索すると、「Windows環境ではPuTTYやTeraTerm等のSSHクライアントを使用しないとEC2にはログインできない」という記事が出てきます。
しかし、2018年の春のWindows 10アップデートでSSHを使える仕組み(OpenSSH)が標準で組み込まれたそうで、PuTTYやTeraTermを使わずともPowerShellやコマンドプロンプトから以下のコマンドで普通にログインができました。
//ssh -i インスタンス作成時に作成したpem ec2-user@インスタンスのパブリックIP
ssh -i sample_app.pem ec2-user@12.345.678.901
これに関してはハマったポイントではないですが、有益な情報のはずなのでメモ。
ちなみにSSHキーペアの作成もPowerShellやコマンドプロンプトからいけました。
ssh-keygen
.ssh/configファイルを使用したEC2インスタンスへのログイン
sshコマンドを使ってログインする際、毎回ipとかユーザー名とかを指定しないといけないのはめんどくさかったので、configファイルを用いて簡単にログインできるようにしようとしました。
参考:~/.ssh/config による快適 SSH 環境 - Qiita
configファイルはこんな感じのやつです↓
Host ryozen_sample
Hostname 接続先のIPアドレス
Port 22
User testname
IdentityFile ~/.ssh/ryozen_key_rsa (秘密鍵の設定)
ですが、任意のディレクトリ内に".ssh"というディレクトリを作って、上記のconfigファイルをそこに配置し以下のようなコマンドを打っても、"Could not resolve hostname" と言われてしまい上手くログインできません。
cd xxx/.ssh
ssh ryozen_sample
何でだろう~~configファイルの書き方が違うのかな~~などと色々調べた結果、どうやらconfigファイルはホームディレクトリ配下の".ssh"ディレクトリに配置すべきと決まっているようだ、というところまで辿り着きました。
参考:Windows10のOpenSSHでconfig使ってSSH接続
windowsでいうホームディレクトリはここだそうです。(初めて知った)
C:\Users\ユーザー名
自分の場合、ここに".ssh"ディレクトリを作ってconfigファイルを配置したら上手くログインできるようになりました。バンザイ。
EC2の環境構築でyumが使えない
環境構築の際、yumを用いて色々インストールしようとしたのですが、こんな感じのエラーが出て失敗しました。
One of the configured repositories failed (不明),
and yum doesn't have enough cached data to continue. At this point the only
safe thing yum can do is fail. There are a few ways to work "fix" this:
1. Contact the upstream for the repository and get them to fix the problem.
2. Reconfigure the baseurl/etc. for the repository, to point to a working
upstream. This is most often useful if you are using a newer
distribution release than is supported by the repository (and the
packages for the previous distribution release still work).
3. Run the command with the repository temporarily disabled
yum --disablerepo=<repoid> ...
4. Disable the repository permanently, so yum won't use it by default. Yum
will then just ignore the repository until you permanently enable it
again or use --enablerepo for temporary usage:
yum-config-manager --disable <repoid>
or
subscription-manager repos --disable=<repoid>
5. Configure the failing repository to be skipped, if it is unavailable.
Note that yum will try to contact the repo. when it runs most commands,
so will have to try and fail each time (and thus. yum will be be much
slower). If it is a very temporary problem though, this is often a nice
compromise:
yum-config-manager --save --setopt=<repoid>.skip_if_unavailable=true
Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again
自分の場合、セキュリティグループのアウトバウンドルールでsshとhtppとhtppsしか許可していなかったことが原因でした。
以下のポートをルールに追加したところ正常にインストールできるようになりました。
- 80/tcp
- 443/tcp
- 53/udp
「Bad owner or permissions on ~~」のようなエラーでEC2にログインできない、gitホスティングサービス(github等)との通信が上手くいかない
自分の場合は権限設定の漏れが原因でした。
このあたりの権限を見直すと上手くいく可能性があります。
// homeディレクトリ
chmod 755 /home/*username*
// .ssh ディレクトリ
chmod 700 home/*username*/.ssh
// authorized_keysファイル
chmod 600 home/*username*/.ssh/authorized_keys
// ~/.ssh/configファイル
chmod 600 ~/.ssh/config
master.keyの取り扱い方(Rails 5.2以降)
master.keyファイルは基本gitでは管理をしないため、手動で追加する必要があります。
以下のコマンドでmaster.keyファイルをサーバー上に手動で作成し、ローカルにあるconfig/master.keyの中身をコピペしました。
sudo vim アプリ名/config/master.key
unicornインストールでコケる(ローカルのWindows環境)
サーバーにunicornをインストールするためには、Gemfileに以下のような記述をする必要があります。
group :production, :staging do
gem 'unicorn'
end
ですがローカルのWindows環境では、このまま普通にbundle installするとエラーが出ます。
どうやらunicornをインストールする際に依存関係にある"kgio"というgemが、Linux系の環境でしか動かないようなのです。
そのため、ローカルのWindows環境でbundle installをする際は以下のようなオプションを付け、developmentとtestでしか使わないgemのみをインストールするようにします。
bundle install --without production staging
unicornは本番環境でしか使わないため、開発環境にはなくても問題ありません。
※ちなみに、"bundle install" はデフォルトで" --without production" のオプションが付くようになっているため、test・development・production以外の環境を作成していない場合は問題なく "bundle install" が通ると思われます。
gem "pg"のインストールでコケる(サーバー側)
サーバーに予めPostgresqlがインストールされている必要があります。
以下のコマンドでPostgresqlをインストールしてから "bundle install" を実行したところ、無事 "pg" のインストールができました。
sudo yum install -y postgresql postgresql-devel postgresql-server postgresql-libs
gem "pg"をインストールした後は、以下のコマンドでRDSとの接続確認ができます。
psql -h [RDSのエンドポイント] -U [RDSのUsername] -d[RDSのDB NAME]
接続ができない場合はRDSが属するセキュリティグループのインバウンドルールに以下のような設定を追加すると解決する可能性があります。
- タイプ:PostgreSQL
- プロトコル:TCP
- ポート範囲:5432
- ソース:接続元EC2のIPアドレスまたは接続元EC2と同じセキュリティグループ
nginxとunicornの設定は完璧だと思われるのにサイトへのアクセスができない(アクセスが拒否される)
httpsでアクセスしている可能性があります。"http://IPアドレス" で接続できるか確認してみてください。
chromeの場合、アドレスバーにURLを入力するとデフォルトでhttpsになるため気付きにくいんですよね……。
Webpackerに起因すると思われる、よくわからないエラーが出る
[a2828877-4ccf-4fe7-9032-afd9a7d9afe9] ActionView::Template::Error (Webpacker can't find application in /var/www/rails/appname/public/packs/manifest.json. Possible causes:
1. You want to set webpacker.yml value of compile to true for your environment
unless you are using the `webpack -w` or the webpack-dev-server.
2. webpack has not yet re-run to reflect updates.
3. You have misconfigured Webpacker's config/webpacker.yml file.
4. Your webpack configuration is not creating a manifest.
Your manifest contains:
{
}
):
Webpackerのコンパイルが上手くいっていない時に出る場合が多いようです。
以下を試すと解決するかもしれません。
rails webpacker:install
rails webpacker:compile
よくわからないがとにかくエラーが出てて死にそうなのでログを見たい
恐らく下記のどこかに見慣れたエラーログが出ています。自分の場合はproduction.logを見ながらなんとか解決していきました。
$ sudo tail -f /var/log/nginx/access.log
$ sudo tail -f /var/log/nginx/error.log
$ sudo tail -f log/unicorn.log
$ sudo tail -f log/staging.log
$ sudo tail -f log/production.log
原因を見つけたらローカルで修正してコミットしてpushしてサーバーでgit pullして、
git pull origin ブランチ名
unicornのプロセスIDを確認して、
ps -ef | grep unicorn | grep -v grep
プロセスIDを基にunicornをkillして、
kill -QUIT プロセスID
unicornを立ち上げて、
bundle exec unicorn_rails -c /var/www/rails/アプリ名/config/unicorn.conf.rb -D -E 環境名
nginxを再起動したら、
sudo nginx -s reload
きっとなんとかなります。きっと。
おわりに
デプロイ作業、本当に大変ですよね。
この記事がどなたかのお役に立てれば幸甚です。上手くいくことをお祈りしております。
Share シェアしてほしい
Writer この記事をかいたひと
RYOZEN Scratch Creations代表。
1994年生まれ。千葉育ち。
2019年よりフリーランスで活動を開始。
ディレクションやフロントエンド・バックエンドのコーディング・プログラミング、グラフィックデザインからWEBデザインまで、わりとなんでもやる人。
座右の銘は「レベルを上げて実績で殴れ」。
Other Topics その他のTopics