◎はじめに

  • 下記のようECSを使うためDockerの学習をしていましたが概要ぐらいは掴めた気がするため、今回はECS(Amazon EC2 Container Service)を実際に触ってみました。
  1. AWS ECSを使用する前にDockerを理解しなきゃ
  2. Docker学習中につき!(コマンドの整理とイメージ構築など)
  3. Docker学習中につき!(ユーザ定義ネットワークでコンテナ間の通信)

1. ECS使用開始

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

  • とりあえず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設定出来ることを、この時初めて知りました。

○ 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(クラスター、コンテナ、サービス)を開始出来ました。

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

元記事はこちら

ECS始めてみました。