EnsekiTT Blog

EnsekiTTが書くブログです。

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

つまりなにしたの?

AWS Cloud9からElasticBeanstalkにRailsアプリをデプロイしようとしたら、
・データベース設定
・nginxの設定
の2点でハマったのでその解決方法を書いておくことにした。
前編はどんな環境で何をやろうとしていたかについて。
f:id:ensekitt:20180516174832j:plain

Elastic Beanstalkってなに?

AWSにあるウェブアプリケーションやサービスをデプロイしたりスケーリングしてくれるサービス。
コードをアップロードすれば勝手にプロビジョニングしてくれたりロードバランスしてくれるって聞いて、
ヨッシャっと導入しようと思ったのが一番初め。
追加料金も必要なくて、基本的にはElasticBeanstalkから他のAWSサービスを使った分だけ(EC2とかRDBとか)
aws.amazon.com

どこからはじめて、どこまでやるの?

アプリを作って、ブラウザから表示して、環境を削除するまで

今回デプロイするアプリはDatabaseを使わないけど、普段はDatabaseを使うのでMySQLとの連携についても行う。
ensekitt.hatenablog.com
の続きから初めて、Production向けにHello worldを表示するだけのアプリをElasticBeanstalkにデプロイする。

前提

  • AWSで好きなサービスのコンソールにアクセスできること
  • Cloud9は使いこなせること
  • AWS RDBインスタンスは見に行けること
  • Gitがググって使えること

Cloud9にElasticBeanstalkの環境を用意する

Cloud9のコンソールで作業する

awsebcliをインストールする

$ pip install awsebcli --upgrade --user
$ eb --version
EB CLI 3.13.0 (Python 2.7.1)

Rubyのバージョンを上げておく

$ rvmsudo rvm install 2.4.4
$ rvm use 2.4.4

Gemfile中のバージョンを書き換える

# 対象ファイル: /Gemfile
# ruby '2.4.1'
ruby '2.4.4'

書き換え後Bundlerをインストールして以下を実行する。

$ rvmsudo gem install bundler
$ bundle install --without production

ここでrvmsudoを使わなきゃいけないっぽくて、なんかもにょる。
(Permissionおかしいよって怒られるので苦肉の策)

ElasticBeanstalkの準備を行う

Cloud9のコンソールで作業する

$ eb init

ElasticBeanstalkをデプロイしたい先を選ぶ。

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
13) cn-northwest-1 : China (Ningxia)
14) us-east-2 : US East (Ohio)
15) ca-central-1 : Canada (Central)
16) eu-west-2 : EU (London)
17) eu-west-3 : EU (Paris)
(default is 3): 1

今回はCloud9をus-east-1にしているので、1にした。Cloud9と同じにしておくと良いと思う。

アプリケーション名をつける

Enter Application Name
(default is "sample_app"): 
Application sample_app has been created.

アプリケーション名はRailsのアプリケーション名がデフォルトとしてサジェストされるのでそのままにする。

何をデプロイしようとしているか

It appears you are using Ruby. Is this correct?
(Y/n): Y

Rubyのプロジェクトで間違いないですよね?ってことでYesと答える。

プラットフォームのバージョンを選ぶ

Select a platform version.
1) Ruby 2.5 (Puma)
2) Ruby 2.5 (Passenger Standalone)
3) Ruby 2.4 (Puma)
4) Ruby 2.4 (Passenger Standalone)
5) Ruby 2.3 (Puma)
6) Ruby 2.3 (Passenger Standalone)
7) Ruby 2.2 (Puma)
8) Ruby 2.2 (Passenger Standalone)
9) Ruby 2.1 (Puma)
10) Ruby 2.1 (Passenger Standalone)
11) Ruby 2.0 (Puma)
12) Ruby 2.0 (Passenger Standalone)
13) Ruby 1.9.3
(default is 1): 3

Cloud9がRuby2.4.4(Ruby2.4.1をアップグレードするけどこれはあとでやる)のPumaなので3を選択した。

CodeCommitを使うか

Note: Elastic Beanstalk now supports AWS CodeCommit; a fully-managed source control service. To learn more, see Docs: https://aws.amazon.com/codecommit/
Do you wish to continue with CodeCommit? (y/N) (default is n): n

これまでもこれからもGithubを使うつもりなのでNo

SSHのセットアップがいるか?

Do you want to set up SSH for your instances?
(Y/n): y

Select a keypair.
1) hogehoge_key
2) [ Create new KeyPair ]
(default is 1): 1

最初うまくデプロイ出来なくてSSHをセットアップしていた。
もう完成していて動くのがわかっていたらSSHのセットアップは不要っぽい。

ローカル環境だとAWSのアクセスIDとかシークレットキーを効かれるけどCloud9なら特に聞かれない。

Production用のアプリを作る

コードを書いていく

最初にコントローラでHelloWorldを返すだけの関数を作成する

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base

    def hello
        render html: "hello, world!"
    end
end

Rootアクセスが有った時に、先程のHello関数が呼ばれるようにする。

# config/routes.rb
Rails.application.routes.draw do
    root 'application#hello'
end

ProductionではMySQLを使うようにする。

# /Gemfile
group :production do
  gem 'mysql2'
end
# config/database.yml
#production:
#  <<: *default
#  database: db/production.sqlite3
production:
  adapter: mysql2
  encoding: utf8
  database: <%= ENV['RDS_DB_NAME'] %>
  username: <%= ENV['RDS_USERNAME'] %>
  password: <%= ENV['RDS_PASSWORD'] %>
  host: <%= ENV['RDS_HOSTNAME'] %>
  port: <%= ENV['RDS_PORT'] %>

Cloud9で実行するとこうなる

$ rails server

f:id:ensekitt:20180516173806j:plain
これがElasticBeanstalkでも表示できれば良い。

これで一旦環境を作る。

#必要があればここでGithubと連携する
# 今回はローカルでGit管理するのみとする。
$ git add -A
$ git commit -am "init app"

ElasticBeanstalkの環境を作る

$ eb create
# 環境名をいれる
Enter Environment Name
(default is sample-app-dev): sample-app-dev
# アドレスの最初につくprefixをつける
Enter DNS CNAME prefix
(default is sample-app-dev): hogehoge-app

#ロードバランサのタイプをデフォルトにする
Select a load balancer type
1) classic
2) application
3) network
(default is 1): 

f:id:ensekitt:20180516173836j:plain
実行中にElasticBeanstalkを見に行くと実行している内容が表示されて、ワクワクしながら待つ。

終わったらこんな感じになって、当然何も表示されない。
f:id:ensekitt:20180516173914j:plain
え、これでできるんじゃないの?と思っていた自分は浅はかだった。

使ってみてどうだった?

Herokuってすごいんだなって感想をもった。
ensekitt.hatenablog.com

解決編になる後編は次回やる。
ensekitt.hatenablog.com
やった。

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