AWS ECSでDocker環境を試してみる

# 概要
AWS資格取得に向けて利用してみたAWSサービスの具体的な利用方法についての投稿です。
今回はAWS上でのDocker利用、 Amazon ECS(Amazon Elastic Container Service)を利用してみる編です。15分程度でDockerを利用したWebアプリケーションが公開できます。
勉強していてコンテナ、タスク、サービス、クラスターと言った用語に混乱してきたので実際にやってみました^^;

資格試験の勉強法は記事は以下を参照。

[AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/e5284a4ed3c3466ffd41 "AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法")
[AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/17fa401f4e46ecd00675 "AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法")

## 想定読者
* AWSでコンテナと言えばECSって気がするけど実際どうやってECS上でコンテナを動かすか知りたい人
* ECSのコンテナ、タスク、サービス、クラスターをAWSコンソールで確認して理解を深めたい人

## できるようになること

* Amazon ECSでのWebアプリケーションの公開

## およその作業時間

* 15分
 * ECSの「今すぐ始める」メニューをやってみます
 * すべてデフォルト値でも構築できその場合、5クリック5分で完了します^^;

## 必要な知識

* Docker
* Amazon ECS

## 予想料金

残念ながら無料ではありません。今回利用するのはAmazon ECSのFargate起動タイプになるので以下の料金がかかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/205afe9c-e6f6-d394-703c-a518a246930c.png)
参照元：https://aws.amazon.com/jp/fargate/pricing/

CPUのvCPU単位とメモリのGB単位で料金がかかります。あと、ポイントなのは**コンテナイメージのダウンロードを開始した時点から**ということですね。コンテナの起動有無に関わらず作成したら途中でコンテナ停止しても料金がかかっていることになります。（と言っても後述の**必要なタスクの数**で定義したコンテナが常時起動するので停止はあまり意味がないようです^^;）

今回の作成サンプルでざっくり計算するとCPU：**0.25 vCPU**(256)、メモリ：**0.5GB**(512)を利用するので、仮に一週間起動し続けたとすると

* CPU：0.05056USD x 0.25vCPU x 24時間 x 7日 = 約2.12USD
* メモリ：0.00553USD x 0.5GB x 24時間 x 7日 = 約0.46USD

合計 **約2.58USD** となります。
お試しであれば1日24時間も起動することはないと思うので安い！のではないでしょうか。
（もちろん他のサービス同様、使用用途によってはデータ転送量やCloudWatch利用料とかが追加されることはあるのでご注意ください）

## 手順の概要

ではやってみましょう。
とは言うものの、ECSの「今すぐ始める」メニューのウィザードに従って入力するだけです。
最初に全体像だけ説明すると、ECSの概念としては、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/0b5ac2fb-ba64-b856-3f97-f8b3d18aacdc.png)

図のように、**Container definition**、**Task definition**、**Service**、**Cluster**の4つがあり、こらをウィザードに従って3画面で設定してきます。

これがAmazon ECS理解の最初のハードルと思ったコンテナ、タスク、サービス、クラスターといった用語による混乱です。
それぞれの説明は以下のブラックベルト資料が分かりやすいと思いますが、なんとなく画面を進めながら設定値を眺めながらやっていくと理解できるようになると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/586c4a47-b2b3-180a-76fc-27df6a2f51b0.png)
参照元：https://www.slideshare.net/AmazonWebServicesJapan/20200422-aws-black-belt-online-seminar-amazon-elastic-container-service-amazon-ecs

では、始めます。
ECSの初期画面、またはクラスターの**今すぐ始める**をクリックして開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/95dd96d3-7bb5-435f-205e-dc76ff668a66.png)
または
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/7e728e82-3609-3b52-899e-45d159f56b67.png)
**今すぐ始める**をクリックして開始します。（クリック1回目）


### Container definition/Task definition設定

最初の画面でContainer definitionとTask definition設定を行います。
コンテナ定義では、デフォルトでhttpd、nginx、tomcatが用意されています。（今回はhttpdを選択）
コンテナ定義、タスク定義いずれも右上に**編集**ボタンが用意されており、一部パラメータのカスタマイズは可能です。
料金の所で書いたようにCPUとメモリは料金に関係してくれるの**編集**でカスタマイズしても良いと思います。
とりあえず今回はデフォルトのまま**次**をクリック。（クリック2回目）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/bdf1a4e4-5eac-afca-9883-360a4f441120.png)

### Service設定

次はサービス設定です。**ロードバランサー**としてALBを組み込めるようですが、とりあえず**なし**を選択。
この画面も**編集**ボタンで料金に関係する**必要なタスクの数**をカスタマイズできます。ただデフォルト値の1から減らすことはできないので、最小限という意味ではこのまま**次**をクリック。（クリック3回目）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/1d46de8b-0b05-6f2a-ec69-a58dcfafce49.png)

### Cluster設定

最後にクラスター設定です。と言っても**クラスター名**だけなのでデフォルトのまま**次**をクリック。（クリック4回目）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/6584fbfd-fd2e-3b28-5f2b-a9146f02f98a.png)

### 確認画面

確認画面が表示されるので、確認して**作成**をクリック。
以上！**クリック5回**で作成完了です！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/1e6c6e0c-6a23-9715-82d9-677815be6eeb.png)

### 作成画面

内部的にはCloudFormationを使っているようなので、頑張ってVPCから作ってくれていて問題がなければ2,3分後に作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/b8d4da04-a1fd-652c-5b06-b5615db15664.png)
2,3分後、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/39129eff-727b-348c-fcf9-eb2a90866c94.png)

**サービスの表示**をクリックしてみましょう。
作成されたVPCやサブネット、セキュリティグループの情報が確認できす。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/0146df3c-4542-ee97-31b8-c400f1f8a42e.png)


**タスク**タブから**作成されたタスク**をクリックすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/5a8ec1bf-f3ec-dae5-98be-0de2f6a5a8af.png)

**パブリックIP**が割り当てられているので、
http://{割り当てられていたパブリックIP}/
でアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/427283f7-2326-c8cf-e5fc-294d5beaef4e.png)


↓が表示されていれば問題なく作成できています。
AWS ECSでのWebアプリケーションの公開完了です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/74da9aac-75d5-e014-7c69-5a22f9b039ad.png)

実体としては、コンテナ定義の中に定義されている以下のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/104975fc-2e3b-a305-49b0-babd1d0d8529.png)

はい、クリック5回完了です。
あとはコンテナ定義などいじくり倒しましょう＾＾

### コンテナ確認

ここからは作成されたものを１つ１つ見てみます。まずはコンテナから。
**タスク定義**のなかに**コンテナ定義**があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/c728fca8-dbc8-f37f-87e2-1c39df202c44.png)

ポートマッピングやマウントポイントなど、コンテナ定義の名前そのままと言ってしまえばそれまでですが、Dockerfileの内容に関連する定義があることがわかります。

### タスク確認

次は**タスク定義**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/bebc4aeb-5001-f757-3a29-640902b48b59.png)

まず、タスク定義の中にコンテナ定義が含まれています。それに加えて、ネットワークモード、ロールやタスクサイズ（メモリやCPU）がタスク定義として役割のようです。（ブラックベルト資料の具体的定義がこの画面で確認できます）

### サービス確認

次は**サービス**です。**クラスター**メニューから具体的な**サービス名**をクリックして確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/8b4be435-67a8-93d3-d83c-22f465f84222.png)

まずは必要数（必要なタスクの数）があって、加えてロードバランシング設定、VPCやサブネットといったネットワークアクセス設定があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/ea458123-2bce-bb2c-2924-ffc3fda97dea.png)

タスクタブに移動するとタスク定義があり、この画面から複数タスク定義設定が可能なことがわかります。

### クラスター確認

最後は**クラスター**です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/6f829717-e359-c27f-741c-225726bfdbdb.png)

複数サービスを定義できる画面構成です。
ブラックベルト資料では、**実行環境、IAM権限の境界**と表現されています。
サービス定義、タスク定義でどのコンテナ定義をまとめるかにも依存すると思いますが、ロードバランシングがサービス定義にあることから、Webサーバ群のサービスとAPサーバ群のサービスの2つのサービスを1つのクラスター配下に定義する。といった使い方がイメージしやすいかなと思います。

### 補足１：自作Webアプリケーションのコンテナイメージの設定
Container definitionの**custom**、**設定**ボタンで自分で作成した今回のようなhttp（80ポート）のWebアプリケーションのコンテナイメージを指定するだけで簡単にWebアプリケーションの公開ができそうですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/d9a26bcf-5779-0238-1c59-e88cf59e5257.png)
開いた画面でコンテナのイメージを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/d7d102db-5484-cff1-179a-8bc9662fd3fd.png)

コンテナイメージの作成には以下の記事も投稿しているので参考までに。

[Windowsで構成情報をDockerfileに定義してイメージを作成してみる](https://qiita.com/fkooo/items/53b2ea865e8c2c7fec27 "Windowsで構成情報をDockerfileに定義してイメージを作成してみる")

### 補足２：作成したタスクの停止

試しにタスクタブから**停止**してみても、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/cae3027e-7ed5-c121-6fef-9c55f5132d48.png)

1,2分で再**PROVISIONING**され

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/aafe3ea4-2a4b-9a0b-6c9c-41b5882757b0.png)

すぐに**RUNNING**状態になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/acff5add-226c-ebfb-8183-71f922fbca98.png)


### 補足３：作成したWebアプリケーションの削除

**クラスター**メニューの**クラスターの削除**から簡単にできます。
CloudFormationを使っているのでVPCからコンテナのタスク定義までまるっと削除されます。
残しておくと料金がかかり続けるので不要になったら必ず削除しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/4aefdaa0-efe4-02df-3610-897280cee303.png)


## まとめ

想像したよりずっと簡単に作成できました。
誰かのコンテナ、タスク、サービス、クラスター理解に役立てればと思います。
今のままだとデフォルト設定のままなので今後は設定内容等、もう少し詳しくみてみる。。。かもしれません(^^;)

## 資格取得に向けてAWSサービスを実際に利用してみるシリーズの投稿一覧

[とりあえず30分でAWS利用料金の高額請求に備える～予算アラート設定・MFA・料金確認～](https://qiita.com/fkooo/items/67c53c997508e25605ea "とりあえず30分でAWS利用料金の高額請求に備える～予算アラート設定・MFA・料金確認～")
[AWS ECSでDocker環境を試してみる](https://qiita.com/fkooo/items/d7d98e16e91921508450 "AWS ECSでDocker環境を試してみる")（本記事）
[Amazon Cognitoを使ってシンプルなログイン画面を作ってみる](https://qiita.com/fkooo/items/660cab0090a80861155b "Amazon Cognitoを使ってシンプルなログイン画面を作ってみる")
[AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする](https://qiita.com/fkooo/items/a474db0f3c2e72448d36 "AWS NATゲートウェイを使ってプライベートサブネットからインターネットにアクセスする")
[API GatewayをPrivateで作成してみる](https://qiita.com/fkooo/items/577831abd9803eb91b16 "API GatewayをPrivateで作成してみる")
[AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる](https://qiita.com/fkooo/items/10f75bafd08c60fc0a66 "AWSのAI(Rekognition/Polly/Transcribe/Comprehend/Translate/Textract)サービスを試してみる")
[AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる](https://qiita.com/fkooo/items/1b24e01252e145a378db "AWS Lambda 同時実行数、エイリアス、環境変数とか実際の現場で使える機能を勉強してみる")
[AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～](https://qiita.com/fkooo/items/2dc5ded5149379d7305a "AWS Lambda SAMとは？～AWS SAMを使ってPythonのLambdaプログラムを簡単に作成する～")
[Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる](https://qiita.com/fkooo/items/84f8f57e2317b0973496 "Cloud9でAWS Amplifyの公式チュートリアルGetting startedをやってみる")