AWS CloudFormation
ユーザーガイド (API バージョン 2010-05-15)

AWS::ECS::Service

AWS::ECS::Service リソースは、リクエストされた数のタスクと関連付けられたロードバランサーを実行および維持する Amazon Elastic Container Service (Amazon ECS) サービスを作成します。

構文

AWS CloudFormation テンプレートでこのエンティティを宣言するには、次の構文を使用します。

JSON

{ "Type" : "AWS::ECS::Service", "Properties" : { "Cluster" : String, "DeploymentConfiguration" : DeploymentConfiguration, "DesiredCount" : Integer, "EnableECSManagedTags" : Boolean, "HealthCheckGracePeriodSeconds" : Integer, "LaunchType" : String, "LoadBalancers" : [ LoadBalancer, ... ], "NetworkConfiguration" : NetworkConfiguration, "PlacementConstraints" : [ PlacementConstraint, ... ], "PlacementStrategies" : [ PlacementStrategy, ... ], "PlatformVersion" : String, "PropagateTags" : String, "Role" : String, "SchedulingStrategy" : String, "ServiceName" : String, "ServiceRegistries" : [ ServiceRegistry, ... ], "Tags" : [ Tag, ... ], "TaskDefinition" : String } }

プロパティ

Cluster

サービスを実行するクラスターの短い名前または完全な Amazon リソースネーム (ARN)。クラスターを指定しない場合は、デフォルトのクラスターが使用されます。

必須: いいえ

タイプ: 文字列

Update requires: Replacement

DeploymentConfiguration

デプロイ時に実行されるタスクの数と、タスクの停止および開始の順序を制御するオプションのデプロイパラメータ。

必須: いいえ

タイプ: DeploymentConfiguration

Update requires: No interruption

DesiredCount

指定したタスク定義のインスタンスをクラスターに配置して実行状態に保つ数。

必須: いいえ

タイプ: 整数

Update requires: No interruption

EnableECSManagedTags

サービスでタスクの Amazon ECS マネージドタグを有効にするかどうかを指定します。詳細については、Amazon Elastic Container Service 開発者ガイドの「Amazon ECS リソースにタグを付ける」を参照してください。

必須: いいえ

タイプ: ブール値

Update requires: Replacement

HealthCheckGracePeriodSeconds

Amazon ECS サービススケジューラが、タスクが最初に開始された後で異常な Elastic Load Balancing ターゲットのヘルスチェックを無視する期間 (秒単位)。これが有効であるのは、ロードバランサーを使用するようにサービスが設定されている場合のみです。サービスのタスクで、Elastic Load Balancing ヘルスチェックを開始して応答するまでに時間がかかる場合は、ヘルスチェックの猶予期間として最大 2,147,483,647 秒まで指定できます。この間は、ECS サービススケジューラはヘルスチェックのステータスを無視します。この猶予期間により、ECS サービススケジューラがタスクを異常とマークして時間より前に停止することがなくなります。

必須: いいえ

タイプ: 整数

Update requires: No interruption

LaunchType

サービスを実行する起動タイプ。詳細については、『Amazon Elastic Container Service 開発者ガイド』の「Amazon ECS の起動タイプ」を参照してください。

必須: いいえ

タイプ: 文字列

許可された値: EC2 | FARGATE

Update requires: Replacement

LoadBalancers

クラスターに関連付るロードバランサーオブジェクトのリスト。Role プロパティを指定した場合は、LoadBalancers も指定する必要があります。サービスあたりに指定できるロードバランサーの数については、Amazon Elastic Container Service 開発者ガイド の「サービスロードバランシング」を参照してください。

必須: いいえ

タイプ: LoadBalancer のリスト

Update requires: Replacement

NetworkConfiguration

サービスのネットワーク構成。このパラメータは awsvpc ネットワークモードを使用して独自の Elastic Network Interface を受け取るタスク定義の場合に必要です。その他のネットワークモードではサポートされていません。詳細については、Amazon Elastic Container Service 開発者ガイドの「タスクネットワーキング」を参照してください。

必須: いいえ

タイプ: NetworkConfiguration

Update requires: No interruption

PlacementConstraints

サービスのタスクに使用する、配置制約オブジェクトの配列。タスクごとに最大 10 個の制約を指定できます (この制限数には、タスク定義内の制約と、実行時に指定される制約が含まれます)。

必須: いいえ

タイプ: PlacementConstraint のリスト

Update requires: Replacement

PlacementStrategies

サービスのタスクで使用する配置戦略オブジェクト。サービスごとに最大 5 つの戦略ルールを指定できます。詳細については、『Amazon Elastic Container Service 開発者ガイド』のタスク配置戦略を参照してください。

必須: いいえ

タイプ: PlacementStrategy のリスト

Update requires: Replacement

PlatformVersion

サービス内のタスクが実行されているプラットフォームのバージョン。プラットフォームのバージョンは、Fargate 起動タイプを使用するタスクに対してのみ指定されています。指定されない場合、デフォルトで LATEST プラットフォームのバージョンが使用されます。詳細については、『Amazon Elastic Container Service 開発者ガイド』の「AWS Fargate プラットフォームのバージョン」を参照してください。

必須: いいえ

タイプ: 文字列

Update requires: Replacement

PropagateTags

タグをタスク定義またはサービスからサービスのタスクへ伝播するかどうかを指定します。値を指定しない場合、タグは伝播されません。タグは、サービス作成中のサービス内のタスクにのみ伝播することができます。タグをサービス作成後のタスクに追加するには、TagResource API アクションを使用します。

必須: いいえ

タイプ: 文字列

許可された値: SERVICE | TASK_DEFINITION

Update requires: Replacement

Role

Amazon ECS でロードバランサーの呼び出しを許可する IAM ロールの名前または完全な Amazon リソースネーム (ARN)。このパラメータは、サービスでロードバランサーを使用していて、タスク定義が awsvpc ネットワークモードを使用していない場合にのみ許可されます。role パラメータを指定する場合、loadBalancers パラメータでロードバランサーのオブジェクトも指定する必要があります。

重要

アカウントが既に Amazon ECS サービスリンクロールを作成している場合は、ここでロールを指定しない限り、そのロールがサービスにデフォルトで使用されます。タスク定義で awsvpc ネットワークモードを使用している場合はサービスリンクの役割が必要です。詳細については、Amazon Elastic Container Service 開発者ガイドの「Amazon ECS 用にサービスリンクされたロールの使用」を参照してください。

指定したロールに / 以外のパスがある場合は、完全なロール ARN を指定するか (推奨)、ロール名の前にパスを付ける必要があります。たとえば、ロールの名前が bar で、パスが /foo/ の場合、ロール名として /foo/bar を指定します。詳細については、『IAM ユーザーガイド』 の「わかりやすい名前とパス」を参照してください。

必須: いいえ

タイプ: 文字列

Update requires: Replacement

SchedulingStrategy

サービスに使用するスケジュール戦略。詳細については、「サービス」を参照してください。

利用できる 2 つのサービススケジューラ戦略があります。

  • REPLICA - レプリカスケジュール戦略では、クラスター全体で必要数のタスクを配置して維持します。デフォルトでは、サービススケジューラによってタスクはアベイラビリティーゾーン間で分散されます。タスク配置の戦略と制約を使用すると、タスク配置の決定をカスタマイズできます。このスケジューラ戦略は、サービスが CODE_DEPLOY または EXTERNAL デプロイメントコントローラータイプを使用している場合に必要です。

  • DAEMON - デーモンのスケジュール戦略では、指定したすべてのタスク配置制約を満たすクラスター内のアクティブなコンテナインスタンスごとに、1 つのタスクのみをデプロイします。この戦略を使用する場合、タスクの必要数や配置戦略、サービスの Auto Scaling ポリシーを指定する必要はありません。

    注記

    Fargate 起動タイプ、CODE_DEPLOY または EXTERNAL デプロイメントコントローラータイプを使用するタスクは、DAEMON スケジューリング戦略をサポートしません。

必須: いいえ

タイプ: 文字列

許可された値: DAEMON | REPLICA

Update requires: Replacement

ServiceName

サービスの名前。最大 255 文字の英字 (大文字と小文字)、数字、ハイフンを使用できます。サービス名は同じクラスター内で一意になるようにしてください。ただし、リージョン内の複数のクラスター間や複数のリージョンにまたがるクラスター間では、同様の名前のサービスがあっても構いません。

必須: いいえ

タイプ: 文字列

Update requires: Replacement

ServiceRegistries

このサービスに割り当てるサービス検出レジストリの詳細。詳細については、「サービス検出」を参照してください。

注記

プラットフォームバージョンが v1.1.0 以降を使用する場合、サービスの検出は Fargate タスクでサポートされます。詳細については、AWS Fargate プラットフォームのバージョンを参照してください。

必須: いいえ

タイプ: ServiceRegistry のリスト

Update requires: Replacement

Tags

サービスに適用し、サービスの分類と整理に役立つメタデータ。タグはそれぞれ、1 つのキーとオプションの 1 つの値で構成されており、どちらもお客様側が定義します。サービスが削除されると、タグも削除されます。

タグには以下のような基本制限があります。

  • リソースあたりのタグの最大数は 50 です

  • タグキーは、リソースごとにそれぞれ一意である必要があります。また、各タグキーに設定できる値は 1 つのみです。

  • キーの最大長 - 128 文字 (Unicode) (UTF-8)

  • 値の最大長 - 256 文字 (Unicode) (UTF-8)

  • 複数のサービス間およびリソース間でタグ付けスキーマを使用する場合、他のサービスでも許可される文字に制限が適用されることがあるのでご注意ください。一般的に使用が許可される文字は、UTF-8 で表現できる文字、数字、スペース、および +、-、=、.、_、:、/、@。

  • タグのキーと値は大文字と小文字が区別されます。

  • aws:AWS:、またはその大文字または小文字の組み合わせを、キーまたは値のプレフィックスとして使用しないでください。これらの文字列は AWS による使用のために予約されています。このプレフィックスが含まれるタグのキーや値を編集または削除することはできません。このプレフィックスを持つタグは、リソースあたりのタグ数の制限時には計算されません。

必須: いいえ

タイプ: Tag のリスト

最大: 50

Update requires: No interruption

TaskDefinition

familyrevision (family:revision)、またはサービスで実行されるタスク定義の完全な ARN。リソースが安定するには、revision が必要です。

サービスが ECS デプロイメントコントローラーを使用している場合は、タスク定義を指定する必要があります。

必須: はい

タイプ: 文字列

Update requires: No interruption

戻り値

参照番号

このリソースの論理 ID を組み込みの Ref 関数に渡すと、Ref が返ります。 Amazon リソースネーム (ARN)。

次のサンプルでは、Ref 関数は、arn:aws:ecs:us-west-2:123456789012:service/sample-webapp などの MyECSService サービスの ARN を返します。

{ "Ref": "MyECSService" }

For more information about using the Ref function, see Ref.

Fn::GetAtt

Fn::GetAtt 組み込み関数は、このタイプの指定された属性の値を返します。以下には、利用可能な属性とサンプル戻り値のリストが示されます。

Fn::GetAtt 組み込み関数の使用方法の詳細については、「Fn::GetAtt」を参照してください。

Name

Amazon ECS サービスの名前 (sample-webapp など)。

ベーシック Amazon ECS サービスを定義します。

次の例は、同じテンプレートの別の場所で宣言されたクラスターとタスク定義を使用する Amazon ECS サービスを定義します。

JSON

"WebApp": { "Type": "AWS::ECS::Service", "Properties" : { "Cluster": { "Ref": "cluster" }, "DesiredCount": { "Ref": "desiredcount" }, "TaskDefinition" : { "Ref": "taskdefinition" } } }

YAML

WebApp: Type: AWS::ECS::Service Properties: Cluster: Ref: "cluster" DesiredCount: Ref: "desiredcount" TaskDefinition: Ref: "taskdefinition"

Application Load Balancer とサービスの関連付け

次の例では、AWS::ElasticLoadBalancingV2::TargetGroup リソースを参照して Application Load Balancer と Amazon ECS サービスを関連付けます。

注記

Amazon ECS サービスには、Application Load Balancer リスナールールと Application Load Balancer リスナーへの明示的な依存関係が必要です。これにより、リスナーの準備が整う前にサービスが開始されなくなります。

JSON

"service" : { "Type" : "AWS::ECS::Service", "DependsOn": ["Listener"], "Properties" : { "Role" : { "Ref" : "ECSServiceRole" }, "TaskDefinition" : { "Ref" : "taskdefinition" }, "DesiredCount" : "1", "LoadBalancers" : [{ "TargetGroupArn" : { "Ref" : "TargetGroup" }, "ContainerPort" : "80", "ContainerName" : "sample-app" }], "Cluster" : { "Ref" : "ECSCluster" } } }

YAML

service: Type: AWS::ECS::Service DependsOn: - Listener Properties: Role: Ref: ECSServiceRole TaskDefinition: Ref: taskdefinition DesiredCount: 1 LoadBalancers: - TargetGroupArn: Ref: TargetGroup ContainerPort: 80 ContainerName: sample-app Cluster: Ref: ECSCluster

ヘルスチェックの猶予期間を使用したサービスの定義

次の例では、タスクを最初に開始した後で、Amazon ECS サービススケジューラが異常な Elastic Load Balancing ターゲットのヘルスチェックを無視する秒数をユーザーが指定できるようにするパラメータでサービスを定義します。

JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Description" : "Creating ECS service", "Parameters": { "AppName": { "Type":"String", "Description": "Name of app requiring ELB exposure", "Default": "simple-app" }, "AppContainerPort": { "Type":"Number", "Description": "Container port of app requiring ELB exposure", "Default": "80" }, "AppHostPort": { "Type":"Number", "Description": "Host port of app requiring ELB exposure", "Default": "80" }, "ServiceName": { "Type": "String" }, "LoadBalancerName": { "Type": "String" }, "HealthCheckGracePeriodSeconds": { "Type": "String" } }, "Resources": { "cluster": { "Type": "AWS::ECS::Cluster" }, "taskdefinition": { "Type": "AWS::ECS::TaskDefinition", "Properties" : { "ContainerDefinitions" : [ { "Name": {"Ref": "AppName"}, "MountPoints": [ { "SourceVolume": "my-vol", "ContainerPath": "/var/www/my-vol" } ], "Image":"amazon/amazon-ecs-sample", "Cpu": "10", "PortMappings":[ { "ContainerPort": {"Ref":"AppContainerPort"}, "HostPort": {"Ref":"AppHostPort"} } ], "EntryPoint": [ "/usr/sbin/apache2", "-D", "FOREGROUND" ], "Memory":"500", "Essential": "true" }, { "Name": "busybox", "Image": "busybox", "Cpu": "10", "EntryPoint": [ "sh", "-c" ], "Memory": "500", "Command": [ "/bin/sh -c \"while true; do /bin/date > /var/www/my-vol/date; sleep 1; done\"" ], "Essential" : "false", "VolumesFrom": [ { "SourceContainer": {"Ref":"AppName"} } ] } ], "Volumes": [ { "Host": { "SourcePath": "/var/lib/docker/vfs/dir/" }, "Name": "my-vol" } ] } }, "service": { "Type": "AWS::ECS::Service", "Properties" : { "Cluster": {"Ref": "cluster"}, "DeploymentConfiguration": { "MaximumPercent": 200, "MinimumHealthyPercent": 100 }, "DesiredCount": 0, "HealthCheckGracePeriodSeconds": {"Ref": "HealthCheckGracePeriodSeconds"}, "LoadBalancers": [{ "ContainerName": {"Ref" : "AppName"}, "ContainerPort": {"Ref":"AppContainerPort"}, "LoadBalancerName": {"Ref": "elb"} }], "PlacementStrategies": [{ "Type" : "binpack", "Field": "memory" }, { "Type": "spread", "Field": "host" }], "PlacementConstraints": [{ "Type": "memberOf", "Expression": "attribute:ecs.availability-zone != us-east-1d" }, { "Type": "distinctInstance" }], "TaskDefinition" : {"Ref":"taskdefinition"}, "ServiceName": {"Ref": "ServiceName"}, "Role": {"Ref": "Role"} } }, "elb": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "LoadBalancerName": {"Ref": "LoadBalancerName"}, "Listeners": [{ "InstancePort": {"Ref": "AppHostPort"}, "LoadBalancerPort": "80", "Protocol": "HTTP" }], "Subnets": [{"Ref":"Subnet1"}] }, "DependsOn": "GatewayAttachment" }, "VPC": { "Type": "AWS::EC2::VPC", "Properties": { "CidrBlock": "10.0.0.0/24" } }, "Subnet1": { "Type": "AWS::EC2::Subnet", "Properties": { "VpcId": { "Ref": "VPC" }, "CidrBlock": "10.0.0.0/25" } }, "InternetGateway": { "Type": "AWS::EC2::InternetGateway" }, "GatewayAttachment": { "Type": "AWS::EC2::VPCGatewayAttachment", "Properties": { "InternetGatewayId": {"Ref": "InternetGateway"}, "VpcId": {"Ref": "VPC"} } }, "Role": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }, "ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole"] } } }, "Outputs" : { "Cluster": { "Value": {"Ref" : "cluster"} } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Description: Creating ECS service Parameters: AppName: Type: String Description: Name of app requiring ELB exposure Default: simple-app AppContainerPort: Type: Number Description: Container port of app requiring ELB exposure Default: '80' AppHostPort: Type: Number Description: Host port of app requiring ELB exposure Default: '80' ServiceName: Type: String LoadBalancerName: Type: String HealthCheckGracePeriodSeconds: Type: String Resources: cluster: Type: AWS::ECS::Cluster taskdefinition: Type: AWS::ECS::TaskDefinition Properties: ContainerDefinitions: - Name: !Ref AppName MountPoints: - SourceVolume: my-vol ContainerPath: /var/www/my-vol Image: amazon/amazon-ecs-sample Cpu: '10' PortMappings: - ContainerPort: !Ref AppContainerPort HostPort: !Ref AppHostPort EntryPoint: - /usr/sbin/apache2 - '-D' - FOREGROUND Memory: '500' Essential: 'true' - Name: busybox Image: busybox Cpu: '10' EntryPoint: - sh - '-c' Memory: '500' Command: - >- /bin/sh -c "while true; do /bin/date > /var/www/my-vol/date; sleep 1; done" Essential: 'false' VolumesFrom: - SourceContainer: !Ref AppName Volumes: - Host: SourcePath: /var/lib/docker/vfs/dir/ Name: my-vol service: Type: AWS::ECS::Service Properties: Cluster: !Ref cluster DeploymentConfiguration: MaximumPercent: 200 MinimumHealthyPercent: 100 DesiredCount: 0 HealthCheckGracePeriodSeconds: !Ref HealthCheckGracePeriodSeconds LoadBalancers: - ContainerName: !Ref AppName ContainerPort: !Ref AppContainerPort LoadBalancerName: !Ref elb PlacementStrategies: - Type: binpack Field: memory - Type: spread Field: host PlacementConstraints: - Type: memberOf Expression: 'attribute:ecs.availability-zone != us-east-1d' - Type: distinctInstance TaskDefinition: !Ref taskdefinition ServiceName: !Ref ServiceName Role: !Ref Role elb: Type: AWS::ElasticLoadBalancing::LoadBalancer Properties: LoadBalancerName: !Ref LoadBalancerName Listeners: - InstancePort: !Ref AppHostPort LoadBalancerPort: '80' Protocol: HTTP Subnets: - !Ref Subnet1 DependsOn: GatewayAttachment VPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/24 Subnet1: Type: AWS::EC2::Subnet Properties: VpcId: !Ref VPC CidrBlock: 10.0.0.0/25 InternetGateway: Type: AWS::EC2::InternetGateway GatewayAttachment: Type: AWS::EC2::VPCGatewayAttachment Properties: InternetGatewayId: !Ref InternetGateway VpcId: !Ref VPC Role: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: 2008-10-17 Statement: - Sid: '' Effect: Allow Principal: Service: ecs.amazonaws.com Action: 'sts:AssumeRole' ManagedPolicyArns: - 'arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole' Outputs: Cluster: Value: !Ref cluster

このページの内容: