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

## 概要

[前回の記事](https://qiita.com/dmikita/items/c170b2a5b69077c7744e)の段階ではうまくいかなかったのがどうにかECS上でコンテナを動かすことができたのでその流れをまとめます。

## Dockerimageの準備
Dockerのイメージを準備します。

* resize.shを実行します。[こちら](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/move-environment.html)から取得します。引数でサイズを指定します。今回は20GiBで実施しました。

* サンプルとするアプリを取得します

```sh
git clone https://github.com/docker/getting-started.git
```

* Dockerfileを作成します。

```sh
pushd getting-started/app
touch Dockerfile
vi Dockerfile
```

* Dockerfileの中身は以下のようにします。

```Dockerfile
# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python2 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
```

* Docker imageのビルドを行います。またコンテナの動作を確認します。(コンテナの動作確認は実施しなくても構いません)

```sh
docker image build -t docker-sample:v1 .
docker run -dp 8080:3000 docker-sample:v1
```

* ECRにリポジトリを作成します。手順等は[以前の記事](https://qiita.com/dmikita/items/745b44b80bd34b8d9d57)を参照してください。ここでは`docker-sample`という名前で作成しています。

* 以下のコマンドでコンテナのイメージをECRにpushします。

```sh
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

docker image tag docker-sample:v1 ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-sample:v1

aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS --password-stdin https://${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-sample

docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com/docker-sample:v1
```

## セキュリティグループの準備
* 今回のアプリはポート3000でアクセスするためセキュリティグループのインバウンドにアクセスできるように設定を行います。

## タスク定義登録
* まずタスク定義を登録します。FARGATEを指定します。

![タスク定義.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/589c5eb6-598c-3fee-906b-cfbe47934aee.png)

* コンテナの追加を選択してイメージは前述のECRのイメージのURIを指定します。コンテナポートはここでは `3000` にしていますす。
![コンテナ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/e5329711-142b-7a60-fdf8-b97b30a43c30.png)

* タスクの定義は 画像のように設定してい行きます。
![タスク定義_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/dc5e1b31-7013-eec1-1873-8a899f9db96f.png)
![タスク定義_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/f8c4d83c-1713-ca93-2de6-5a1d9d40a87c.png)

## クラスターの作成
* `ネットワーキングのみ` を選択します。
![クラスター_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/ebeaccd9-d4cf-abf4-0f41-8e45de043e03.png)
![クラスター_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/d65c461e-e7b1-6765-8cf6-205f9a0e6b60.png)

## タスクの作成
* 最後にタスクを実行します。起動タイプは `FARGATE` を選択します。
VPCは作成済みのVPCを指定しています。サブネットも同様です。本来ならここでMulti-AZになるように複数サブネットを指定します。セキュリティグループは前述の段階で作成したセキュリティグループを使用します。ここで作成しても問題ありません。
ロードバランサーは使っていないためパブリックIPの自動割り当てを `ENABLED` を指定します。
![タスク_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/41d61391-6155-8724-8426-760046d057a9.png)
![タスク_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/f2b9a962-b172-2b6c-54dd-159bac45bc82.png)

![タスク_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/72d6cf8b-80cc-72e1-58b2-e6a9af4cc57d.png)
* 実行に成功すると以下のように `RUNNING` の表示に代わります。
![タスク_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/4c6ffb5d-8c6b-8319-39b5-66f940487292.png)


## 動作確認
* タスクの詳細画面からパブリックIPを確認します。
![タスク_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/404b3a08-037e-3ee7-6afb-e53aac5f7981.png)

* 確認したIPアドレスに `:3000` を追加することで以下のようにアクセスすることができます。
![完成画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657697/3b86baa7-c75f-98d6-8eb7-a6dcd122217c.png)


## 最後に
[こちら](https://www.sunnycloud.jp/column/20210309-01/)の記事を参考に実施することで無事ECRにpushしたコンテナを動かすことができました。
本来であればロードバランサーなどを使ってのアクセスなどを行うところですがひとまずはECSでコンテナを動かすことに成功しました。