概要
AmazonLinux2023のECS最適化インスタンスの起動時にユーザーデータでCloudWatch Agentを導入しようとしたのですが、なぜかインストールが失敗したり、失敗したり、失敗したり、たまに成功したりで不安定でした。(主に失敗することばかり)
ECS on EC2環境のインスタンスは、Auto Scalingグループで管理されて起動テンプレートで色々と設定を行い、そこでCloudWatch Agentのインストールを実施するようにしていました。
CloudWatch Agentのインストールコマンド
以下のように本当にシンプルな内容です。
今回は、最初のインストールの箇所が失敗していました。
# インストール
sudo dnf install -y amazon-cloudwatch-agent
# ----(設定関連は省略)----
# スタート
sudo systemctl start amazon-ssm-agent
発生した問題
起動テンプレートでEC2の起動後にセッションマネージャー経由で接続して、ステータス確認したところ以下のようにインストールされていない状態でした。
sh-5.2$ sudo systemctl status amazon-cloudwatch-agent
Unit amazon-cloudwatch-agent.service could not be found.
あれっ、と思いインスタンスの起動時のシステムログを確認したところ、以下のようなエラーが出ていました。
[ 45.516162] cloud-init[1688]: [Errno 2] No such file or directory: '/var/cache/dnf/amazonlinux-9918409075bd901b/packages/amazon-cloudwatch-agent-1.300044.0-1.amzn2023.x86_64.rpm'
[ 45.516320] cloud-init[1688]: The downloaded packages were saved in cache until the next successful transaction.
[ 45.516462] cloud-init[1688]: You can remove cached packages by executing 'dnf clean packages'.
調べていたところ、AmazonLinux2023のissueにあるバグを踏んでいることに気がつきました。
↓で色々と議論されていますが、SSM Agentのアップデートが裏で行われていて、yumやdnfコマンドによるインストールが失敗するとのことです。
対応策(回避策)
この記事を書いている時点では、先ほどのIssueは対応されていない状況だったので、リトライを仕込んで回避するように対策しました。
変更後のインストールコマンドは以下のとおりです。
※issueに記載の回避策を使わせてもらっています
attempt=0
max_attempts=10
until sudo dnf install -y amazon-cloudwatch-agent; do
attempt=$((attempt + 1))
if [ $attempt -ge $max_attempts ]; then
echo "Failed to install amazon-cloudwatch-agent after $max_attempts attempts. Exiting."
exit 1
fi
echo "dnf install failed (attempt $attempt/$max_attempts), retrying in $attempt seconds..."
sleep $attempt
done