ECSでコンテナ実行メモ その2

## 概要

[前回の記事](https://qiita.com/dmikita/items/745b44b80bd34b8d9d57)の後ECSでコンテナを動かそうとしましたが、`Essential container in task exited` のメッセージがでてうまくコンテナが起動できず、また[こちら](https://matsuand.github.io/docs.docker.jp.onthefly/get-started/02_our_app/)のアプリを使って構築してみようとしましたが、同様にうまくいかなかったので、まずは[こちら](https://dev.classmethod.jp/articles/amazon-ecs-entrance-1/)を参考にECSでコンテナを動かすところだけをまとめてみました。


## タスク定義登録
* まずタスク定義を登録します。ここで使用するコンテナのイメージなどを設定します。AWSコンテナ設計・構築入門 のほうではFARGATEで作成していますが、今回はEC2で実施します。

![タスク_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/5c21f106-e7c3-f1da-4a61-cc6c3594be0a.png)

![タスク_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/7bef2c95-093c-1c58-c1e9-a15233b3491a.png)


* コンテナ作成を選択してイメージは `httpd` を設定します。ホストポートとコンテナポートはここでは `80` にしていますが、`docker run -dp` で指定するポートを設定します。

![コンテナ_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/935f5aa2-676c-55fe-9d7c-ace978b18292.png)


## クラスターの作成
* `EC2 Linux+ネットワーキング` を選択します。インスタンスタイプは今回お試しなので`t3.micro` を指定します。
![クラスター_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/31cbac36-0892-52af-af39-d57119b1e13d.png)
![クラスター_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/7c729ef9-bb0d-1ca6-3f1f-ef6d7b3882ed.png)


* ネットワーキングは以前作っていたVPCを指定しています。サブネットも同様です。本来ならここでMulti-AZになるように複数サブネットを指定します。外部からつなげられるように確認するためセキュリティグループは作成していますが、事前に作成した方がよさそうです。
![クラスター_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/a6af3844-1609-879b-2b0f-0a29ff06995c.png)

* `CloudWatch Container Insights`は状況の確認に使えるのでオンにしておいた方がよさそうです。
![クラスター_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/1a79a9aa-d27c-58d4-b93e-22ff2d6ae302.png)

## サービスの作成
* 最後にサービスを作成します。ここで起動するコンテナの数やロードバランサーの設定などを行います。今回は特に設定はしません。
![サービス_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/e1c26bcd-fa7f-dce5-5fea-dec8c2b248ed.png)
![サービス_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/a092206b-e746-a70c-a13f-6f07b3c63c23.png)
![サービス_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/e1537666-42c2-bf42-ace4-4015cf89f82c.png)
* 前回のステータスが `RUNNING` になるまで待ちます。起動できないとここが `PENDING` となってしまい最終的に `Stopped` の方に表示されます。
![サービス_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/ee88bfb7-277e-165b-cd0a-4f16e372ee70.png)



## 動作確認
* EC2インスタンスが起動しているのでパブリックIPを確認しアクセスをすると以下のような画面が表示されます。
![起動確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/dfac122f-45f3-5d58-72f4-96c380d467c8.png)

## 最後に
実施しようと思った自分でECRに登録したコンテナの起動には失敗しましたが、ECSでの動かし方を整理することができました。
起動に失敗している原因を調べてうまく動かせるようになったらまた新たに記事を起こそうかと思います。
CloudWatchlogsでは以下のように出ていたのでコンテナ起動時に何か問題が起こっているようですが・・・

```log
-----------------------------------------------------------------------------------------------------------
|   timestamp   |                                         message                                         |
|---------------|-----------------------------------------------------------------------------------------|
| 1643522208791 | internal/fs/utils.js:269                                                                |
| 1643522208791 |     throw err;                                                                          |
| 1643522208791 |     ^                                                                                   |
| 1643522208791 | Error: ENOENT: no such file or directory, mkdir '/etc/todos'                            |
| 1643522208791 |     at Object.mkdirSync (fs.js:921:3)                                                   |
| 1643522208791 |     at Object.init (/app/src/persistence/sqlite.js:10:12)                               |
| 1643522208791 |     at Object.<anonymous> (/app/src/index.js:17:4)                                      |
| 1643522208791 |     at Module._compile (internal/modules/cjs/loader.js:999:30)                          |
| 1643522208791 |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)           |
| 1643522208791 |     at Module.load (internal/modules/cjs/loader.js:863:32)                              |
| 1643522208791 |     at Function.Module._load (internal/modules/cjs/loader.js:708:14)                    |
| 1643522208791 |     at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12) |
| 1643522208791 |     at internal/main/run_main_module.js:17:47 {                                         |
| 1643522208791 |   errno: -2,                                                                            |
| 1643522208791 |   syscall: 'mkdir',                                                                     |
| 1643522208791 |   code: 'ENOENT',                                                                       |
| 1643522208791 |   path: '/etc/todos'                                                                    |
| 1643522208791 | }                                                                                       |
-----------------------------------------------------------------------------------------------------------
```