Topics

トピックス

開発ブログ 2021-01-10

Windows環境からAWS EC2にRails6+PostgreSQLのWEBアプリをデプロイする際ハマったことまとめ

\シェアする/

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

    Recommends