ECSについて学習していたのですが、「タスク実行をしたが「タスク(コンテナ)が作成されない」エラーが起きたので原因の特定・解決まで至った方法を自身の理解・復習また文章力の向上のためアウトプットさせていただきます。
エラーが起きた時の状況
ECSで「クラスター」を作成→「タスク定義」→「タスク実行」までの手順の学習は問題なく進んでいたのですが、その後の「タスク(コンテナ)」が作成エラーが起きてしまいました。
「タスク実行」をすると一度はステータスが「Running」になり作成できそうになりますが、数秒経つとステータスが「Stopped」になってしまい作成に出来ない状況になりました。
「Dockerファイル」の内容
hiro@hiro test % ls
Dockerfile index.php
hiro@hiro test % cat' Dockerfile
FROM php:8.0-apache
COPY index.php /var/www/html
EXPOSE 80
「Dockerファイル」内の「index.php」の内容
hiro@hiro test % cat index.php
<?php echo 'Hello World'; ?>
hiro@hiro test %
*タスク(コンテナ)が作成され、「作成したタスク(コンテナ)詳細」>「ネットワークバインド」>「外部リンク」にアクセスしたら「index.php」に記述してある【Hello World】をブラウザで確認できればエラーの解決になります。
原因を特定する
「cloudwatch」でログを確認して原因を探しました。
「cloudwatch」のログを調べた結果
ログ調べてみるとexec /bin/bash: exec format error
と表記されていました。
このexec format error
をネットで調べた結果、原因は
M1 Mac(Apple silicon)を使用している場合は「docker buildコマンド」に「x86向け」のオプションが必要だったみたいです。
buildする時に
--platform linux/amd64
上記を追加し「x86向け」のオプションをつけるみたいです。
以下の記述でbuildしました。
hiro@hiro test % docker build -t test-2023 . --platform linux/amd64
「docker buildコマンド」に「x86向け」のオプションをつけたので再度確認します。
「Dockerファイル」の内容
hiro@hiro test % ls
Dockerfile index.php
hiro@hiro test % cat' Dockerfile
FROM php:8.0-apache
COPY index.php /var/www/html
EXPOSE 80
「Dockerファイル」内の「index.php」の内容
hiro@hiro test % cat index.php
<?php echo 'Hello World'; ?>
hiro@hiro test %
ブラウザ
「タスク(コンテナ)」が無事作成されており、「作成したタスク(コンテナ)詳細」>「ネットワークバインド」>「外部リンク」にアクセスするとブラウザで「Dockerファイル」に入っている「index.php」の【Hello World】も確認できましたのでエラーを解決できました。
まとめ
今回このような失敗が起きた時は「cloudwatch」のログでに「どんなエラー」が起きている事を確認することが大事なんだなと思いました。
ログのエラーを調べることにより「M1 Mac(Apple silicon)」のみで起きるエラーなどがあることも学習することができましたし、他のエラーが出た際も手探りで原因を探すより遥かに時間効率が良いと感じました。
今回のように「タスク(コンテナ)の作成失敗」や他のエラーが起こった際は「cloudwatch」のログを確認するように意識しようと思います。
最後まで読んでいただいた方、ありがとうございました。