Amazon Elastic Container Service入門やってみた

# はじめに
本記事はAWS公式のハンズオン資料「Amazon Elastic Container Service 入門　コンテナイメージを作って動かしてみよう」で実施した内容のアウトプットになります。
今まで利用機会がなかったのですが、今回初めてDockerに触れてみました。

**☆資料**
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-reg-event.html?trk=aws_introduction_page

# そもそもDockerとは？
簡単に言うと仮想化を行う仕組みです。
仮想マシンを使う仮想化の仕組みよりも軽量なのが特徴です。
一台のホストOSを共有して利用することで軽量化を実現しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/9dd47ee0-2d65-fb7c-d79f-f198dac86157.png)



# ざっくりの実施内容
- CloudShellを使ってコンテナイメージを作成する ※
- コンテナイメージをECRにアップロードする
- VPCを作成する
- ECSクラスターの作成とタスク定義の作成をする
- サービスの作成をする
- コンテナの自動復旧を試す（本記事では割愛）

※ハンズオン資料では、Cloud9を使用してコンテナイメージを作成していますが、
　Cloud9の新規利用はすでに停止しているためCloudShellを使用しました。

 # 実際やったこと
 ## ①Dokerfileの作成
 コンテナイメージを作成するには、Dockerfileを使ってbuildを行う必要があります。
 ハンズオン資料に添付されているドキュメントをもとに作成します。

```bash
vi dockerfile
```
dockerfileの内容は以下の通りです。
```bash
 FROM ubuntu:18.04
​
# Install dependencies
RUN apt-get update && \
 apt-get -y install apache2
​
# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html
​
# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
 echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
 echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ 
 echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ 
 chmod 755 /root/run_apache.sh
​
EXPOSE 80
​
CMD /root/run_apache.sh
```

FROMにはDoker Hubで公開されているコンテナイメージとタグを指定します。
添付ドキュメントに記載された内容をそのまま使ったので古いタグですが、最新は以下から確認できます。
[**Doker Hub**](https://hub.docker.com/)

その他実行しているコマンドの詳細についてはコチラのリファレンスを参照してください。
※簡単にいうとApacheをインストールしてからポート80で起動させている
[**リファレンス**](https://docs.docker.com/reference/dockerfile/)

## ②イメージのビルド（ローカルの環境でビルド）※やらなくてもOK
以下のコマンドでイメージのビルドを行います。
```bash
docker build -t hello-world .
```
-tでタグ名を指定します。ここではhello-worldというタグをつけました。
最後の「.」はdockerfileの場所を指定します。
カレントディレクトリにdockerfileを作成したので、.になっていますが、別の場所に作成した場合は作成した場所を指定します。

実行後、docker imagesコマンドを実行してイメージの一覧を表示します。
そうするとビルドしたイメージが表示されます。
```
[cloudshell-user@ip-10-130-44-44 ~]$ docker images
REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
hello-world   latest    17409d6c9676   37 seconds ago   205MB
```

## ③ECRでリポジトリの作成
ECRでプライベートリポジトリを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/b1b2e963-215a-53bf-af76-bfb294eeab03.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a7bf72b7-fc61-fef9-637a-141845475447.png)

作成したリポジトリのURIはビルドに利用するのでコピーしておきます。

## ④リポジトリにイメージをプッシュ
ECRにプッシュする用のイメージをビルドいます。

```bash
# 参考
docker build -t アカウント番号.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:0.0.1 .
```

次にECRにログインします。
```bash
aws ecr get-login-password | docker login --username AWS --password-stdin アカウント番号.dkr.ecr.ap-northeast-1.amazonaws.com
```
以下のメッセージが出ればログイン完了です。
```
WARNING! Your password will be stored unencrypted in /home/cloudshell-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
```

ログインが完了したらイメージをリポジトリにプッシュします。
```bash
# 参考
docker push アカウント番号.dkr.ecr.ap-northeast-1.amazonaws.com/testrepo:0.0.1
```

ECRの画面を見るとリポジトリにイメージがプッシュされていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a9bd76f7-58bd-f79b-68b4-4c347db68d20.png)

## ⑤VPCの作成
今回はインターネットゲートウェイやルートテーブルを一気に作成するので
「VPCなど」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/01cf32a6-3795-1757-2c17-aa8acbad1573.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/7caa76d8-5bad-1a09-298a-9166ecabb013.png)

### ⑥セキュリティグループの設定
今回作成するコンテナイメージではApacheでWEB画面の表示をさせるので、
ECSで利用するセキュリティグループのインバウンドルールに0.0.0.0/0からのport80へのアクセスを許可します。

## ⑦ECSクラスターの作成
ECSでコンテナを実行する際はECSクラスターを作成します。
ECSクラスターはコンテナが実行される論理的なグループです。
リソースの管理やスケーリングの管理を行う単位になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/a450b590-bbad-ac21-66bb-244629fbf308.png)

## ⑧タスク定義の作成
タスク定義とは、どのようなイメージをどういう設定で起動させるかを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/689fbf74-23c8-d178-b5a9-e538136ccd8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/53fff134-71b9-7461-3c42-9707fe269bbe.png)

## ⑨サービスの作成
ECSのサービスとは、クラスター内で実行するタスクを管理する役割を持つ機能です。
指定した起動タイプでいくつのコンテナを実行させるか、LBを利用するかなどを指定できます。

ここでは、Fargateタイプで2つのタスクを起動させます。
タスクはマルチAZになるようにAvailability Zone rebalancingが有効になっていることを確認します。
また、ここでALBも作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/b65bbe82-63de-114c-e00b-842b064f6b06.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/5528d65b-10fb-4017-ffce-e1abaab043dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/ef6d9ca0-b11a-4d7e-f563-c85970bcb112.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/b749b5bc-00cc-4270-8dcd-dfc39ecd02af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/72199200-6326-250d-0101-000f86a262ed.png)

サービスを作成してしばらくするとタスクが実行されてイメージで定義した内容が確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3776083/740a1275-ac54-8cac-9037-3eeb29c97580.png)

# おわりに
初めてDockerを使ってみましたが、非常に手軽に触ることができてもっと深く学習したいと思いました。
今回GUIで作成したVPCなどのリソースも今度はCLIで作成できるようにチャレンジしてみようと思います。