78
1 Amazon EC2 Container Service AWS Black Belt Tech Webinar 2015 アマゾン データ サービス ジャパン株式会社 ソリューションアーキテクト 岩永 亮介 2015/6/24

AWS Blackbelt 2015シリーズ Amazon EC2 Container Service (Amazon ECS)

Embed Size (px)

Citation preview

1

Amazon EC2 Container Service

AWS Black Belt Tech Webinar 2015アマゾン データ サービス ジャパン株式会社ソリューションアーキテクト 岩永 亮介

2015/6/24

2

Agenda

• コンテナとは?

• Amazon EC2 Container Service - Basic

• Amazon EC2 Container Service - Advanced

• まとめ

3

コンテナとは?

4

ProcessProcess

コンテナとは?

• OS仮想化

• プロセス隔離

• イメージ

• 自動化

Server

Bins/Libs Bins/Libs

OS

App1 App2

Dockerfile

OS: Ubuntu

Apache, PHP

Dockerfile

OS: CentOS

Nginx, Ruby

Images

Build

Run Run

5

コンテナの利点

• 可搬性– 不変なイメージ

• 柔軟性– 削除、再生成が容易

• 速度– OSは既に起動済

• 効率– オーバーヘッド少ない

ProcessProcess

Server

Bins/Libs Bins/Libs

OS

App1 App2

Dockerfile

OS: Ubuntu

Apache, PHP

Dockerfile

OS: CentOS

Nginx, Ruby

Images

Build

Run Run

6

作業単位としてのコンテナ

Base

image

Patches

インフラ担当 開発者

Ruby

Redis

Logger

Utilities

App

ローカル開発環境 本番環境

7

Dockerでコンテナ起動時にできること

• リソース制限– CPU, memory使用量をコンテナごとに制限できる

• ポートマッピング– コンテナがListenしているポートに、Hostのポートからフォワードできる

• リンク– 同一Hostのコンテナに名前でアクセスできるようにする

• ボリュームマウント– Hostのファイルシステムをコンテナにマウントできる

• エントリーポイント/コマンド指定– コンテナ起動時に実行されるコマンドを指定できる

8

Amazon EC2 Container Service - Basic

9

Amazon EC2 Container Serviceとは?

• Amazon ECS

• Dockerコンテナ群をAmazon EC2のクラスタ上で管理できるサービス

• 高いスケーラビリティ

• AWSの他の機能・サービスとの連携

10

Dockerは1台のOSでは非常に簡単に使える

Server

Bins/Libs Bins/Libs

OS

App1 App2

11

何百台ものOSでは、コンテナ管理は非常に困難

12

コンテナ管理にはリソースマネージャが必要

• 計算機群のリソースを抽象化して管理

• 使う側は必要なリソース量のみを指定– 実際にどのマシンで動く

かを気にしない

• リソースの要求に対して適切にマシンをアサインする– スケジューラ

CPU: 500

Mem: 300

CPU: 10

Mem: 30 CPU: 2000

Mem: 1000

CPU: 10

Mem: 30CPU: 10

Mem: 30

Resource Manager

13

コンテナ管理のユースケース

• Service & Application– シンプルなモデル Docker imageをbuild, test, deploy

– Microservices

– Blue-Greenデプロイ

• Batch Jobs– リソースを共有することで、バーストにも対応しやすい

– Auto Scaling/RI/Spotを使って、よりコストを下げる

14

Amazon EC2 Container Serviceの利点

クラスタ管理はお任せ状態管理、操作、監視スケーラブル

簡単に、どんなスケールのクラスタも管理できる

柔軟なコンテナの配置

他のAWSサービスとの連携がデザインされている

拡張性の高さアプリケーションバッチジョブ複数のスケジューラ

Elastic Load Balancing, Amazon EBS, Amazon VPC, AWS IAM, AWS CloudTrail

包括的なAPIオープンソースエージェントカスタムスケジューラ

15

コンテナ管理に必要な要素

• クラスタ管理

– クラスタ全体の状態管理

• グループ化

– 同一マシンで動かしたいコンテナ群の管理

• スケジューラ

– タスク配置、状態管理、デプロイ

16

Cluster

Container Instance

Amazon ECSにおけるコンテナ管理の概要図

• クラスタ管理– Cluster, Container

Instance, Agent

• グループ化– Task Definition, Task,

Container

• スケジューラ– Run Task, Service

Agent

Task

Container

Container

Task

Service

Task Definition

Agent

Task

Task Definition

Run Task

17

Amazon ECSチュートリアル

• Container Instanceを起動し、Agentを稼働させる

Container Instance

Agent Agent

18

Amazon ECSチュートリアル

• 指定したClusterにContainer Instanceが登録される

Cluster

Container Instance

Agent Agent

19

Cluster

Container Instance

Amazon ECSチュートリアル

• Task Definitionを定義する

Agent Agent

Task DefinitionTask Definition

20

Cluster

Container Instance

Amazon ECSチュートリアル

• Run TaskでBatch Taskを開始

Agent Agent

Task DefinitionTask Definition

Run Task

21

Cluster

Container Instance

Amazon ECSチュートリアル

• 自動でContainer InstanceにTaskが割り振られる

Agent Agent

Task Definition

Task

Task Definition

Run Task

22

Cluster

Container Instance

Amazon ECSチュートリアル

• Task内のContainerが起動する

Agent Agent

Task Definition

Task

Task Definition

Run Task

23

Cluster

Container Instance

Amazon ECSチュートリアル

• ServiceでWeb Taskを開始する

Agent Agent

Task

Task Definition

Run Task Service

Task Definition

24

Cluster

Container Instance

Amazon ECSチュートリアル

• 自動でContainer InstanceにTaskが割り振られる

Agent Agent

Task

Task Definition

Run Task

Task

Service

Task Definition

Task

25

Cluster

Container Instance

Amazon ECSチュートリアル

• Task内のContainerが起動する

• もし設定していれば、Elastic Load Balancingに登録

Agent Agent

Task

Task Definition

Run Task

Task

Container

Container

Service

Task Definition

Task

26

Amazon ECS Components

27

Run Task

Amazon ECS: クラスタ管理

• クラスタ管理– Cluster, Container

Instance, Agent

• グループ化– Task Definition, Task,

Container

• スケジューラ– Run Task, Service

Service

Task DefinitionTask Definition

Cluster

Container Instance

Task

Container

Container

Task

Agent

Task

Agent

28

Amazon ECS: Cluster

• Container Instanceの集合体

• Cluster内のInstanceが持つリソースをまとめて管理

29

Amazon ECS: Container Instance

• コンテナのホストとなるAmazon EC2

• VPC内の任意のインスタンスを利用可能

– Docker+ECS Agentが動いていることが必要

– Amazon ECS-optimized AMI

30

Amazon ECS: Agent

• Amazon ECSのendpointと通信するエージェント

• Go言語製のDockerimage

• Docker Hubで提供

31

Run Task

Amazon ECS: グループ化

• クラスタ管理– Cluster, Container

Instance, Agent

• グループ化– Task Definition, Task,

Container

• スケジューラ– Run Task, Service

Service

Cluster

Container Instance

Agent Agent

Task

Container

Container

Task Task

Task DefinitionTask Definition

32

Amazon ECS: Task Definition

• コンテナの集合を定義– 必ず同じインスタンスで

稼働

– 要求するリソースを指定• CPU, memory, (Port)

• ボリュームも定義可能– インスタンスのファイル

システムを利用できる

• バージョニングが可能

33

Task Definition: Overview

Volume definitions

Container definitions

Container Instanceのファイルシステムをマウントする場合、定義する

稼働させるContainerの情報を定義する

34

Task Definition: Overview

Shared data volume

PHP AppTime of day

App

Task Definition

35

Task Definition: Overview

Container

Instance

Schedule

Shared data volume

PHP AppTime of day

App

Task Definition Task

36

Task Definition: Container Definition{"name": "simple-demo","image": "foo/my-demo","cpu": 10,"memory": 500,"portMappings": [{"containerPort": 80,"hostPort": 80

}],"mountPoints": [{"sourceVolume": "my-vol","containerPath": "/var/www/my-vol"

}],"entryPoint": ["/usr/sbin/apache2","-D","FOREGROUND"

],"essential": true

},

{

"name": "busybox",

"image": "busybox",

"cpu": 10,

"memory": 500,

"volumesFrom": [

{

"sourceContainer": "simple-demo"

}

],

"entryPoint": [

"sh",

"-c"

],

"command": [

"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done"

],

"essential": false

}

37

{"name": "simple-demo","image": "foo/my-demo","cpu": 10,"memory": 500,"portMappings": [{"containerPort": 80,"hostPort": 80

}],"mountPoints": [{"sourceVolume": "my-vol","containerPath": "/var/www/my-vol"

}],"entryPoint": ["/usr/sbin/apache2","-D","FOREGROUND"

],"essential": true

},

[

{

"image": "mysql",

"name": "db",

"cpu": 10,

"memory": 500,

"essential": true,

"entryPoint": [

"/entrypoint.sh"

],

"environment": [

{

"name": "MYSQL_ROOT_PASSWORD",

"value": "pass"

}

],

"portMappings": []

}

]Essential to our Task

Mount volumes

Expose port 80 in container

to port 80 on host

10 CPU Units (1024 is full CPU),

500 Megabytes of Memory

Task Definition: Container Definition

38

{

"name": "busybox",

"image": "busybox",

"cpu": 10,

"memory": 500,

"volumesFrom": [

{

"sourceContainer": "simple-demo"

}

],

"entryPoint": [

"sh",

"-c"

],

"command": [

"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done"

],

"essential": false

}

[

{

"image": "tutum/wordpress-stackable",

"name": "wordpress",

"cpu": 10,

"memory": 500,

"essential": true,

"links": [

"db"

],

"entryPoint": [

"/bin/sh",

"-c"

],

"environment": [

],

"portMappings": [

{

"containerPort": 80,

"hostPort": 80

}

]

},

]

From Docker Hub

Mount volume from other container

Command to exec

Task Definition: Container Definition

39

Amazon ECS: Task

• Task Definitionが実体化されたもの

– 1つのTask Definitionから複数のTaskが生成

• リソースに余裕のあるContainer Instanceで実行される

40

Amazon ECS: Container

• Taskの実体であるDockerのコンテナ

– 1つのTaskに複数のContainerが含まれる

• Container Instance上で実行される

41

Amazon ECS: スケジューラ

• クラスタ管理– Cluster, Container

Instance, Agent

• グループ化– Task Definition,

Task, Container

• スケジューラ– Run Task, Service

Cluster

Container Instance

Agent Agent

Task

Container

Container

Task Task

Task DefinitionTask Definition

ServiceRun Task

42

Amazon ECS: Run Task

• Batchジョブの様なワークロードに最適

• Task Definitionから指定した数のTaskを実行する

– Container Instanceは自動的に選ばれる

43

Amazon ECS: Service

• Web/APIの様に長期稼働するワークロードに最適

• Taskを必要数保ってくれるスケジューラ– 自動復旧にも対応

• 新しいTask Definitionをデプロイしつつ切替

• Elastic Load Balancingとの連携も可能

44

Amazon ECS: Serviceの例

45

Amazon ECS: ServiceのUpdate

• Serviceが使うTask DefinitionをUpdateすると、新しいTaskをデプロイできる

• 空いているリソースで新しいTaskを起動しながら、徐々に古いTaskを止めていく– 中間では、新旧のTaskが混在するため、完全なBlue-Green

Deploymentではないので注意が必要

46

Cluster

Amazon ECS: ServiceのUpdate

Service

Task Definition:1

Task:1Task:1 Task:1

47

Cluster

Amazon ECS: ServiceのUpdate

Service

Task Definition:1 Task Definition:2

Task:1Task:1 Task:1

48

Cluster

Amazon ECS: ServiceのUpdate

Service

Task Definition:1 Task Definition:2

Task:1Task:1 Task:1Task:2 Task:2

49

Cluster

Amazon ECS: ServiceのUpdate

Service

Task Definition:1 Task Definition:2

Task:1Task:2 Task:2

50

Cluster

Amazon ECS: ServiceのUpdate

Service

Task Definition:1 Task Definition:2

Task:1Task:2 Task:2Task:2

51

Cluster

Amazon ECS: ServiceのUpdate

Service

Task Definition:1 Task Definition:2

Task:2 Task:2Task:2

52

Amazon ECS: 利用料金

• Amazon ECS自体の利用料は不要

• Container Instanceとして使用するAmazon EC2の料金– On-demand/RI/Spotの料金、Amazon EBSの料金

– Spotを利用する場合はTerminateされる可能性を考慮する

• Elastic Load Balancingを利用する場合はElastic Load Balancingの料金

53

Amazon EC2 Container Service - Advanced

54

Amazon ECS Advanced Topics

• Volumes

• CPU/Memory

• Dynamic Port Mapping

• IAM Role

• Auto Scaling

• Agent Update

• Task Override

• Per Instance Limitation

• AWS Elastic Beanstalk

• Docker registry

• Logging

• Service Discovery

• Docker Compose

55

Amazon ECS: Volumes

• HostのfilesystemをContainerでmountできる仕組み※

– Container間の共有storageとして

– 永続storageとして

• Task Definitionでvolumesを定義する

Host

Container 1

Container 2

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html

56

Amazon ECS: Volumesの永続化/非永続化

• Hostに永続化する時– volumesでHostのパス

をhost.sourcePathで定義する

• Hostに永続化しない時– 上記を指定しないと、

Task起動時に空のvolumeが作成される

– 使っているContainerが無くなったらDockerに回収される

←永続化する

←永続化しない

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html

57

Amazon ECS: Volumesのmount方法

• mountPointsで指定

– volumesをContainerのどこにmountするか

– readOnlyにもできる

• volumesFromで指定

– sourceContainerと同じ様にmountさせる指定方法

←何をどこにmountするか定義

←webと同じ様にmountする定義

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html

58

Amazon ECS: CPU/Memory

• CPUの単位は「1024 unit = 1 core」※

– unitを指定すると、最低それだけは使えることが保証される

– もし指定量以上を使おうとした時は、CPUに空きがあれば使える

– CPUに空きがなくなると、unitを元にキャップがかかる

• Memoryの単位は「MiB」※

– もし指定量以上を確保しようとすると、Containerは殺される

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

59

Amazon ECS: Dynamic Port Mapping

• Task起動時にHost上の空きポートが自動的にマッピングされる– OSのephemeral port

• Task DefinitionでhostPortを0または指定しないと利用可能※ Container Instance

Task

Container

Task

Container

49200

Task Definition

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html

80

49201 80

60

Amazon ECS: Dynamic Port Mapping制約

• Elastic Load Balancing連携では、現状利用できない– Elastic Load Balancing側

の仕様でDynamic Portに対応していないため

• この場合、hostPortを固定する必要がある– 同一Taskは、1つの

Container Instance上に1つまで

49200

49201

49202✘

インスタンス毎にポート変更できない1インスタンスの複数ポートを登録できない

8080

8080✔※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

61

Amazon ECS: IAM Roles

• Instance Role– Container InstanceのProfileに指定

• AWS Managed Policy: AmazonEC2ContainerServiceforEC2Role

– Amazon ECSのAPIを実行できること

• Service Role– Serviceが利用するRoleを指定

• AWS Managed Policy: AmazonEC2ContainerServiceRole

– Amazon EC2, Elastic Load BalancingのAPIを実行できること

• いずれもGetting Startedで自動作成される

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/IAM_policies.html

62

Amazon ECS: Auto Scaling

• Container InstanceのAuto Scaling増減にServiceのDesired Tasksは追従しない– Container Instanceの数が増減したからといって、自動でTask

の数が増減するということはない

• 自動で増減させたければ、何かしらのAPI連携が必要– 例: Auto Scaling Groupの増減→Amazon SNS→AWS

Lambda→Amazon ECS ServiceのDesiredCountを増減※

※ http://dev.classmethod.jp/cloud/ecs-integrate-autoscaling-by-lambda/

63

Amazon ECS: Agent Update

• マネージメントコンソールやCLIから、Agentをアップデート可能※

• Amazon ECS-optimized AMIで利用可能

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html

64

Amazon ECS: Task Override

• Run TaskではTask Definitionの一部をOverride可能※

– Command

– Environment

• Serviceでは未対応

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_run_task.html

65

Amazon ECS: Per Instance Limitation

• 現時点ではContainer単位ではなくInstance単位となっているもの

• Security Group– 全てのContainerの最大公約数的な指定が必要– Elastic Load Balancingを通せば外部からの通信は絞れる

• IAM Roles– 全てのContainerの最大公約数的な指定が必要

• AWS CloudWatch metrics– Container毎のメトリクスは取得されない– 必要であれば、他のソリューションとの組み合わせ

66

Amazon ECS: AWS Elastic Beanstalk

• Multicontainer DockerEnvironment※

– 実は裏側でAmazon ECSを使っている

– Cluster, Container Instance, Task Definition, Taskが自動生成される

※ http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_ecs.html

67

Amazon ECS: AWS Elastic Beanstalk

• Dockerrun.aws.jsonの記述は、Task Definitionとほぼ同じ※

– AWSEBDockerrunVersionに"2"を指定

– Single container Docker Environment(Version 1)とは違う形式

• Auto Scalingで増えたInstanceにもTaskが自動で配置される– Service/Run Taskスケジューラは使用していない

– startTask APIでContainer Instanceを指定してTaskを実行

※ http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_v2config.html

68

Cluster

Amazon ECS: Docker Registry

• Docker Hub等のprivate image利用可能※

– AgentにECS_ENGINE_AUTH_* 環境変数で認証情報を渡す

• Amazon ECS上に、Private Registryを立てることも可能

※ http://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth.html

Service

Task Definition

registry:2

Service

Task Definition

docker.local/foo

docker.local

69

Amazon ECS: Logging

• Containerのログを集める必要がある– Containerが終了すると

ファイルは消えてしまう

• 例: Task DefinitionでLogger Containerを定義– rsyslogでログを受け取っ

て送る※

– 共有Volumeを使って書かれたログを送る

※ https://blogs.aws.amazon.com/application-management/post/TxFRDMTMILAA8X/Send-ECS-Container-Logs-to-CloudWatch-Logs-for-Centralized-Monitoring

例: Logger Containerはrsyslogでログを受け取り、CloudWatch Logs agentでログを転送する

70

Amazon ECS: Service Discovery

• Dynamic Port Mappingを活用したい時に必要– IPアドレス+hostPortのリス

トを動的に管理する

• 例: consul + registrator※

– registrator経由でconsulにHostのIPアドレスとhostPortが保存される

– DNSのSRVレコードでIPアドレスとPortが取り出せる

※ https://aws.amazon.com/blogs/compute/service-discovery-via-consul-with-amazon-ecs/

例: stock-priceとweatherはregistratorによってconsulにIPアドレスとportが登録されるので、portalはDNSのSRVレコードでdiscoveryできる

71

Amazon ECS: Docker Compose

• Docker Compose ≒ Task Definition– docker-compose.ymlとTask DefinitionのJSONを変換するツールを

作っている方もいます

• https://github.com/ambitioninc/container-transform

※参考:DockerCon 2015で、Amazon ECSとDocker Compose, DockerSwarmのインテグレーションの予定が発表されています。

https://twitter.com/docker/status/613033125900382209

72

まとめ

73

Amazon ECSでコンテナ管理を実現しよう

• Dockerコンテナ管理のためのリソースマネージャ

• マネージドで提供されるのが大きな特徴

• シンプルな仕組みなので、拡張性が高い

74

参考資料(英語)

• Amazon EC2 Container Service Developer Guidehttp://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html

• Amazon EC2 Container Service FAQhttp://aws.amazon.com/ecs/faqs/

• AWS CLI – ecshttp://docs.aws.amazon.com/cli/latest/reference/ecs/index.html

75

Q&A

次回Webinarのお申し込みhttp://aws.amazon.com/jp/event_schedule/

76

Webinar資料の配置場所

• AWS クラウドサービス活用資料集– http://aws.amazon.com/jp/aws-jp-introduction/

77

公式Twitter/FacebookAWSの最新情報をお届けします

@awscloud_jp

検索

最新技術情報、イベント情報、お役立ち情報、お得なキャンペーン情報などを日々更新しています!

もしくはhttp://on.fb.me/1vR8yWm

78

ご参加ありがとうございました。