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

※本記事は Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル( [第1回](https://qiita.com/VA_nakatsu/items/c8a4b24b8cffd0e9047b) , [第2回](https://qiita.com/VA_nakatsu/items/555d75cd8a7ff8584eaf) , [第3回](https://qiita.com/VA_nakatsu/items/62a064c32f147efffe69) )の続きです。
( 第4回, 第5回とは独立した内容なので、第3回までで構築した環境で確認可能です。)

今回も異常系で、コンテナ(タスク)が起動しない場合のログの確認個所についてです。

# インスタンスとサービスのスケール

いつものように、インスタンスとサービス(タスク数)をスケールアウトしてそれぞれ2に設定しておきます。

## インスタンスのスケールアウト

ecs-cliコマンドでインスタンス数を2に変更します。ecs-cliコマンドのセットアップは [第4回の後半](https://qiita.com/VA_nakatsu/items/7623653b695d203dcecc#ecs-cliコマンドのインストール) に手順があるので参照して下さい。

```shell
## ※構成情報の設定
## 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プロファイル>`

```shell
$ aws ecs update-service --cluster va-ecs-demo-cluster01 --service va-ecs-service01 --desired-count 2 --profile vatest
※サービス定義が出力されるが長いので省略※
```

# タスクの起動エラー例(1)：イメージ取得できない場合

タスクが起動しない状況を発生させるため、存在しないタグを入力してタスク定義を更新します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/57ea30ff-418d-546a-3c9f-bc38461e999b.png)


この定義を指定してサービスを起動すると、タスク タブ → タスク → 前回のステータス に "STOPPED" とエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/773845af-f645-7d86-6b4f-bbd770a6ee70.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/b1b47df3-b52e-b91b-6bcc-afbd5dd29d9a.png)

# タスクの起動エラー例(2)：ECSインスタンスのリソース不足

エラーを発生させるため、awsコマンドでタスク数を3に設定します。
`aws ecs update-service --cluster <クラスタ名> --service <サービス名> --desired-count <変更後のタスク数> --profile <awsプロファイル>`

```shell
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/de668ada-c816-cc0a-8fbe-6a27ced76e8b.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:Dockerfile
FROM httpd
COPY ./startup.sh /tmp/startup.sh
CMD ["/tmp/startup.sh"]
```

```shell
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/0f710094-e96e-29ed-631e-8a9940890877.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プロファイル>`

```shell
$ aws ecs update-service --cluster va-ecs-demo-cluster01 --service va-ecs-service01 --desired-count 0 --profile vatest
※サービス定義が出力されるが長いので省略※
```

## インスタンスのスケールイン

ecs-cliコマンドでインスタンス数を0に変更します。

```shell
## 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

- [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第1回)](https://qiita.com/VA_nakatsu/items/c8a4b24b8cffd0e9047b)
- [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第2回)](https://qiita.com/VA_nakatsu/items/555d75cd8a7ff8584eaf)
- [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第3回)](https://qiita.com/VA_nakatsu/items/62a064c32f147efffe69)
- [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第4回)](https://qiita.com/VA_nakatsu/items/7623653b695d203dcecc)
- [Amazon ECS(EC2タイプ)のちょっと長めのチュートリアル(第5回)](https://qiita.com/VA_nakatsu/items/c550e851d35b92b46ef8)