AWSとDockerを雰囲気で触ってきたのでまとめる(インスタンス作成->docker runまで)

## AWS上でDockerを使ったサーバー構築をする

### 雰囲気的な持ち物

1. AWSアカウント
2. AWS client toolの用意(AWS CLI)
3. Githubアカウント(既存のプロジェクトクローンする用)
4. Docker実行環境

### 持ち物の用意


######AWS CLI -> ローカルからインスタンスに接続するためのコマンドラインインターフェース。


pythonでpipを落とす brewでもいい

```python get-pip.py```

```sudo pip install aws cli```

######あとで
```aws configure```
接続先のインスタンスの情報設定を行う

```
AWS Access Key ID [None]: ①後の手順のcredential.csvを参照する
AWS Secret Access Key [None]: ①後の手順のcredential.csvを参照する
Default region name [None]: ②立てたインスタンスのリージョン
Default output format [None]: ③json, text, table形式が選択できる こだわりがなければjson
```

######Dockerのインストール

DockerCommunityに新規登録後dmgが落とせます
https://store.docker.com/editions/community/docker-ce-desktop-mac




## 構築作業

1, IAM権限の設定, credential.csvのダウンロード, aws configure（持ち物2.を参照）
2, Dockerfileをローカルのプロジェクトに落とす
3, リポジトリの作成
4, クラスターの作成
5, タスク定義
6, タスクの実行
7, EC2上のDockerコンテナに入る

### 1, AWS コンソールを開く

AWSサービス -> IAM -> ユーザー


ユーザー名:なんでもいい
アクセスの種類:プログラムによるアクセス

アクセス権限

ポリシーのフィルタ横から
AmazonEC2FullAccess
AmazonEC2ContainerRegistryFullAccess
AmazonECS_FullAccess
AmazonEC2ContainerServiceFullAccess
AmazonEC2ContainerServiceRole
AdministratorAccess
をそれぞれ検索してチェック, 確認

2回目以降であれば
既存のポリシーを直接アタッチ->設定に飛ぶ

ユーザーの作成に成功すると.csvが落ちてくる
拾い忘れるとCLIから入れないので注意

### 2, ローカルのコマンドライン

既存のプロジェクトをcloneもしくは自作する

プロジェクト内で
```docker build -t project_name```で構成をビルドする
```docker run -d 80:80 --name project_name project_name:latest```
仮想サーバが起動する
* -d ホストのポート:コンテナのポート, 最後の引数はインスタンスのタグらしい
### 3, AWSコンソールに戻る

 サービス -> ElasticContainerService
 Amazon ECR -> リポジトリ

リポジトリの作成

リポジトリ名:必ずDockerfileのあるプロジェクトと同名。
後々sshする時に設定がめんどくさいらしい。

完了は押さずに下記をコマンドラインで実行。

```aws ecr get-login --no-include-email --region us-east-2```
cliからログイン

```docker build -t test .```

docker tag test:latest ************.dkr.ecr.us-east-2.amazonaws.com/test:latest
イメージとコンテナを紐つけ

```docker push ************.dkr.ecr.us-east-2.amazonaws.com/test:latest```
Dockerイメージをプッシュ

完了

### 4, そのままAWSコンソール

Amazon ECS -> クラスター
クラスターの作成

EC2Linux　+ ネットワーキングを選択

クラスター名:プロジェクトと同名
プロビジョニング:オンデマンドインスタンス(従量課金)
EC2インスタンスタイプ:t2.micro(最小)
インスタンス数:1
キーペア: EC2コンソールのリンクをクリック

識別しやすい名前で作成 pemはプロジェクトの適当な場所に置いておく
更新 -> 作成したキーペアを選択


### 5, そのままAWSのコンソール

AmazonECS -> タスク定義
新しいタスク定義の作成

起動タイプ互換性 EC2を選択

```
Fargate ?

EC2を立ち上げずにコンテナを立ち上げる仕組み <= new!!

  fargate使うとsshが使えない　CLIコンテナの中にアクセスする方法がない
  コンテナだけ立ち上がるため
  今回はEC2 Linux + ネットワーキングを選択する
  クラウドウォッチでログが出力される プロジェクト単位のログ管理はプログラムから実装する必要がある
```


タスク定義名:プロジェクト名と同名で良い
タスクサイズ:タスクメモリ:128GB(お試しサイズ)
コンテナの追加:プロジェクト名と同名で良い

メモリ制限：128GB

ポートマッピング:ホスト80:コンテナ80:tcp
セキュリティに80はよく使うのでよろしくないかも
任意

CPUユニット数:1

で作成。


### 6, そのまま(略)

クラスター -> タスク タブ

起動タイプ:EC2
タスク定義:さっき作成した名前:1
タスクの実行

パブリックDNSをポチってプロジェクトの画面が見えればおけ。


### 7, 

ElasticContainerInstance -> ネットワーク&セキュリティ
セキュリティグループ -> さっき立てたインスタンスに対してチェック -> アクション
インバウンドルールの編集

http, tcp, 80
リソースは カスタム, 0.0.0.0/0に設定,保存


コマンドラインに戻る

chmod 400 さっきの.pem
```ssh -i "さっきの.pem" ec2-user@インスタンスDNS URIで接続```

入れたらdocker psで動いているプロセスの確認ができる



## おまけ

####インスタンスの削除
インスタンスのみの削除はできない（起動・停止・削除はできる）
クラスターグループが動いている限りまた起動する可能性があるので
クラスターグループの削除で完全にインスタンスを削除できる

####感想
- ポリシーが１年３６５日に迫る勢いで用意されている、怖い。(用途が把握しきれなそう)
- 個人的にはGCPよりも導線が難しいと感じる
- IAMの設定は完全に雰囲気だった（しかし設定し忘れるとpushができない、危険）