AWS のコンテナーサービス Fargate を使ってみた

# はじめに

みなさん、こんばんは。某 Sier でクラウドアーキテクトをやってます、しいくまと申します。
コンテナーを勉強中ですので、コンテナー関連のブログを書き溜めていこうと思います。
普段仕事では Azure をメインで触っていますので、今回は AWS の方のコンテナーサービスである Fargate を使ってみたいと思います。

# コンテナーとは

サービスの説明の前に、コンテナーってなんぞやという方！
コンテナーとは、ざっくり言うと仮想化の技術のひとつです。
従来の VMware などの仮想化は、ハードウェアを仮想化し、仮想ハードウェアレイヤー以上を個別に仮想化していました。
このやり方ですと、1  台の物理サーバー上に複数の仮想サーバーを立てることができるといったメリットがありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/4b60dc5d-0dd4-3128-c5ae-344dbb5183e3.png)

仮想化ソフトウェアといえば、VMware がとても流行ったのが記憶にあるかと思います。
わたしも VMware ユーザーでした。
なのですが、仮想サーバーが増えるということは OS も増えるということです。
OS が増えるということはその分管理するタスクも増えます。(特に Windows のパッチ適用はどの企業も課題かと思います...)
また、仮想サーバー上のアプリケーションから物理ハードウェアにリーチするまでのオーバーヘッドが多少なりかかってしまいます。

そこで登場するのがコンテナーです。

コンテナーとは簡単に申し上げますと、アプリケーション実行環境以上を仮想化する技術です。
ひとつの OS 上に論理的に独立させたアプリケーション実行環境を作り、アプリケーションが動作します。
そのため、管理する OS は 1 つで済むのです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/13819f4a-7a58-993d-7300-ad5fa4ffcade.png)

あの Docker がコンテナー管理ソフトウェアにあたります。
緑色に囲っている部分がコンテナーになります。
コンテナーの中身は、アプリケーション実行環境とアプリケーションになります。

わたしは下記書籍で勉強しています。
手を動かしながら学べるので、なんとなく知った気以上にはなれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/d8bc0093-92d9-dba2-6ede-0cca9a28e382.png)

[Docker/Kubernetes 実践コンテナ開発入門](https://www.amazon.co.jp/Docker-Kubernetes-%E5%AE%9F%E8%B7%B5%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E9%96%8B%E7%99%BA%E5%85%A5%E9%96%80-%E5%B1%B1%E7%94%B0-%E6%98%8E%E6%86%B2/dp/4297100339/ref=sr_1_1?s=books&ie=UTF8&qid=1547047769&sr=1-1&keywords=docker%2Fkubernetes+%E5%AE%9F%E8%B7%B5)


みなさまもぜひポチってみてください。 (決して回し者ではございません)

# AWS Fargate とは

AWS 公式な情報ですと下記ブログが参考になるかと思います。

https://aws.amazon.com/jp/blogs/aws/aws-fargate/

> AWS Fargate is an easy way to deploy your containers on AWS. 

直訳しますと、
AWS Fargateは、コンテナをAWSにデプロイする簡単な方法です。
だそうです。

コンテナー管理ソフトウェアレイヤー以下はクラウドベンダーがやるぜ。
コンテナー以上をよろしくどうぞ。っていう感じで、とっても優しいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/677d3692-9c54-e233-8788-9b3cf84356a8.png)

上記図の赤い部分が、AWS Fargate になります。
ちなみに、Azure でいうと、Azure Container Instance (ACI) というのがそれにあたります。


# 実際に試してみた

では、どれだけ簡単なのか試してみようということで、
簡単ですが Web サーバー (Nginx) を立てて、確認してみたいと思います。
手順は以下のとおりです。

１．クラスターの作成
２．タスク定義の作成
３．タスクの実行
４．稼働確認
５．タスクの停止

Fargate ですと、タスクと呼ばれているものがコンテナーにあたります。
イメージとしては下記のような形です。
一番下にクラスターという入れ物があって、
その上でタスク (コンテナー) が稼働します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/dfaa2184-94a8-41b0-e7fb-7801d87f7e86.png)

Fargate はタスクが実行されている間、課金をされます。
ですので、使わないときは停止させておきましょう。
タスクの定義を消す必要はありません。


## １．クラスターの作成

クラスターを作成します。
マネジメント コンソールより、サービスの検索にて、「fargate」と入力します。
ECS (Elastic Container Service) を選択してください。
ECS は AWS のマネージド コンテナーオーケストラーサービスになります。
別途ご紹介したいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/064834b1-ef85-0bc6-31bb-baa41ecbc6a3.png)

[クラスターの作成] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/ac7759a9-0b9d-f536-c30c-9821595cce35.png)

[AWS Fargate を使用] を選択し、右下の [次のステップ] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/a32147c3-39ab-41be-def2-8454750d0fb1.png)

任意のクラスター名を入力し、[作成] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/39993628-8032-2cff-ef91-afc0eec79f90.png)

下記画面が表示されればクラスターの作成が完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/fb01115e-e5f0-c687-a845-10cfdadb0305.png)


## ２．タスク定義の作成

タスク定義を作成します。
右ペインより [タスク定義] を選択し、[新しいタスク定義の作成] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/c35b9529-472e-af44-1d3d-9b84c0547ba2.png)

起動タイプは [FARGATE] を選択し、右下の [次のステップ] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/fd0601c6-296f-a9f0-44ee-188dff00e335.png)

任意のタスク定義名を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/f975bd72-7ca1-d5c9-2189-f89294dfb3a0.png)

[タスクメモリ] および [タスク CPU] を選択します。
今回は検証ですので、最低限のスペックとしています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/6ee9a937-71b8-1fe4-11a2-cd11362b456b.png)

[コンテナの追加] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/35e9eb54-a415-17c3-99fc-fa7cd6215801.png)

任意のコンテナ名を入力し、イメージは [nginx] と入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/33cbc67b-9c5c-c4bf-48b0-e6a46088e1d7.png)

[Command] に下記を入力します。

```sh
CMD-SHELL,curl -f http://localhost/ || exit 1
```

このコマンドはヘルスチェックに使いたいコマンドとなります。
今回の Web サーバを想定しているので、
自身で curl を投げて、80 番ポートが生きているかの確認になります。

下記のパラメータを入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/64d92b97-1888-bfea-2f90-d918ce78f261.png)

(Interval) 30 秒おきに上記 Command を実行し、
(Timeout) 5 秒感応答がない場合は失敗とみなし、
(Retires) 3 回失敗するまでリトライする。
とういう設定になります。

ですので、障害検知までに、
30 秒 + 5 秒
30 秒 + 5 秒
30 秒 + 5 秒 
30 秒 + 5 秒 
= 140 秒 (約 2分半) かかるということですね。

(Start period) は起動時間を失敗とみなさないための猶予期間となります。

環境はそのまま

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/3fec19fd-1907-3f2d-3591-41e12960e2dc.png)

ネットワーク設定もそのまま

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/167dea68-906b-521f-2614-b3f9372c60ad.png)

ストレージとログもそのまま

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/8803247c-92e5-d41b-de47-c486b0dfa81d.png)

リソースの制限および DOCKER ラベルもそのままにし、[追加] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/6b6fc120-6e9a-525a-fb41-f94b644cc1b8.png)

[作成] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/fd1c9105-d5d6-62bf-0638-2fffae3d912f.png)

下記画面が表示されればコンテナー定義の作成は完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/ab97d8d1-e6e1-7181-6844-ee5d9d887118.png)


## ３．タスクの実行

作ったタスク定義を実行します。
右ペインより [タスク定義] を選択し、[アクション] - [タスクの実行] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/1b71dcb9-4f66-ff39-5d62-e00ce3852858.png)

起動タイプは Fargate を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/a4e72577-e6ce-2a44-ce53-b2a6ce58252a.png)

任意の VPC およびサブネットを選択し、[タスクの実行] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/41dceeac-8633-7644-f9d0-1e603b91350d.png)

下記画面が表示されればタスクの実行は完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/c2795228-c1e4-6358-b13a-b5b06ea21eef.png)

## ４．コンテナーの稼働確認

実際にアクセスしてみます。
クラスター管理画面より、対象のタスクを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/e9204e9f-dec8-b7c0-3b83-e67ef307a83f.png)

Public IP が割り振られている IP アドレスになります。
この情報をコピーして、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/9de6e8b9-ceef-90aa-74da-3d1ba861b78e.png)

ブラウザからアクセスすると、、、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/5b8cea79-d9a4-a47a-1012-64dddd8cb1d3.png)

応答がちゃんと返ってきました！
無事稼働しているようですね。

## ５．タスクの停止

タスクを停止させます。
停止対象のタスクにチェックをして、[停止] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/08c1658b-e0af-bbd1-b821-2751054f8769.png)

停止確認をされますので、[停止] を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/df11effa-7e22-a5ce-ddf9-46cc68eab0e6.png)

下記画面が表示されればタスクの停止は完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/224712/8c6f5b57-907e-a1f4-ebfd-e776d8e8ec26.png)


# さいごに

だいぶざっくり手順で申し訳いないです...
ただ、Azure の ACI と比較すると少し手順が多めかなという印象でしたが、
それでもポチポチですぐにデプロイすることが可能でした。
また、使った分だけ課金、Pay as you go ですので、ぜひ利用してみてください。