AWS
docker
ECS

ECS始めてみました。

More than 1 year has passed since last update.


◎はじめに

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


  1. AWS ECSを使用する前にDockerを理解しなきゃ

  2. Docker学習中につき!(コマンドの整理とイメージ構築など)

  3. Docker学習中につき!(ユーザ定義ネットワークでコンテナ間の通信)


1. ECS使用開始

ECSアイコン.png

■とりあえず触ってみよう

・とりあえずECSを動かしてみたかったため、下記公式ドキュメントの記載に沿ってやってみました。

・今回はCLIは使っておらずAWSコンソールから実施しています。

[セットアップ]

[Amazon ECS の使用開始]


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

[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://.signin.aws.amazon.com/console

このリンクの右側にある [Customize]を押下し、Aliasを設定



https://mitzi-users.signin.aws.amazon.com/console

Alias設定出来ることを、この時初めて知りました。

2017-07-10_IAM Alias for ECS.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関連の権限が最低限付与されている。

{

"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
(任意. テストなのでお金が掛からないように)

Number of instances
(クラスターで起動する Amazon EC2 インスタンスの数を選択)

EBS storage (GiB)
(ルートボリュームは8GBで固定の模様。こちらではデータボリュームのサイズを指定)

Key pair
(今回は既存のkey pareを指定)

※これらのインスタンスは、Amazon ECS に最適化された最新の AMI を使用して起動されるとのこと。

参考: Amazon ECS 対応 AMI


・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

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. リポジトリの設定 (テスト用リポジトリを下記のように作成)

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 の使用よりタスク定義を拝借


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


{

"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]

 [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

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