WindowsでDockerを使ってみた３（on AWS）

内容
◉趣旨目標
◉前回の記事からの続き。
◉現状の構成
◉作りたい構成
◉作りたい構成の細部
・VPCの作成
・セキュリティグループの設定
・ECRにイメージをプッシュ。
・ECS（クラスター）作成
・タスク定義
・サービスの作成
・【参考】タスクの実行



## 趣旨目標
前回の記事のアップデート。WindowsでDockerを構築し、MySQLを連携させてデータベースにレコードを追加することができたので、今回は、コンテナをAWS上のEC2,ECSを使用し、コンテナを設置、データベースにレコードを追加するところまで行う。

## 前回の記事からの続き。
前回の記事：
https://qiita.com/nikorasu277/items/18faba6be13a92628644

## 現状の構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/593e867f-6038-9230-948c-37e168ba0a0e.png)

## 作りたい構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/207969a5-d192-592f-a562-5c8156bacee1.png)

## 作りたい構成の細部
### VPCの作成
EC2インズタンス上でタスクを実行させるために先んじてVPCを作成。
今回はFargateではなく、EC2を使用する。
・作成するリソース「VPCなど。」
・名前タグ「keiji」
・IPv4 CIDR ブロック10.0.0.0/16
・マルチAZ
・パブリックサブネットを２つ。
・プラベートサブネットはなし。
・DNS解決を有効化（独自DNSを使用していない。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/e7e9ffbc-00a4-daa8-22b0-2d372b81490c.png)

### セキュリティグループの設定
作成したVPCのセキュリティグループを設定する。
・インバウンド80番を解放
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/37372b89-2066-dccf-b156-56a8d68eab88.png)

### ECRにイメージをプッシュ。
ECRのリポジトリ作成
・可視性設定「プライベート」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/8bfd859f-5f3d-10bc-3c61-efe571f5dce2.png)
・ローカルのDockerコンテナイメージのプッシュ。
AWS CLIがインストールされているか確認
```
aws --version
```
インストールされていない場合、AWS CLIをインストール。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

AWS CLIのインストールが初回で、かつLinuxの場合
```
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

あとは、赤枠内をクリックし、指示に従って表示されているコマンドを素直にAWS CLIにそのままコピペする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/6d44e413-919f-dfda-07a4-c49f63479231.png)
ここで初めてAWS CLIを使用する場合、次のエラーが返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a6769094-8799-0381-986b-6a64ecc07ddd.png)
エラーで示されたとおり、AWS CLIで次のコマンドを実行して、アクセスキーとシークレットキーを入力してセットアップする必要があります。
【参考】アクセスキーとシークレットキーの作成方法：
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html#Using_CreateAccessKey_CLIAPI
※キーの作成はIAMのマネジメントコンソールからでも作成可能です。
```
aws configure
```

このコマンドを実行したら、順次キーを入力しましょう。
以下は私の場合です。
ローカルからAWS CLIによってログインするコマンド。
```
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 851725271515.dkr.ecr.us-east-1.amazonaws.com
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/428326e1-b29e-a89c-bb54-f6df8238877b.png)

ローカルにあるdockerfileに任意のタグ名を付けて、イメージをビルド。
※必ずdockerfileが存在するディレクトリで実行します。

```:もし、dockerfileが見つからない場合
find / -name Dockerfile
```
このコマンドを実行し、見つかった時点でコマンドの実行を停めてあげましょう。


```:イメージビルドはこちら
docker build -t keiji-ecr .
```

ローカルで作成したイメージに名前付け。
```
docker tag keiji-ecr:latest 851725271515.dkr.ecr.us-east-1.amazonaws.com/keiji-ecr:latest
```

ローカルで作成したイメージをプッシュします。
```
docker push 851725271515.dkr.ecr.us-east-1.amazonaws.com/keiji-ecr:latest
```
こんな感じで流れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/7f3f88e1-6b31-03c9-abd1-b3980def0533.png)
ECRのコンソールでアクションから、「イメージ」がプッシュできたか再確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/9dac827b-cf13-a971-fd92-326eb89e50e0.png)

### ECS（クラスター）作成
・EC2を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/91aeb941-0043-6fa1-924f-b870257ec6dc.png)

### タスク定義
・80番ポート開放
・起動タイプEC2を選択
・先程作成したイメージURIでコンテナ設定
・コンテナポート80番解放
・ネットワークモード　awsvpc
・タスクロール、実行ロール　ecsTaskExecutionRole
・ログ収集　チェックを外す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/52ace746-3c06-ccd9-d0bc-e59c7f2b3e9d.png)

### サービスの作成
・先程作成したクラスターを選択
・ALBを選択
・必要なタスク「１」
・サービスタイプ「レプリカ」
・デプロイサーキットブレーカー　無効

サービス作成完了！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/a62ffaaf-132b-531a-111e-6a423c326d3a.png)

### 【参考】タスクの実行
```:AWS CLI
aws ecs run-task --cluster <クラスター名> --task-definition <タスク名> --network-configuration "awsvpcConfiguration={subnets=[subnet-1234567890,subnet-0987654321],securityGroups=[sg-1234567890],assignPublicIp=ENABLED}"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3518951/d134f83a-12c4-ad91-164b-c3897ff4a27b.png)
そもそも単発でのタスク実行はECSではなくAWS Lambdaと組み合わせて構成するのが最適なのかなと考えました。また、EC2かFargateの選択も要件に合わせて構成ですね。あと今回の場合DBへのレコード追加を手動でPythonコードを実行するコードなので、CI/CDと組み合わせてもっとアップグレードできそうですね！簡単にはできませんが(^^;勉強になりました。



では！