◎はじめに
- 下記のようECSを使うためDockerの学習をしていましたが概要ぐらいは掴めた気がするため、今回はECS(Amazon EC2 Container Service)を実際に触ってみました。
1. ECS使用開始
■とりあえず触ってみよう
- とりあえずECSを動かしてみたかったため、下記公式ドキュメントの記載に沿ってやってみました。
- 今回はCLIは使っておらずAWSコンソールから実施しています。
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(クラスター、コンテナ、サービス)を開始出来ました。
今回はここまでになります。