cd ~/blog/eb-nginx-cloudwatch-agent

2026-06-29

Elastic Beanstalk 再起動後に nginx が起動しなくなった原因と対処

AWSElastic BeanstalknginxCloudWatchebextensions

Elastic Beanstalk 環境の定期再起動後、nginx が起動せずクライアントにレスポンスを返せない状態になりました。複数の EB 環境で同時に発生し、AWS サポートの調査も経て根本原因を特定した記録です。

環境概要

  • アプリケーションは Elastic Beanstalk(Python 3.9 / Amazon Linux 2023)で運用しています
  • AM 0:00 に Lambda を定期実行し、EB 環境の EC2 インスタンスを reboot しています
  • Lambda での再起動は定期的な再起動による安定運用のために導入したものです。EB のスケジュール機能では EC2 レベルの reboot ができないため、Lambda から boto3 で reboot コマンドを発行する構成にしています

症状

AM 0:00 の定期再起動 Lambda 実行後、複数の EB 環境で同時に nginx が dead 状態になっていました。前日までは同じ処理が正常に動いており、アプリケーションやインフラの変更は直近で行っていませんでした。

根本原因

AWS 側のバージョン変動が prebuild を失敗させていた

2025/8/4 に AWS が CloudWatch Agent v1.300058.0b1191 を AMI にサイレント適用しました。その後このバージョンに問題が発見され、2025/8/6〜8/7 にかけて RPM リポジトリの latest が v1.300057.1b1167 にロールバックされました(AWS サポートより確認)。

この状態でインスタンスが再起動されると:

  1. ebextensions の packages: rpm: が latest(v1.300057)を取得してインストールしようとします
  2. インスタンスには AMI から v1.300058 が既に入っているため、RPM がダウングレードを拒否します
  3. cfn-init がエラー終了 → prebuild 失敗 → platform hook 中断 → nginx 未起動

ebextensions の packages: rpm: モジュールは、リポジトリ側のバージョンがインスタンスにインストール済みのものより古い場合、エラーとして終了する仕様になっています。

EB の nginx は platform hook が起動する

EB 環境の nginx は systemd の自動起動設定ではなく、EB の platform hook がインスタンス起動時に明示的に起動する仕組みになっています。

● nginx.service - The nginx HTTP and reverse proxy server
     Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; preset: disabled)

そのため、platform hook の前段にある prebuild でエラーが発生すると、処理がその時点で中断し nginx の起動まで到達しません。

対処

ebextensions の packages: rpm:container_commands 内の yum install コマンドに変更します。

変更前:

YAML
packages:
  rpm:
    cw-agent: https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm

container_commands:
  00_setup_cw_agent:
    command: "/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a append-config -m ec2 -s -c ssm:AmazonCloudWatch-config"

変更後:

YAML
container_commands:
  00_install_cw_agent:
    command: "yum install https://s3.ap-northeast-1.amazonaws.com/amazoncloudwatch-agent-ap-northeast-1/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm -y"
  01_setup_cw_agent:
    command: "/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a append-config -m ec2 -s -c ssm:AmazonCloudWatch-config"

yum install はリポジトリ側のバージョンがインスタンスのものより古い場合、何もせず正常終了します。AWS 側でバージョンの変動があっても prebuild が止まらなくなります。

update ではなく install を使う理由は、yum update はパッケージが未インストールの場合に何もしないためです。install はインストールもアップグレードも両方対応できます。

調査:ログから原因を追う

eb-engine.log:prebuild で止まっていた

EB のエンジンログを確認すると、インスタンス起動時の prebuild フェーズでエラーが発生し処理が中断していました。

2025/08/06 15:01:13 [ERROR] An error occurred during execution of command [self-startup]
  - [PreBuildEbExtension]. Stop running the command.
  Error: EbExtension build failed.
  Please refer to /var/log/cfn-init.log for more details.

前日(正常時)の同じログには nginx の起動コマンドが記録されています。

2025/08/05 15:02:25 [INFO] Running command: systemctl is-active nginx.service
2025/08/05 15:02:25 [INFO] Running command: systemctl start nginx.service

cfn-init.log:CloudWatch Agent のインストールが失敗していた

cfn-init.log を確認すると、ebextensions で定義した CloudWatch Agent の RPM インストール処理が失敗していました。

2025-08-06 15:01:31 [ERROR] RPM failed. Output:
  package amazon-cloudwatch-agent-1.300058.0b1191-1.x86_64
  (which is newer than amazon-cloudwatch-agent-1.300057.1b1167-1.x86_64)
  is already installed
2025-08-06 15:01:31 [ERROR] Error encountered during build of prebuild_*:
  Could not successfully install rpm packages (return code 2)

インスタンスには v1.300058.0b1191 が入っていましたが、ebextensions が参照する RPM の latest が v1.300057.1b1167 に戻っており、RPM がダウングレードを拒否してエラーになっていました。

教訓

  • EB の nginx 起動は platform hook が管理しています。 systemctl enable nginx では EB 環境での自動起動になりません。nginx が起動しない場合は systemd より先に eb-engine.log を確認してください。
  • ebextensions の rpm モジュールはダウングレードを拒否してエラーになります。 AWS 側の AMI とリポジトリのバージョンが一時的にずれることは起こりえます。外部パッケージの導入には yum install を使う方が冪等性が高いです。
  • AMI に既にパッケージがプリインストールされている場合があります。 ebextensions でのインストール処理が本当に必要かを定期的に見直すことをおすすめします。