Elastic Beanstalk で Railsアプリをデプロイする時にハマったとこ

# Elastic Beanstalk で Railsアプリをデプロイする時にハマったとこ

## まとめ
Elastic Beanstalk へデプロイした経験から、ハマりやすいポイントをまとめました。
詳細については、以下の__1回目__と__２回目__のところを参照してみてください。

* セキュリティグループ
* MySQL エンコード
* .ebextension 設定
* 各gemの対応



## 1回目
* 文字コード（日本語の場合、utf8 へ変更必要）
  * [RDSに作成したMySqlのDatabaseに日本語が登録出来ない問題 - Qiita](https://qiita.com/kijitora-neko/items/aab58b4c1f684353e075)
* セキュリティグループ
(Mysql2::Error: Can't connect to MySQL server on '*************.********.ap-northeast-1.rds.amazonaws.com' (4))
  * EC2 と RDS を同じVPC/サブネット上に置く方法
    * RDS のセキュリティグループに EC2 からのアクセスを許可する。
* rails db:createをやってくれない？
(Mysql2::Error: Unknown Databese'**********')
  * 下記コマンドにて、自分でMySQLに接続して、DB作成。
    * MySQL への接続（EC2上で（eb ssh））
      * mysql -h *****************.*********.ap-northeast-1.rds.amazonaws.com -P 3306 -u ***** -p
    * DB作成
      * create database ***********;

    * utf8 へ変更されているかコマンドを実行して確認

* initializers/carrierwave.rb 用に beanstalk へS3設定を追記



# 2回目

* eb init
* eb create
* RDS 作成
* ebに環境変数を格納
* .ebextensionを記述


* eb deploy

* EC2 cd /var/app/ondeck/ 内で
  * bundle update --bundler
  * gem install bundler:2.0.2

* local上の Ruby のversionを上げることでglobal環境のversionと合わせる

```
# install可能なversionを表示
$ rbenv install -l

# versionを指定してinstall
$ rbenv install 2.6.5

# インストールしたversionを使用可能な状態にする⇒shimsへの反映
$ rbenv rehash
$ rbenv local 2.6.5
$ rbenv global 2.6.5
```


* bundler のバージョンがあっていない？

(参照：[Gem::GemNotFoundExceptionと出てきたときの対処法 - Qiita](https://qiita.com/hirokik-0076/items/c5ee73f439ee53dbe45f))


```
$ gem install bundler -v '1.17.3'
```

```
$ bundle install
```

* MySQLのインストールでエラーが出る。
[mysql2 gemインストール時のトラブルシュート - Qiita](https://qiita.com/HrsUed/items/ca2e0aee6a2402571cf6)

```
$ gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
```


* nodeのversionが古いとかいうエラーがでた、mini-racer っていうgemを追加すれば直るって記述があった
（[ruby on rails - ERROR: ServiceError - Failed to deploy application. on ElasticBeanstalk - Stack Overflow](https://stackoverflow.com/questions/52160872/error-serviceerror-failed-to-deploy-application-on-elasticbeanstalk)）


* mini-racer入れたら直った？？
  * .ebextension に rails db:create を追加


* RDS のセキュリティグループを変更
* Sequel Pro から MySQLに接続できるかどうかを確認。→ できなかった
* EC2 に入って、コマンドで接続できるか

```
$ mysql -h *****RDSインスタンス*****.ap-northeast-1.rds.amazonaws.com -P 3306 -u **DB名** -p
```

→ 接続できた。
つまり、他の問題？

* EC2内から直接、DB(***-*****)を作成するコマンドを打ったところ、ハイフンは使えないということを言われる。
→ 環境設定の ***-***** を ***_***** へ変更。

* 再度、eb deployしたところ、同じエラーが出る。
→ わからないので、MySQLの中から ***_***** を作成してしまって、再度 eb deploy


* エラーコードが変わって、MySQLのエンコードが問題っぽい。
[[AWS][RDS][MySQL] 文字コードをutf8mb4にする - Qiita](https://qiita.com/Masahiro_T/items/9db89e12e39b2b6dbb45)

[【MySQL】Mysql2::Error: Incorrect string value 【エラー】 - Qiita](https://qiita.com/tomaaaaaaaaa/items/08ce75b95df3d310817a)


* 対象のRDSのパラメーターグループをさっき変更したものに指定する。


* 作ったDBを一旦削除して、作成し直す。

* これも意味がなく、過去のEBではまったところが確認し直したところ、以下の記事を見つける。
[RDSに作成したMySqlのDatabaseに日本語が登録出来ない問題 - Qiita](https://qiita.com/kijitora-neko/items/aab58b4c1f684353e075)


```
ALTER DATABASE データベース名 default character set utf8;
```


* 下記エラーコードが出たので、crontabのコードを削除して、再度デプロイしてみる。

```
container_command 06-crontab in .ebextensions/02_setup_app.config
```

ようやくデプロイ完了！！

## 追記
### 後日発生したエラー

* asset_pipeline 絡みのエラー
    * ebextension に追記。
    * https://dev.classmethod.jp/server-side/eb-asset-precompile/
* スワップ領域の確保
    * 「asset precompile でメモリ不足になることがよくある。」らしい・・・。 
    * https://qiita.com/takp/items/81dac88ca183ada8af25

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/