ECS始めてみました。

#◎はじめに
・下記のようECSを使うためDockerの学習をしていましたが概要ぐらいは掴めた気がするため、今回はECS(Amazon EC2 Container Service)を実際に触ってみました。

1. [AWS ECSを使用する前にDockerを理解しなきゃ](http://qiita.com/mitzi2funk/items/14fa88d85498db28144a)
2. [Docker学習中につき！(コマンドの整理とイメージ構築など)](http://qiita.com/mitzi2funk/items/f5a2a5a69be495fdcd3c)
3. [Docker学習中につき！(ユーザ定義ネットワークでコンテナ間の通信)](http://qiita.com/mitzi2funk/items/0bf45032dff89d0ead77)

#1. ECS使用開始
<img width="249" alt="ECSアイコン.png" src="https://qiita-image-store.s3.amazonaws.com/0/50310/6b40dde6-98c3-dd90-cb18-cc608c1419b7.png">

■とりあえず触ってみよう
・とりあえずECSを動かしてみたかったため、下記公式ドキュメントの記載に沿ってやってみました。
・今回はCLIは使っておらずAWSコンソールから実施しています。

[[セットアップ]](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html)
[[Amazon ECS の使用開始]](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_GetStarted.html)

## 1-1. IAM
### ○ IAMユーザ作成
・セキュリティの観点からECS操作用のIAM ユーザーを作成する

### 1) Set user details
IAMコンソール - [Users] - [Add Users]

| item | value |
|:-----------|:------------:|
| User name | mitzi_ecs |
| Programmatic access | check |
| AWS Management Console access | check|
[Next: Permissions]

### 2) Set permissions for <Users Name>
[Create group]

| item | value |
|:-----------|:------------:|
| Group name | group-policy-ecs |

 [Filter: Job function] - [Policy name: "AdministratorAccess"] を選択 - [Create group]
 [Next: Review]
 ※全権限付与しちゃってます(とりあえず)

・作成したIAMユーザ
mitzi_ecs

### おまけ) sign-in URLに Aliasを設定
IAMコンソール - [Dashboard]
IAM Users sign-in link: 
https://<AWS ACCOUNT ID>.signin.aws.amazon.com/console
このリンクの右側にある [Customize]を押下し、Aliasを設定
↓
https://mitzi-users.signin.aws.amazon.com/console
Alias設定出来ることを、この時初めて知りました。

![2017-07-10_IAM Alias for ECS.png](https://qiita-image-store.s3.amazonaws.com/0/50310/c30060df-bd5b-7bcc-3a51-eb730c84942b.png)

### ○ IAM Role作成
> Amazon ECS インスタンスとサービスのロールは、コンソールの初回実行時に自動的に作成される

→ とあるのですが、私の環境にはなかったので新規作成

・IAMコンソール
[Roles] - [Create New Role]

| step | item | value|
|:-----------|:-------------------:|------------:|
| Step1 | Select role type | Amazon EC2 Role for EC2 Container Service |
| Step2 | Establish trust  | (スキップされました) |
| Step3 | Attach Policy    | AmazonEC2ContainerServiceforEC2Role |
| Step4 | Set role name and review | Role name: ecsInstanceRole(※) |
(※) (デフォルトで作成されるはずだった名称を付与)

・作成されたIAM Roleのpolicyは以下。ECS/ECRそしてlogs関連の権限が最低限付与されている。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:CreateCluster",
        "ecs:DeregisterContainerInstance",
        "ecs:DiscoverPollEndpoint",
        "ecs:Poll",
        "ecs:RegisterContainerInstance",
        "ecs:StartTelemetrySession",
        "ecs:UpdateContainerInstancesState",
        "ecs:Submit*",
        "ecr:GetAuthorizationToken",
        "ecr:BatchCheckLayerAvailability",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "*"
    }
  ]
}
```

## 1-2. ECS クラスター作成
###・ECSコンソール [Clusters] - [Create Cluster]選択

| item | value |
|:-----------|:-------------------:|
|Cluster name | mitzi-ecs-cluster (任意) |

###・Instance configuration

| item               | value |
|:-------------------|:-------------------:|
| Provisioning Model | On-Demand Instance (デフォルト) |
| EC2 instance type  | t2.micro <br> (任意. テストなのでお金が掛からないように) |
| Number of instances | (クラスターで起動する Amazon EC2 インスタンスの数を選択) |
| EBS storage (GiB)  | (ルートボリュームは8GBで固定の模様。こちらではデータボリュームのサイズを指定) |
| Key pair | (今回は既存のkey pareを指定) |

※これらのインスタンスは、Amazon ECS に最適化された最新の AMI を使用して起動されるとのこと。
[参考: Amazon ECS 対応 AMI](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-optimized_AMI.html)

###・Networking

| item               | value |
|:-------------------|:-------------------:|
| VPC | (コンテナインスタンスを起動するVPCを設定) |
| Subnets | (指定したVPCのSubnetを1つ以上選択可能) |
| Security group | (コンテナインスタンスにアタッチするセキュリティグループを選択) |
※ Instance Configuration同様、EC2 launch時の設定と大差なし

###・Container instance IAM role

| item               | value |
|:-------------------|:-------------------:|
| Container instance IAM role | ecsInstanceRole(※) |
(※)上述にて作成したIAM Roleがデフォルトで選択されていました。
ちなみにRole設定は必須項目となっており、選択しないと先に進めませんでした。

###・Launch
[Create]ボタンを押下すると launchが開始される
その結果は下記

###・Cluster Resources

```text
Instance typet: 2.micro
Desired number of instances: 2
Key pair: aws-hashimoto
ECS AMI ID: ami-e4657283
VPC: vpc-16a94573
Subnets: subnet-467f4500, subnet-ab0ce8dc
VPC Availability Zones: ap-northeast-1c, ap-northeast-1a
Security group: sg-c79765a2
Launch configuration: EC2ContainerService-mitzi-ecs-cluster-EcsInstanceLc-1NIUNEFA0R9O6
Auto Scaling group: EC2ContainerService-mitzi-ecs-cluster-EcsInstanceAsg-1LVE67JUKXLG8
```

## 1-3. リポジトリの設定 (テスト用リポジトリを下記のように作成)

```text
Repository name: example-repository
Repository URI : 253920042626.dkr.ecr.ap-northeast-1.amazonaws.com/example-repository
```

※このリポジトリにはまだ何も登録していないため、後述するとおり本稿では Docker Hubを利用しています。

##1-4. Docker イメージの構築、タグ付け、プッシュ
> Docker CLI を使用して既存のローカルイメージ (Dockerfile から構築したもの、または Docker Hub などの別のレジストリから取得したもの) にタグを付け、そのタグ付きイメージを Amazon ECR レジストリにプッシュします。

→ 今回はデフォルトリポジトリにあるimageを使うため、この工程はスキップしています。


## 1-5.タスク定義
###・ECSコンソール [Task Definitions] - [Create new Task Definition]

・今回は JSON 形式のタスク定義のため
[Configure via JSON] - タスク定義記載(※1) - [Save] - [Create]

※[Network Mode]未設定のままCreateすると、「Bridge」が設定されていた。
この辺はDockerでコンテナを作成する際と同じようだ。

(※1)　[Amazon ECS での AWS CLI の使用より](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_AWSCLI.html#AWSCLI_register_task_definition)タスク定義を拝借

> Docker Hub から取得した busybox イメージを使用し、360 秒間スリープ状態になるシンプルなタスク定義

```json
{
  "containerDefinitions": [
    {
      "name": "sleep",
      "image": "busybox",
      "cpu": 10,
      "command": [
        "sleep",
        "360"
      ],
      "memory": 10,
      "essential": true
    }
  ],
  "family": "sleep360"
}
```

## 1-6. サービス設定
###・サービスとは
> タスク定義の指定した数 ("必要数") のインスタンスを ECS クラスターで同時に実行して維持できます。これはサービスと呼ばれます。

> タスクが何らかの理由で失敗または停止した場合、Amazon ECS サービススケジューラは、タスク定義の別のインスタンスを起動してそれに置き換え、サービスで必要数のタスクを維持します。

→ Auto Scalingのような挙動のようです。

###・Create Service
タスク定義で作成した Task Definition: 「sleep360:1」(最新版)を選択して
[Actions] - [Create Service]

```text
 [Cluster] -> mitzi-ecs-cluster (公式のECS の使用開始どおりに進めていくとこの時点でClusterが出来ておらず、サービスを設定出来ませんでした。。)
 [Service name] -> mitzi-ecs-service (任意)
 [Number of tasks] -> クラスターで起動して維持するタスクの数
 [Minimum healthy percent] -> Auto Scaling GroupのMin Size(最小数)に似た設定のようだが、タスクに必要なインスタンス数のパーセント値を指定している
 [Maximum percent] -> こちらもASに似たような設定。デフォルト200%
```

###・Task Placement (オプション)
 > タスク配置戦略と制約を使用してタスクをどのように配置するかを指定できます。

→ 幾つかのテンプレートから選択可能

| item               | value |
|:-------------------|:-------------------:|
| Placement Templates | (例)AZ Balanced Spread(※1)|
(※1)オプション設定と公式にあるが、どれかしら選択しないといけない作りになっています
※AZ Balanced Spread: アベイラビリティーゾーン間およびアベイラビリティーゾーン内のコンテナインスタンス間でタスクを分散

###・Optional configurations
[Configure ELB] （オプション）
→ 今回のタスク定義では、portMappingsを設定していないため選択出来ませんでした。

[Configure Service Auto Scaling] （オプション）
→ 今回は利用しない

[Create Service]を押下するとサービス作成開始


## 1-7.確認
一先ずECS(クラスター、コンテナ、サービス)を開始出来ました。

![2017-07-10_ECS Service.png](https://qiita-image-store.s3.amazonaws.com/0/50310/a4ad8a97-5281-0fc0-f753-0bc697202a75.png)


今回はここまでになります。