AWSでDocker使ってみた。

内容
・はじめに
・実行環境
・全般の流れ
・使用できるサービス
・Cloud9のセットアップ、イメージ作成
・ECRにイメージをアップロード
・VPCを作成
・クラスター作成
・タスクを定義
・サービスを作成
・リソースの削除
・さいごに

AWSサイト：

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-confirmation_012.html

## はじめに
本記事はAWS学習が本題です。SAA受験と実務に向けて学習します。
この題材にしたのは、使用できるAWSのサービスが豊富であったこと、また、Dockerは理解していたものの扱ったことがなかったため機能を理解するために選択しました。

## 実行環境
Windows11
AWS IAMユーザー（権限は全部持たせてます。）

## 全般の流れ
全般の流れとしては、AWS Cloud9（テキストエディタのようなもの。）でコンテナイメージの作成、AWS ECRにアップロードし、AWS ECS,AWS Fargateで動かしていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b4f948e4-d6a4-6ea7-5cd4-5018d05bb9eb.png)

## 使用できるサービス
ECR,EC2,ALB,Cloud9,Fargate,VPC(*´▽｀*)

## Cloud9のセットアップ、イメージ作成
既にCloud9にはDockerがインストールされている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/11696458-2367-31d1-5b54-7ac533f9e008.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b0c3ad34-79a1-dcb5-74fe-d6219c154715.png)
無料のインスタンスタイプで全然いける。
AmazonLinuxを使用して、タイムアウトを設定することで、課金を適切に管理する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d967be4e-853f-2041-1225-221d417824e2.png)

Cloud9の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6830eb09-6786-5850-e27e-fe0143a8d523.png)
VScodeみたいな見た目と使いごこちです( ..)φメモメモ

Dockerのバージョン確認
```
docker version
```
ちゃんとインストールされている。

ここで、立ち上げたばかりのサーバーに何がインストールされているか確認しておく。
```
docker images
```
当然なにも表示されません。

Dockerfileを作成する。イメージ作成に使うファイルなので、つづりが重要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9fb697c2-a207-9339-eda2-66d91f7abee9.png)

公式さんが示すコマンドに微修正！
改行の表示を触りますが、私の環境がWindowsだからかな？
ubuntuサーバーでイメージを作ることになるのですね。
DockerHub↓↓
https://hub.docker.com/_/ubuntu
公式が示すコマンド↓↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/87c62c6a-7bcb-39ea-cf39-124ac521ef3d.png)

ググって微修正したコマンド↓↓
```
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
```
Windowsでは改行の￥は読み込まないので、バックスラッシュ「\」に変えてあげる必要がある。

（参考）コピペすることで、不要な空白が入ってしまう場合、空白を削除するコマンド
```
$ sed -i "s/$(echo -ne '\u200b')//g" DockerFile
```
このコマンドを実行した後に、ファイルを保存する。

Dockerイメージをビルドする。
```
docker build -t hello-world .
```

イメージが作成出来たか確認
```
docker images
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/92056d50-978c-2409-e993-2e3cfd3b0df2.png)
でけたー

次のコマンドでコンテナ作成（実行）していく。
```
docker run -d -p 8080:80 --name h4b-local-run hello-world　
```
☆コンテナ名「 h4b-local-run」
☆　-d　でデタッチモード、バックグラウンドで実行する。本番環境などで状態を確認する必要がある場合は、省略。
☆イメージ名「hello-world」
☆ポートは「8080:80」を使います。

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/f139c52b-a083-9129-16e0-24296860e1a4.png)

Dockerが動いているか、ポートがフォワーディング状態か確認するコマンド
```
docker ps
```
実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/60be0529-308b-133b-cfee-e13a2d6ee076.png)
ポートについて蛇足：
「8080:80」は、私が今使っているPCの8080番ポートの通信は、コンテナ内の80番ポートにリダイレクトされる状態、つまり、ポートを介して繋がった状態と言える！

ということで、次のコマンドを実行して、機能しているか確認
```
curl localhost:8080
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/efc8481f-1abc-c889-c7bd-0b10b137a0c1.png)
できていますね。続いてCloud9の画面上の「preview」からも確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2d0cac1d-2e99-4a35-542e-f8d26baf574a.png)
OKですね。

（参考）デバッグ作業などを行う場合、コンテナ内に入るコマンド
```
docker exec -i -t h4b-local-run bash
```
h4b-local-run　は、任意（コンテナ名）


## ECRにイメージをアップロード
次のワードで検索する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e3946b63-3fd5-b1cb-66a0-aa4497f6c13a.png)

プライベートリポジトリを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/303ceb53-488f-4eb4-2ec3-0468874b6c4e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/db0389e5-3947-7a1f-1fbd-32c4b93b028c.png)
ここで、URIをコピーしておく。

次に、Cloud9に移動する。
コンテナイメージを定義する。
```
docker build -t 〇〇〇〇.dkr.ecr.us-east-1.amazonaws.com/〇〇〇〇:0.0.1 .
```
次のコマンドでイメージができたか確認
```
docker images　
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/4b657034-1874-5ab9-6754-59dda64a8d45.png)
おけい！
先程のaws ECRに作成したプライベートリポジトリに接続申し上げます。ｗ
ECRのURIをコピーしているはずなので、これを用いてDocker loginというコマンドでECRに接続します。
```
aws ecr get-login password | docker login --username AWS --password-stdin 〇〇ここにURIを入れる〇〇.com
```
succeededが表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/cbd85b23-4b14-2404-8479-790cd62cb0e2.png)

いよいよプッシュしていきます。ECRに接続できているので、イメージを放り込みます。
```
docker push 〇〇〇〇.dkr.ecr.us-east-1.amazonaws.com/〇〇〇〇:0.0.1
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/91573ab3-64d2-e41e-9922-49cbc40a3ce5.png)
このように流れていきます。
ECRでイメージがアップロードできたか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/17f67fcf-cea9-898b-9259-86233ebc38be.png)

## VPCを作成
ECSで命令し、Fargate（サーバーレス）で実際にコンテナを動作させます。そのためにVPCを先に作成する工程！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3c8440c6-3f3b-3602-1a1d-ea7df0267fed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/0b44bba2-0e30-b197-9763-c2444c283e6c.png)
マルチAZで、アドレスも余裕を持った範囲を準備する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2d2536a2-0733-d83d-eaf7-e1ae999d3b28.png)
公式さんの動画に従いパブリックにサブネットを作成する。NATゲートウェイはなし。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b1ed9a58-613f-ab75-f12b-146e678195d4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/5b558fc9-c09e-d164-e44e-7520f8a3f067.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/64cfc6f6-dab1-c1a3-5ee2-f3ffbfa4d25d.png)
赤枠の「VPCでフィルタリング」欄から作成したVPCを選択し、セキュリティグループで80番ポートを解放する設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a3f8c65e-b91e-d87e-71bb-9b4f21f99bcf.png)
インバウンドの設定を行っていく。
ルールを追加をクリックした後、デフォルトルートからのHTTPを通す設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/dc71a13a-7de9-80cd-4d12-a57d4d9524c5.png)
このように表示されればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/690a1d31-fcad-dc68-9ff6-a11251e99b53.png)

ここで改めて構成を確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b7f2a9ab-a397-f96c-60d6-ca55c284a653.png)
なお、仮想的な障害を発生させ、復旧する流れを確認する場合は、公式さんの動画を確認しましょう。本記事はALBの設置までやります！
次に行きます。

## クラスター作成
ECSに移動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/852ae7b8-2b8f-ac3d-d31a-ed56e9f33fde.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/96433f12-32e4-0b8f-a9b9-e7f2f86b53f5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9ed7bbd5-74ed-9b7d-edbc-a77811e03345.png)

真っ赤(´;ω;｀)公式さんも出ていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/3bf73465-fbc0-89d6-31b1-484f7f0451ce.png)
しっかり一意のネーミングをしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/b85df418-f8ba-63b0-6cd9-a0af829e51b8.png)
蛇足：
Fargate使っているのにEC2とかクラスター（EC2）とか設定していると訳がわからなくなりますが（泣）概念的にはクラスターがEC2で今回はサーバーレス。Taskがコンテナという解釈でOKなはずです。
進みます！

## タスクを定義
これまでやってきたことの総まとめ的な設定を行います。
コンテナに関する設定を決めることができます。
CPUは？
メモリは？
ポートは？
ヘルスチェックなどのオプションは？
環境変数は？
などなど。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9e78781a-0836-d7d9-b1e6-140ec0f9372c.png)
公式さんの資料を確認しつつ、お好きに設定しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/48945aea-9aa5-6135-9d54-5bb16c6ecaa6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8bd02856-f431-36fd-bab0-837bcaffbb72.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/be1f22d4-bce5-c737-7adc-d36684fd29c6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/ca4f3371-7091-e5b7-c1aa-d275b866b038.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/19f50338-2430-dba0-3d40-b52dc2b103d1.png)

このように表示されればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/fb5d4e16-85c7-2a23-59f2-4aa1565a2ad2.png)

## サービスを作成
ここで、冗長などのサーバーに関する設定ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a19b24ff-09e5-3591-bfc9-644765566511.png)

全般、キャパらないための設定、キャパった時の設定を抜かりなく設定を行う大事な工程。一人に仕事を任せるといつか壊れる(/・ω・)/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a54b3360-910b-14ae-ce7c-9eb6f118e533.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c704ee44-7a7f-0744-a0e3-fdc6130d1a54.png)

赤枠内、任意の数にいつでも設定変更できます。私は１個だけ設置して次にいきました。なお、最低限の数量を意味します。１つは中々ないのかな(p_-)実務だとしっかり検討ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d15f43ce-7d49-eadc-59dd-7379c6cd810c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/c191e86e-44fe-41a6-32ea-9b0dc445d413.png)

ネットワークに関する画像表示はありませんが、VPCが設定されており、サブネットが間違いないか確認をした後、次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/7d7c9ccc-9841-04be-e136-6e59d1415e81.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e7418cec-f737-ae62-8986-da4508376245.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/eb3a1ca6-eed2-ca79-ffa5-98381401220e.png)



最後に、ECSのコンソールのネットワークから、DNS名の下にある「オープンアドレス」をクリックすると次の様に表示され、問題なく稼働していることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/35ed205f-8e74-7c64-23bc-136670b96637.png)

## リソースの削除
公式においても削除についてしっかり説明されています。
軽く触れておきます。
ロードバランサーの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/2a686919-9df4-f7e3-c1b0-76d87c7ecda8.png)

ターゲットグループの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d193befa-bb71-c670-75b1-dad4f1578cfe.png)

ECSにてサービスを削除。そのためにタスクの必要数を「０」に設定して更新する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/0237b2a6-e45c-a359-d1b9-05542a2a4e82.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6338b784-df79-cd2c-4d4a-04bcc07dad28.png)

クラスターを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/ea57261b-cf0a-20cd-3078-484a8339c880.png)

VPCの削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e32eb584-7607-e4be-6077-b8beaeaaf788.png)

ECRにてプライベートリポジトリを削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/79a544ef-952d-056f-4d85-2c35cdaec6ba.png)

Cloud9にて削除
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8faa4b0d-919a-b9f6-ab6b-9af45aaa2922.png)


## さいごに
勉強になりました。特に、目に見えないとこを設定していくので、マルチAZにして、サブネットをどのように配置して、２個コンテナ作ったら、、、コンテナがどのように配置されているのか。恥ずかしながら思考が一瞬停止しました。(-_-;)しっかり理解した上で設計できるように技術と知識を蓄えていきます！

では！