公式のトラブルシューティングに載ってないものをまとめてみました。
いろいろハマった気もしますが、覚えているやつだけ記載しています。
と、その前に
基本的なデバッグ方法としては以下の通りです。
- eb create をするときに --debug をつける
- eb ssh して直接インスタンスの中を確認する
- eb logs する
インスタンスが生成できていなければ 1. 、インスタンスが生成できていれば 2. 、pingで疎通できれば 3. で探っていく感じになります。
Q1. Application Load Balancer を選択するとエラーになる
eb create するときに Select a load balancer type で application を選択すると、こんな感じのエラーが出る。
eb : Configuration validation exception: Invalid option value: 'null' (Namespace: 'aws:ec2:vpc', OptionName: 'Subnets'): Specify the subnets for the VPC for load balancer type application.
A1. コマンドオプションで指定する
VPC が複数ある環境の場合、Elastic Beanstalk がどの VPC を選んだらいいか判断できないようで、このエラーが発生するみたいです。
なので、 eb create のコマンドオプションで VPC 関連の情報を指定すれば OK です。
eb create xxxxxxxx \
--elb-type application \
--vpc.id vpc-xxxxxxxx \
--vpc.elbsubnets subnet-xxxxxxxx,subnet-xxxxxxxx \
--vpc.ec2subnets subnet-xxxxxxxx,subnet-xxxxxxxx \
--vpc.elbpublic \
--vpc.publicip
Q2. リソースが作成できない
以下のようなエラーが出てリソースの作成に失敗する。
Stack named 'awseb-e-xxxxxxxxxx-stack' aborted operation. Current state: 'CREATE_FAILED' Reason: The following resource(s) failed to create: [ALB, AWSEBV2LoadBalancerTargetGroup, AWSEBBeanstalkMetadata, AWSEBLoadBalancerSecurityGroup].
A2. 権限を付与する
実行ユーザーに AWSElasticBeanstalkFullAccess というポリシーをアタッチすれば OK です。
ここでいう実行ユーザーとは ~/.aws/config
で指定している IAM ユーザーのことです。
Q3. composer / bundler などで落ちる
hooks/appdeploy/pre にある shell を実行するタイミングで落ちる。
例えばこんなエラーです。
/var/log/eb-activity.log を見てもだいたい解決しないのはお約束です。
ERROR: [Instance: i-xxxxxxxx] Command failed on instance. Return code: 1 Output: [CMD-AppDeploy/AppDeployStage0/AppDeployPreHook/10_composer_install.sh] command failed with error code 1: /opt/elasticbeanstalk/hooks/appdeploy/pre/10_composer_install.sh
++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
+ EB_APP_STAGING_DIR=/var/app/ondeck
+ cd /var/app/ondeck
+ '[' -f composer.json ']'
+ export COMPOSER_HOME=/root
+ COMPOSER_HOME=/root
+ '[' -d vendor ']'
++ /opt/elasticbeanstalk/bin/get-config optionsettings -n aws:elasticbeanstalk:container:php:phpini -o composer_options
+ PHP_COMPOSER_OPTIONS=--no-dev
+ echo 'Found composer.json file. Attempting to install vendors.'
Found composer.json file. Attempting to install vendors.
+ composer.phar install --no-ansi --no-interaction --no-dev
なんとかかんとか
Hook //opt/elasticbeanstalk/hooks/appdeploy/pre/10_composer_install.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
この場合は出ているエラーのうち、なんとかかんとかの部分で判断できます。
A3-1. Cannot allocate memory
Cannot allocate memory と出ているなら composer の実行時にメモリが足りていない可能性が高いので、.ebextensions でメモリを増やす設定を追加します。
option_settings:
aws:elasticbeanstalk:container:php:phpini:
memory_limit: 1024M
インスタンスを大きくするとかできるなら楽ちんです。
(swap ファイル作るでも解決できるはずだが調べてない)
A3-2. ErrorException
[ErrorException] Undefined index: hash
や
ERROR: bundle install failed!
の場合、lock ファイルおかしい可能性があります。
eb ssh をしてみて、lock ファイルを消してライブラリをインストールすると分かったりします。
# ruby なら
cd /var/app/ondeck/
sudo rm Gemfile.lock
bundle install
# php なら
cd /var/app/ondeck/
sudo rm composer.lock
composer.phar install
僕の場合は composer 自体のバージョンがローカル環境とあっていないためにエラーになっていました。
なので、.ebextensions でバージョンを指定して対応しました。
commands:
01updateComposer:
command: export HOME=/root && /usr/bin/composer.phar self-update 1.5-dev
Q4. DB に繋がらない
エラーログをみると DB に繋げないっていうのです。
A4. ローカル IP からのアクセスを変更する
原因としては Application Load Balancer を選択したせいで subnet の IPv4 CIDR が複数のブロックになった可能性が疑われます。
なので、MySQL にログインして該当のブロックアドレスに GRANT してあげれば OK です。
use mysql;
SELECT Host, User, Password, Select_priv, Insert_priv,Update_priv, Delete_priv FROM user; -- 権限を調べてみる
GRANT ALL PRIVILEGES ON database.* to hoge@"ブロックアドレス%" IDENTIFIED BY 'password' WITH GRANT OPTION;
Q5. 環境を削除しても消えない
Elastic Beanstalk のイベントでこんな感じになって環境が消せないという症状です。
The environment termination step failed because at least one of the environment termination workflows failed.
A5. 問い合わせたら消してくれるっぽい
まあ影響ないし置いといたらいいんじゃないかな。。。