※本記事は Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル( 第1回 , 第2回 , 第3回 )の続きです。
( 第4回, 第5回とは独立した内容なので、第3回までで構築した環境で確認可能です。)
今回も異常系で、コンテナ(タスク)が起動しない場合のログの確認個所についてです。
インスタンスとサービスのスケール
いつものように、インスタンスとサービス(タスク数)をスケールアウトしてそれぞれ2に設定しておきます。
インスタンスのスケールアウト
ecs-cliコマンドでインスタンス数を2に変更します。ecs-cliコマンドのセットアップは 第4回の後半 に手順があるので参照して下さい。
## ※構成情報の設定
## ecs-cli configure --cluster <クラスタ名> --cfn-stack-name "EC2ContainerService-"<クラスタ名> --region <リージョン> --config-name <Config名(何でもよい)>
$ ecs-cli configure --cluster va-ecs-demo-cluster01 --cfn-stack-name EC2ContainerService-va-ecs-demo-cluster01 --region ap-northeast-1 --config-name vapractice-ecs
INFO[0000] Saved ECS CLI cluster configuration vapractice-ecs.
## ※インスタンス数の変更
## ecs-cli scale --capability-iam --size <変更後のインスタンス数> --cluster <クラスタ名> --region <リージョン> --aws-profile <awsプロファイル>
$ ecs-cli scale --capability-iam --size 2 --cluster va-ecs-demo-cluster01 --region ap-northeast-1 --aws-profile vatest
INFO[0000] Waiting for your cluster resources to be updated...
INFO[0000] Cloudformation stack status stackStatus=UPDATE_IN_PROGRESS
サービスのスケールアウト(タスク数を2にする)
awsコマンドでタスク数を2に設定します。
aws ecs update-service --cluster <クラスタ名> --service <サービス名> --desired-count <変更後のタスク数> --profile <awsプロファイル>
$ aws ecs update-service --cluster va-ecs-demo-cluster01 --service va-ecs-service01 --desired-count 2 --profile vatest
※サービス定義が出力されるが長いので省略※
タスクの起動エラー例(1):イメージ取得できない場合
タスクが起動しない状況を発生させるため、存在しないタグを入力してタスク定義を更新します。
この定義を指定してサービスを起動すると、タスク タブ → タスク → 前回のステータス に "STOPPED" とエラーが表示されます。
タスクをクリックし、コンテナの前にある▼ボタンを押すとエラーの詳細が表示されます。この場合は CannotPullContainerError: Error response from daemon: manifest for <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-demo01:tag_not_exists not found
という分かりやすいメッセージが出力されています。
タスクの起動エラー例(2):ECSインスタンスのリソース不足
エラーを発生させるため、awsコマンドでタスク数を3に設定します。
aws ecs update-service --cluster <クラスタ名> --service <サービス名> --desired-count <変更後のタスク数> --profile <awsプロファイル>
$ aws ecs update-service --cluster va-ecs-demo-cluster01 --service va-ecs-service01 --desired-count 3 --profile vatest
※サービス定義が出力されるが長いので省略※
今、ECSインスタンスタイプはテストのため t3.micro に設定していますが、このタイプでは1インスタンスに1タスクしか起動できない制限があるため、3個目のタスクは起動に失敗します。
その場合のログは、そもそもタスクが起動していないため (1) のタスク タブでは確認できず、サービス → イベント タブでの確認となります。
service XXXXX was unable to place a task because no container instance met all of its requirements. The closest matching container-instance XXXXX is already using a port required by your task. For more information, see the Troubleshooting section.
コンテナに割り当てるポートが無い(実際にはt3.microのためNICが増やせない)という趣旨のメッセージが表示されています。
タスクの起動エラー例(3):コンテナの構成に問題がある場合
コンテナの作りに問題がある場合は、コンソールでエラーが確認できない場合もあります。
例として以下のコンテナを使ってみます。
FROM httpd
COPY ./startup.sh /tmp/startup.sh
CMD ["/tmp/startup.sh"]
# ls -l
total 8
-rw-r--r-- 1 root root 70 Aug 28 17:02 Dockerfile
-rwxrwxrwx 1 root root 35 Aug 28 17:05 startup.sh*
# cat startup.sh
#!/bin/bash
/tmp/this_is_test.sh
この場合、Docker buildは通ってイメージのpull, pushもできますが、実行してみると this_is_test.sh が存在しないためエラーとなります。これをECSで動かそうとすると、コンソールでの表示は以下のようになります。
確認個所は (1) の場合と同じですが、 Essential container in task exited
というメッセージと終了コードしか表示されません。詳細はECSインスタンスにログインして、docker logsコマンドで確認する必要があります。
※ 目的のコンテナが起動していないことを確認
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e718e2a0838a amazon/amazon-ecs-agent:latest "/agent" 5 hours ago Up 5 hours ecs-agent
※ -aオプションで停止したコンテナを確認
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5bb58442aa3e <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-demo01:error_test "/tmp/startup.sh" 2 seconds ago Exited (127) 1 second ago ecs-va-ecs-task-definition01-6-nginx-demo01-aceeccfbdbc08bc03400
395828123ebe <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-demo01:error_test "/tmp/startup.sh" 12 seconds ago Exited (127) 11 seconds ago ecs-va-ecs-task-definition01-6-nginx-demo01-eed9e1b2fa92bbb88801
78e5ff41174f <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-demo01:error_test "/tmp/startup.sh" 21 seconds ago Exited (127) 20 seconds ago ecs-va-ecs-task-definition01-6-nginx-demo01-96858e87c1c1e2ac7700
※以下省略※
※ ログを確認
# docker logs 5bb58442aa3e
/tmp/startup.sh: line 2: /tmp/this_is_test.sh: No such file or directory
これでコンテナ起動時に発生していたエラーが確認できました。
以上が、サービス起動しない場合の主なログ確認のパターンとなります。
スケールイン
以降は毎回の手順ですが、サービスとインスタンスを0に戻しておきます。
サービスのスケールイン(タスク数を0にする)
awsコマンドで設定します。
aws ecs update-service --cluster <クラスタ名> --service <サービス名> --desired-count <変更後のタスク数> --profile <awsプロファイル>
$ aws ecs update-service --cluster va-ecs-demo-cluster01 --service va-ecs-service01 --desired-count 0 --profile vatest
※サービス定義が出力されるが長いので省略※
インスタンスのスケールイン
ecs-cliコマンドでインスタンス数を0に変更します。
## ecs-cli configure --cluster <クラスタ名> --cfn-stack-name "EC2ContainerService-"<クラスタ名> --region <リージョン> --config-name <Config名(何でもよい)>
$ ecs-cli configure --cluster va-ecs-demo-cluster01 --cfn-stack-name EC2ContainerService-va-ecs-demo-cluster01 --region ap-northeast-1 --config-name vapractice-ecs
INFO[0000] Saved ECS CLI cluster configuration vapractice-ecs.
## ecs-cli scale --capability-iam --size <変更後のインスタンス数> --cluster <クラスタ名> --region <リージョン> --aws-profile <awsプロファイル>
$ ecs-cli scale --capability-iam --size 0 --cluster va-ecs-demo-cluster01 --region ap-northeast-1 --aws-profile vatest
INFO[0000] Waiting for your cluster resources to be updated...
INFO[0000] Cloudformation stack status stackStatus=UPDATE_IN_PROGRESS