AWSのECSハンズオンやってみた

以下ハンズオンのリンク
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-confirmation_012.html


# 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/093024f3-d3eb-4a26-890c-42f4e570935d.png)

# 流れ
1. cloud9でコンテナイメージを作成
1. ECRのリポジトリを作成
1. コンテナイメージをECRにアップロード
1. クラスターを作成
1. タスク定義を作成
1. サービスを作成（サービスの中にALBとタスクが含まれる）
1. 稼働確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/bf6a6159-98c5-4b96-912e-fe98fff20efb.png)


# 作業内容
#1. cloud9で作業用の環境を作成
- amazonlinux2023
- 設定は特に気にしなくて良い

#2. cloud9でインスタンスのコンソールに入り、Dockerfileを作成
```
ec2-user:~ $ echo > Dockerfile              
ec2-user:~ $ ll
total 4
-rw-r--r--. 1 ec2-user ec2-user  1 Apr 22 13:52 Dockerfile
drwxr-xr-x. 3 ec2-user ec2-user 34 Apr 22 13:44 environment
drwxr-xr-x. 3 ec2-user ec2-user 17 Apr 17 22:01 go
```
#3. Dockerfileを開いて中に以下のコンテナイメージを記載
```
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
```
中身の詳細は以下
- 作成するコンテナイメージの基となるベースイメージは DockerHub で公開されている Ubuntu 18.04
- Web サーバーとして Apache HTTP Server をインストール
- 実際の Web ページに表示するために index.html を作成
- EXPOSE で、このコンテナは 80 ポート(HTTP) を利用することを宣言

#4. コンテナイメージをビルド
```
# イメージが他にないか確認
ec2-user:~/environment $ docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

# ビルド(-tオプションはタグ)
ec2-user:~/environment $ docker build -t hello-world .

# 数十秒でコンテナイメージの作成が終わる

# コンテナイメージが作成されていることを確認
ec2-user:~/environment $ docker images
REPOSITORY    TAG       IMAGE ID       CREATED              SIZE
hello-world   latest    3ecb0bbd7483   About a minute ago   205MB

# 他にコンテナが動作していないことを確認
ec2-user:~/environment $ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

# コンテナを起動
ec2-user:~/environment $ docker run -d -p 8080:80 --name h4b-local-run hello-world
e0298b0d68ad7bbc579344590f66f72fbd632728346b2c8b4bb1db4d6eec073e
```
docker runコマンドの補足
- -p : Cloud9 の Linux 環境の 8080 ポートを、コンテナ側の 80 番ポートと接続する指定。これによって、Cloud9 の画面上から、動かしているコンテナにアクセスするのが簡単になる
- -d : バックグラウンド実行
- --name : 名前の指定

#5. 動作を確認
```
# コンテナが動作していることを確認
ec2-user:~/environment $ docker ps
CONTAINER ID   IMAGE         COMMAND                  CREATED         STATUS         PORTS                                   NAMES
e0298b0d68ad   hello-world   "/bin/sh -c /root/ru…"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->80/tcp, :::8080->80/tcp   h4b-local-run

# ローカルホストの8080にアクセスするとコンテナの80へ行くことを確認
ec2-user:~/environment $ curl localhost:8080
Hello World!
```

#6. コンテナの中身を確認
```
# docker execコマンドによりサーバにログインしたかのようにbashが使える
ec2-user:~ $ docker exec -i -t h4b-local-run bash
root@e0298b0d68ad:/# cd /var/www/html
root@e0298b0d68ad:/var/www/html# cat index.html 
Hello World!
```

#7. ECRにコンテナイメージをアップロード
```
# ECRでプライベートリポジトリを作成しURIをコピー
# 再度cloud9のコンソールに戻る
ec2-user:~/environment $ ll
total 8
-rw-r--r--. 1 ec2-user ec2-user 535 Apr 22 13:56 Dockerfile
-rw-r--r--. 1 ec2-user ec2-user 569 Apr 17 20:27 README.md

# buildを実行(-t <ECR の URL>:<バージョン Tag> )
ec2-user:~/environment $ docker build -t 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1 .

# 再度コンテナイメージを確認
ec2-user:~/environment $ docker images
REPOSITORY                                                             TAG       IMAGE ID       CREATED             SIZE
000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld   0.0.1     3ecb0bbd7483   About an hour ago   205MB
hello-world                                                            latest    3ecb0bbd7483   About an hour ago   205MB
```

#8. コンテナイメージをECRにアップロード
```
# リポジトリにログイン
ec2-user:~/environment $ aws ecr get-login-password | docker login --username AWS --password-stdin 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/ec2-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

# コンテナイメージをアップロード
ec2-user:~/environment $ docker push 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1     
The push refers to repository [000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld]
a61a92ef202d: Pushed 
19dcff01c4a2: Pushed 
de44312c12b2: Pushed 
548a79621a42: Pushed 
0.0.1: digest: sha256:ee0af1933cdde643be42b8353757268b9245f21efc34e5258f2bb0637d3771fc size: 1155
```
アップロードされていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/1da917c4-ab84-464f-80ac-3030f50ad6f8.png)

#9. コンテナを動かすためのVPCやサブネット周りを作成

#10. ECSサービス画面に移動し、クラスターを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/33fe6591-914c-4626-82e7-df4584c481db.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/6c88d5ce-99e2-4593-9a39-818295b3727e.png)

#11. タスク定義を作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/803f9e39-5718-40bd-a077-08d7ba0e3e00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/ea832b45-8ac5-4f65-800b-8f5a75d38bdd.png)

#12. サービスを作成
今回はサービスに使用するタスク定義を#11で作成したものにし、必要タスクを2にしてALBを作成するように設定した。
１つのサービスにつきタスク定義は１つのみなのでWebサーバとAppサーバだったらサービスは２つとかになるはず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/9dcf2494-5cad-4b63-8408-e3b69314c833.png)

間違えてSGインバウンドで80を許可していなかったのでヘルスチェックに失敗し、タスクの停止、新規起動が繰り返されてた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/e9fd7622-67bf-44f8-8e10-4f0d9ea566c6.png)

#13. 確認
ALBのドメインをブラウザで見ると下記ページが表示されたので成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3510714/f05de891-65e3-4f41-ab85-00a4bc0d70a3.png)


# 振り返り
初めてなのでページを公開するまで時間がかかったが、運用面を考えるとEC2で構築するのと比べてECSはすごい楽になるんだろうなと感じた。

まだ、仕組み的に分かっていない部分が多いので勉強します。