EnsekiTT Blog

EnsekiTTが書くブログです。

AWS Cloud9からElasticBeanstalkにRailsアプリをデプロイしようとしたらハマった話(後編)

つまりなにしたの?

AWS Cloud9からElasticBeanstalkにRailsアプリをデプロイしようとしたら、
・データベース設定
・nginxの設定
の2点でハマったのでその解決方法を書いておくことにした。
後編は上記2点を実行することについて。
f:id:ensekitt:20180516234110j:plain

前編はこちら

ensekitt.hatenablog.com
Elastic Beanstalkがなにか等はこっちに書いてある。
デプロイしてみたは良いもののエラーが出ていてHello Worldが見られない。
f:id:ensekitt:20180516173914j:plain

まだ、データベースもないのでエラーが出るし表示はできない。

conflicting server name "localhost" on 0.0.0.0:80, ignored

こんなエラーが出ていたりもする。
(なんかこの順序間違えてるよって感じどうにかならんのだろうか。)

データベースを設定していく

先程のエラー表示が出ている画面の左側にある設定を押してデータベース(RDB)を作っていく。
f:id:ensekitt:20180516234628j:plain
今回はMySQLでユーザ名とパスワードを設定する。
実験なのでストレージは5gbでアベイラビリティは低のまま。
保存すると設定画面に戻る。
f:id:ensekitt:20180516234712j:plain
AWS RDBインスタンスを作ってくれる。

これはかなり時間がかかって辛抱強くYoutubeでも見ながら待つ。

シークレットキーを作成する

Railsで作成できるシークレットキーを環境変数に入れたいので作る。
Cloud9のターミナルで作った。

$ rails secret
0000000000000000000000000000000000000hogehoge00000000000000000000000000000000000000000000000000000000000000000000000

環境変数を設定する

環境変数はDatabase関連とシークレットキー関連。
f:id:ensekitt:20180516234955j:plain
ちょっと見にくいけど、RDBインスタンスの詳細ページからそれぞれの値を持ってきて埋める。
これで設定の適用を行うと再起動してくれる。

あれ?

僕はここでイケルと思っていたら

conflicting server name "localhost" on 0.0.0.0:80, ignored

が出ていた。普通にNginxのほうで問題があるようで、SSHで見に行ったりしていたら、
Nginxの設定が間違っている様子。

nginxの設定を追記する

.elasticbeanstalk/config.yml
に以下を追記する。

files:
  "/etc/nginx/conf.d/websockets.conf" :
    content: |
      upstream backend {
          server unix:///var/run/puma/my_app.sock;
      }

      server {
          listen 80;

          access_log /var/log/nginx/access.log;
          error_log /var/log/nginx/error.log;

          server_name ここをホスト名にする

          # prevents 502 bad gateway error
          large_client_header_buffers 8 32k;

          location / {
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Host $http_host;
              proxy_set_header X-NginX-Proxy true;

              # prevents 502 bad gateway error
              proxy_buffers 8 32k;
              proxy_buffer_size 64k;

              proxy_pass http://backend;
              proxy_redirect off;

              location /assets {
                root /var/app/current/public;
              }

              # enables WS support
              location /cable {
                proxy_pass http://backend;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
              }
          }
      }


container_commands:
  01restart_nginx:
    command: "service nginx restart"

デプロイのときにnginxの設定ファイルを更新するようなコード
.ebextensions\nginx_proxy.config · GitHub
をほとんどそのまま使わせてもらった。

デプロイしなおす

$ git add -A
$ git commit -am "add nginx config"
$ eb deploy

これで、ElasticBeanstalkの再起動が終わると、
f:id:ensekitt:20180516235620j:plain
ちゃんと表示できた。

作成したElasticBeanstalkの環境を捨てる

f:id:ensekitt:20180516235701j:plain
RDBも一緒に消える。
RDBのスナップショットも忘れずに消す。

やってみてどうだった?

一通りElasticBeanstalkにデプロイするところまでできた。
ベストプラクティスかはわからないけど、公開するところまではこぎつけられた。
便利ではあるものの、正直サービスのバックエンドとしては制限が逆に管理しにくくなっていて、
期間限定の静的サイトとかの使い方しかしなさそう。それならHerokuかなってところもあって厳しい。
ぐぐってみると色々情報が出てくるけど、結構変わっていることもある(AWSのドキュメントもなんか古かったり)
ので、最新の動作例を見つけるのが良さそう。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。