AWS Elastic BeanstalkでRails5アプリをデプロイする際の注意点(後編)

# この記事

こちらの[前編](https://qiita.com/takahiro096041/items/83414887733049f290e3)の続きです。

# 再デプロイエラー

上記の記事で初回デプロイまでは難なくできましたが、再デプロイが全然上手くいきませんでした。
出ていたエラーが下記のようなものです。(文字化けはご容赦ください。)

```
Webpacker is installed 脂 魂
  Using /var/app/ondeck/config/webpacker.yml file for setting up webpack paths
  Compiling窶ｦ
  Compilation failed:
  yarn run v1.2.1
  $ /var/app/ondeck/node_modules/.bin/webpack --config /var/app/ondeck/config/webpack/production.js
  info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
  
 warning From Yarn 1.0 onwards, scripts don’t require “--” for options to be forwarded. In a future version, any explicit “--” will be forwarded as-is to the scripts.
  fs.js:1331
      writeAll(fd, isUserFd, buffer, 0, buffer.length, position, callback);
                                              ^
  
 TypeError: Method get TypedArray.prototype.length called on incompatible receiver [object Object]
      at Buffer.get length [as length] (native)
      at writeFd (fs.js:1331:45)
      at fs.js:1322:7
      at FSReqWrap.oncomplete (fs.js:123:15)
  error Command failed with exit code 1.
   (Executor::NonZeroExitStatus)
```

状況としては書き込み時にメモリなどの問題で失敗しているようでした。
私の環境ではVue.jsを使ってほぼSPAに近い状態だったので.vueファイルなどをコンパイルしたファイルが数MBとかなり大きくなっていたことが原因のようでした。

# 暫定策

**プレコンパイルをローカルで実施することにしました。**

インスタンスサイズにもよるのでしょうが、この方が格段にデプロイが早かったです。
結果的には下記のようなファイルで落ち着きました。

```01_yarn.config
commands:

  01_node_get:
    cwd: /tmp
    command: 'sudo curl --silent --location https://rpm.nodesource.com/setup_6.x | sudo bash -'

  02_node_install:
    cwd: /tmp
    command: 'sudo yum -y install nodejs'

  03_yarn_get:
    cwd: /tmp
    # don't run the command if yarn is already installed (file /usr/bin/yarn exists)
    test: '[ ! -f /usr/bin/yarn ] && echo "yarn not installed"'
    command: 'sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo'

  04_yarn_install:
    cwd: /tmp
    test: '[ ! -f /usr/bin/yarn ] && echo "yarn not installed"'
    command: 'sudo yum -y install yarn'
    
  05_mkdir_webapp_dir:
    command: mkdir /home/webapp
    ignoreErrors: true
    
  06_chown_webapp_dir:
    command: chown webapp:webapp /home/webapp
    ignoreErrors: true
    
  07_chmod_webapp_dir:
    command: chmod 700 /home/webapp
    ignoreErrors: true
```

```03_conteiner_comand.config
container_commands:
  01-bundle_install:
    command: bundle install --path vendor/bundle
  02-db_migrate:
    command: bundle exec rake db:migrate
  03-db_seed:
    command: bundle exec rake db:seed
```

その上で、環境変数は下記のようにしています。(実行時は1行)
()の中は適宜自分の環境に読み変えてください。

```
eb setenv
RDS_PORT=3306
SECRET_KEY_BASE=<secret_key>
RAILS_SKIP_ASSET_COMPILATION=true
RDS_PASSWORD=<pass>
RDS_DB_NAME=ebdb
RACK_ENV=production
RDS_USERNAME=<user_name>
BUNDLE_WITHOUT=test:development
RAILS_SKIP_MIGRATIONS=true 
RDS_HOSTNAME=<hogehoge.rds.amazonaws.com>
-e <environment_name>
```

デプロイ手順は下記。

```
bundle exec rake assets:precompile assets:clean RAILS_ENV=production SECRET_KEY_BASE=<secret_key>
git add .
eb deploy <environment_name> --staged
```

# 最後に

AWS Elastic BeanstalkでRailsアプリをデプロイする際の参考になれば幸いです。
Railsはまだ初心者のため、色々ご指摘ありましたら優しく教えてください。