June 21, 2019

Elastic BeanstalkでPHP/Ruby混在プロジェクトをデプロイ

Elastic Beanstalk=EB

前提

ベースはCakePHP2プロジェクト。
CakePHP2には標準ではマイグレーション機能がない。
最初はCake用のマイグレーションプラグイン使ってたけど途中でRuby用のマイグレーションツールを使うように変更したらしい。
https://github.com/winebarrel/ridgepole
マイグレーションだけなのでRuby用でも使える。
デプロイ時にPHPとRuby両方必要になっている。

EBのプラットフォームは64bit Amazon Linux 2018.03 v2.8.12 running PHP 5.6
PHP7で動かないので仕方なくまだ5.6。
関係ないけど今回の目的は東京リージョンへの変更なので他は後から。

困ること

手動で作業するなら何も問題ない。
PHPとRuby同時にインストールできないなんてことはない。
bundle installしてマイグレーション実行すればいい。

問題はこれをEBの設定ファイル内でやろうとするとエラー。
元からRuby2.0がインストールされてるけどridgepoleは動かないのでアンインストールしてから2.4をインストール。
bundle installするとインストール失敗。

Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

Ruby環境はこれが多い…。native extension gemのせいで厄介なエラーに頻繁に遭遇する。
検索すればruby24-devel mysql-develもインストールすればいいと分かるけどEBではこれだけでは解決しなかった。

ここからは何も情報がない世界。

最終的にはPATH環境変数がないのが原因と分かった。
解決の糸口はenvしてみたらEC2にSSHしてenvとEBのデプロイ中のenvが違ったから。
デプロイ中の環境変数が足りてない。
gemのコンパイル時になにかのコマンドが見つからずにエラー、と。

設定ファイル

container_commands:
  01_install:
    command: |
      yum remove ruby20 ruby20-devel rubygems20 -y
      yum install ruby24 ruby24-devel mysql-devel -y
      gem install bundler --no-ri --no-rdoc
      /usr/local/bin/bundle install
    env:
      PATH: /sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/usr/local/bin
    leader_only: true
  02_migrate:
    command: /usr/local/bin/ridgepole ...
    leader_only: true
    env:
      LC_ALL: ja_JP.UTF-8
      LANGUAGE: ja_JP:ja

ridgepole実行時のLC_ALLなんかも普通は気付けない…。

PHPプロジェクトにRuby混ぜると何倍も複雑になる。

© kawax