LoginSignup
18
18

More than 3 years have passed since last update.

[AWS] Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第6回)

Last updated at Posted at 2019-10-30

※本記事は 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):イメージ取得できない場合

タスクが起動しない状況を発生させるため、存在しないタグを入力してタスク定義を更新します。
image.png

この定義を指定してサービスを起動すると、タスク タブ → タスク → 前回のステータス に "STOPPED" とエラーが表示されます。
image.png

タスクをクリックし、コンテナの前にある▼ボタンを押すとエラーの詳細が表示されます。この場合は CannotPullContainerError: Error response from daemon: manifest for <AWSアカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-demo01:tag_not_exists not found という分かりやすいメッセージが出力されています。
image.png

タスクの起動エラー例(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) のタスク タブでは確認できず、サービス → イベント タブでの確認となります。
image.png

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):コンテナの構成に問題がある場合

コンテナの作りに問題がある場合は、コンソールでエラーが確認できない場合もあります。
例として以下のコンテナを使ってみます。

Dockerfile
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で動かそうとすると、コンソールでの表示は以下のようになります。

タスクの表示:
image.png

確認個所は (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

Link

18
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
18