The AWS::ECS::ClusterCapacityProviderAssociations
resource associates one
or more capacity providers and a default capacity provider strategy with a cluster.
Syntax
To declare this entity in your AWS CloudFormation template, use the following syntax:
JSON
{
"Type" : "AWS::ECS::ClusterCapacityProviderAssociations",
"Properties" : {
"CapacityProviders" : [ String, ... ]
,
"Cluster" : String
,
"DefaultCapacityProviderStrategy" : [ CapacityProviderStrategy, ... ]
}
}
YAML
Type: AWS::ECS::ClusterCapacityProviderAssociations
Properties:
CapacityProviders:
- String
Cluster: String
DefaultCapacityProviderStrategy:
- CapacityProviderStrategy
Properties
CapacityProviders
-
The capacity providers to associate with the cluster.
Required: Yes
Type: Array of String
Update requires: No interruption
Cluster
-
The cluster the capacity provider association is the target of.
Required: Yes
Type: String
Minimum:
1
Maximum:
2048
Update requires: Replacement
DefaultCapacityProviderStrategy
-
The default capacity provider strategy to associate with the cluster.
Required: Yes
Type: Array of CapacityProviderStrategy
Update requires: No interruption
Return values
Ref
When you pass the logical ID of this resource to the intrinsic Ref
function, Ref
returns the cluster name.
Examples
Creating a cluster capacity provider association using an Auto Scaling group capacity provider
The following example creates a cluster, two Auto Scaling group capacity providers, and the cluster capacity provider association that facilitates the association between them. The Auto Scaling groups the capacity providers use must already be created and the Amazon Resource Name (ARN) of each Auto Scaling group must be specified as parameters.
JSON
{
>>>>>>> mainline
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"AutoScalingGroupArn1": {
"Type": "String"
},
"AutoScalingGroupArn2": {
"Type": "String"
}
},
"Resources": {
"CapacityProvider1": {
"Type": "AWS::ECS::CapacityProvider",
"Properties": {
"AutoScalingGroupProvider": {
"AutoScalingGroupArn": {
"Ref": "AutoScalingGroupArn1"
},
"ManagedScaling": {
"Status": "ENABLED"
},
"ManagedTerminationProtection": "DISABLED"
}
}
},
"CapacityProvider2": {
"Type": "AWS::ECS::CapacityProvider",
"Properties": {
"AutoScalingGroupProvider": {
"AutoScalingGroupArn": {
"Ref": "AutoScalingGroupArn2"
},
"ManagedScaling": {
"Status": "ENABLED"
},
"ManagedTerminationProtection": "DISABLED"
}
}
},
"Cluster": {
"Type": "AWS::ECS::Cluster"
},
"ClusterCPAssociation": {
"Type": "AWS::ECS::ClusterCapacityProviderAssociations",
"Properties": {
"Cluster": {
"Ref": "Cluster"
},
"CapacityProviders": [
{
"Ref": "CapacityProvider1"
},
{
"Ref": "CapacityProvider2"
}
],
"DefaultCapacityProviderStrategy": [
{
"Base": 2,
"Weight": 6,
"CapacityProvider": {
"Ref": "CapacityProvider1"
}
},
{
"Base": 0,
"Weight": 10,
"CapacityProvider": {
"Ref": "CapacityProvider2"
}
}
]
}
}
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Parameters:
AutoScalingGroupArn1:
Type: String
AutoScalingGroupArn2:
Type: String
Resources:
CapacityProvider1:
Type: "AWS::ECS::CapacityProvider"
Properties:
AutoScalingGroupProvider:
AutoScalingGroupArn: !Ref AutoScalingGroupArn1
ManagedScaling:
Status: ENABLED
ManagedTerminationProtection: DISABLED
CapacityProvider2:
Type: "AWS::ECS::CapacityProvider"
Properties:
AutoScalingGroupProvider:
AutoScalingGroupArn: !Ref AutoScalingGroupArn2
ManagedScaling:
Status: ENABLED
ManagedTerminationProtection: DISABLED
Cluster:
Type: 'AWS::ECS::Cluster'
ClusterCPAssociation:
Type: "AWS::ECS::ClusterCapacityProviderAssociations"
Properties:
Cluster: !Ref Cluster
CapacityProviders:
- !Ref CapacityProvider1
- !Ref CapacityProvider2
DefaultCapacityProviderStrategy:
- Base: 2
Weight: 6
CapacityProvider: !Ref CapacityProvider1
- Base: 0
Weight: 10
CapacityProvider: !Ref CapacityProvider2
Creating a cluster capacity provider association using a Fargate capacity provider.
The following example associates the FARGATE
and
FARGATE_SPOT
capacity providers to an existing cluster. The cluster
name must be specified as a parameter.
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"ClusterName": {
"Type": "String"
}
},
"Resources": {
"ClusterCPAssociation": {
"Type": "AWS::ECS::ClusterCapacityProviderAssociations",
"Properties": {
"Cluster": {
"Ref": "ClusterName"
},
"CapacityProviders": [
"FARGATE",
"FARGATE_SPOT"
],
"DefaultCapacityProviderStrategy": [
{
"Base": 2,
"Weight": 1,
"CapacityProvider": "FARGATE"
},
{
"Base": 0,
"Weight": 1,
"CapacityProvider": "FARGATE_SPOT"
}
]
}
}
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Parameters:
ClusterName:
Type: String
Resources:
ClusterCPAssociation:
Type: "AWS::ECS::ClusterCapacityProviderAssociations"
Properties:
Cluster: !Ref ClusterName
CapacityProviders:
- "FARGATE"
- "FARGATE_SPOT"
DefaultCapacityProviderStrategy:
- Base: 2
Weight: 1
CapacityProvider: "FARGATE"
- Base: 0
Weight: 1
CapacityProvider: "FARGATE_SPOT"
Creating a cluster capacity provider association and Auto Scaling group capacity provider.
The following is an example of how you could use a Lambda function to create an Auto Scaling group, retrieve the Amazon Resource Name (ARN) of the Auto Scaling group, and then use the ARN to create an Auto Scaling group capacity provider, cluster, and the capacity provider association that facilitates the association between them.
JSON
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters": {
"LatestAmiId": {
"Type": "AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>",
"Default": "/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id"
}
},
"Resources": {
"AutoScalingReadAccessForLambdaRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Action": [
"sts:AssumeRole"
]
}
]
},
"Policies": [
{
"PolicyName": "LambdaReadAsgPolicy",
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "autoscaling:DescribeAutoScalingGroups",
"Resource": "*"
}
]
}
}
]
}
},
"AsgArnLambda": {
"Type": "AWS::Lambda::Function",
"Properties": {
"Runtime": "python2.7",
"Handler": "index.handler",
"Role": {
"Fn::GetAtt": [
"AutoScalingReadAccessForLambdaRole",
"Arn"
]
},
"Timeout": 50,
"Code": {
"ZipFile": "import cfnresponse\nimport json\nimport boto3\nclient = boto3.client('autoscaling')\ndef handler(event, context):\n response_data = {}\n try:\n autoScalingGroupName = event['ResourceProperties']['AsgName']\n asg_arn = client.describe_auto_scaling_groups(AutoScalingGroupNames=[autoScalingGroupName])['AutoScalingGroups'][0]['AutoScalingGroupARN']\n response_data['arn'] = asg_arn\n cfnresponse.send(event, context, cfnresponse.SUCCESS, response_data, 'AsgArnString')\n except Exception as e:\n response_data['exception'] = e\n cfnresponse.send(event, context, cfnresponse.FAILED, response_data, 'AsgArnString')\n"
}
}
},
"LaunchConfig": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Properties": {
"ImageId": {
"Ref": "LatestAmiId"
},
"InstanceType": "t3.micro",
"UserData": {
"Fn::Base64": {
"Fn::Sub": "#!/bin/bash -xe\necho ECS_CLUSTER=${Cluster} >> /etc/ecs/ecs.config\n"
}
}
}
},
"AutoScalingGroup": {
"Type": "AWS::AutoScaling::AutoScalingGroup",
"Properties": {
"AvailabilityZones": {
"Fn::GetAZs": {
"Ref": "AWS::Region"
}
},
"HealthCheckGracePeriod": 60,
"LaunchConfigurationName": {
"Ref": "LaunchConfig"
},
"MaxSize": "0",
"MinSize": "0"
}
},
"AsgArn": {
"Type": "AWS::CloudFormation::CustomResource",
"Properties": {
"ServiceToken": {
"Fn::GetAtt": [
"AsgArnLambda",
"Arn"
]
},
"AsgName": {
"Ref": "AutoScalingGroup"
}
}
},
"CapacityProvider": {
"Type": "AWS::ECS::CapacityProvider",
"Properties": {
"AutoScalingGroupProvider": {
"AutoScalingGroupArn": {
"Fn::GetAtt": [
"AsgArn",
"arn"
]
},
"ManagedScaling": {
"Status": "ENABLED"
},
"ManagedTerminationProtection": "DISABLED"
}
}
},
"Cluster": {
"Type": "AWS::ECS::Cluster"
},
"ClusterCPAssoc": {
"Type": "AWS::ECS::ClusterCapacityProviderAssociations",
"Properties": {
"Cluster": {
"Ref": "Cluster"
},
"CapacityProviders": [
{
"Ref": "CapacityProvider"
}
],
"DefaultCapacityProviderStrategy": [
{
"Base": 0,
"Weight": 1,
"CapacityProvider": {
"Ref": "CapacityProvider"
}
}
]
}
}
},
"Outputs": {
"ClusterArn": {
"Value": {
"Fn::GetAtt": [
"Cluster",
"Arn"
]
}
},
"ClusterName": {
"Value": {
"Ref": "Cluster"
}
},
"CapacityProviderName": {
"Value": {
"Ref": "CapacityProvider"
}
},
"AsgArn": {
"Value": {
"Fn::GetAtt": [
"AsgArn",
"arn"
]
}
}
}
}
YAML
AWSTemplateFormatVersion: 2010-09-09
Parameters:
LatestAmiId:
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ecs/optimized-ami/amazon-linux-2/recommended/image_id'
Resources:
# Custom resources to retrieve the Auto Scaling group ARN
AutoScalingReadAccessForLambdaRole:
Type: "AWS::IAM::Role"
Properties:
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- "lambda.amazonaws.com"
Action:
- "sts:AssumeRole"
Policies:
- PolicyName: LambdaReadAsgPolicy
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: "autoscaling:DescribeAutoScalingGroups"
Resource: "*"
AsgArnLambda:
Type: "AWS::Lambda::Function"
Properties:
Runtime: "python2.7"
Handler: "index.handler"
Role:
!GetAtt [ AutoScalingReadAccessForLambdaRole, Arn ]
Timeout: 50
Code:
ZipFile: |
import cfnresponse
import json
import boto3
client = boto3.client('autoscaling')
def handler(event, context):
response_data = {}
try:
autoScalingGroupName = event['ResourceProperties']['AsgName']
asg_arn = client.describe_auto_scaling_groups(AutoScalingGroupNames=[autoScalingGroupName])['AutoScalingGroups'][0]['AutoScalingGroupARN']
response_data['arn'] = asg_arn
cfnresponse.send(event, context, cfnresponse.SUCCESS, response_data, 'AsgArnString')
except Exception as e:
response_data['exception'] = e
cfnresponse.send(event, context, cfnresponse.FAILED, response_data, 'AsgArnString')
# Main resources
LaunchConfig:
Type: AWS::AutoScaling::LaunchConfiguration
Properties:
ImageId: !Ref LatestAmiId
InstanceType: "t3.micro"
UserData:
Fn::Base64: !Sub |
#!/bin/bash -xe
echo ECS_CLUSTER=${Cluster} >> /etc/ecs/ecs.config
AutoScalingGroup:
Type: "AWS::AutoScaling::AutoScalingGroup"
Properties:
AvailabilityZones:
Fn::GetAZs: !Ref "AWS::Region"
HealthCheckGracePeriod: 60
LaunchConfigurationName: !Ref LaunchConfig
MaxSize: "0"
MinSize: "0"
AsgArn:
Type: "AWS::CloudFormation::CustomResource"
Properties:
ServiceToken: !GetAtt [ AsgArnLambda, Arn ]
AsgName: !Ref AutoScalingGroup
CapacityProvider:
Type: "AWS::ECS::CapacityProvider"
Properties:
AutoScalingGroupProvider:
AutoScalingGroupArn: !GetAtt [ AsgArn, arn ]
ManagedScaling:
Status: ENABLED
ManagedTerminationProtection: DISABLED
Cluster:
Type: 'AWS::ECS::Cluster'
ClusterCPAssoc:
Type: "AWS::ECS::ClusterCapacityProviderAssociations"
Properties:
Cluster: !Ref Cluster
CapacityProviders:
- !Ref CapacityProvider
DefaultCapacityProviderStrategy:
- Base: 0
Weight: 1
CapacityProvider: !Ref CapacityProvider
Outputs:
ClusterArn:
Value: !GetAtt
- Cluster
- Arn
ClusterName:
Value: !Ref Cluster
CapacityProviderName:
Value: !Ref CapacityProvider
AsgArn:
Value: !GetAtt [ AsgArn, arn ]