From b094343fe764a2eb46464071fbc50a3e378075d7 Mon Sep 17 00:00:00 2001 From: David Christiansen Date: Thu, 6 Jun 2019 00:49:27 +0100 Subject: [PATCH 1/2] davidchristiansen/LoadBalancedFargateService-ContainerNameAndRoleOverridesImplemenation of execution tests, task role andcontainer name overrides + tests --- .../fargate/load-balanced-fargate-service.ts | 70 +- .../fargate/integ.executionrole.expected.json | 704 ++++++++++++++++++ .../test/fargate/integ.executionrole.ts | 27 + .../test.load-balanced-fargate-service.ts | 138 +++- 4 files changed, 933 insertions(+), 6 deletions(-) create mode 100644 packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json create mode 100644 packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts diff --git a/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts b/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts index d81780d27d63c..6c10de20a739e 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts @@ -1,4 +1,5 @@ import ecs = require('@aws-cdk/aws-ecs'); +import iam = require('@aws-cdk/aws-iam'); import cdk = require('@aws-cdk/cdk'); import { LoadBalancedServiceBase, LoadBalancedServiceBaseProps } from '../base/load-balanced-service-base'; @@ -41,7 +42,63 @@ export interface LoadBalancedFargateServiceProps extends LoadBalancedServiceBase * * @default 512 */ - readonly memoryLimitMiB?: number; + readonly memoryMiB?: string; + + /** + * Determines whether your Fargate Service will be assigned a public IP address. + * + * @default false + */ + readonly publicTasks?: boolean; + + /** + * Domain name for the service, e.g. api.example.com + * + * @default - No domain name. + */ + readonly domainName?: string; + + /** + * Route53 hosted zone for the domain, e.g. "example.com." + * + * @default - No Route53 hosted domain zone. + */ + readonly domainZone?: IHostedZone; + + /** + * Whether to create an AWS log driver + * + * @default true + */ + readonly createLogs?: boolean; + + /** + * Override for the Fargate Task Definition execution role + * + * @default - No value + */ + readonly executionRole?: iam.IRole; + + /** + * Override for the Fargate Task Definition task role + * + * @default - No value + */ + readonly taskRole?: iam.IRole; + + /** + * Override value for the container name + * + * @default - No value + */ + readonly containerName?: string; + + /** + * Override value for the service name + * + * @default - No value + */ + readonly serviceName?: string; } /** @@ -59,10 +116,14 @@ export class LoadBalancedFargateService extends LoadBalancedServiceBase { const taskDefinition = new ecs.FargateTaskDefinition(this, 'TaskDef', { memoryLimitMiB: props.memoryLimitMiB, - cpu: props.cpu + cpu: props.cpu, + executionRole: props.executionRole !== undefined ? props.executionRole : undefined, + taskRole: props.taskRole !== undefined ? props.taskRole : undefined }); - const container = taskDefinition.addContainer('web', { + const containerName = props.containerName !== undefined ? props.containerName : 'web'; + + const container = taskDefinition.addContainer(containerName, { image: props.image, logging: this.logDriver, environment: props.environment @@ -77,7 +138,8 @@ export class LoadBalancedFargateService extends LoadBalancedServiceBase { cluster: props.cluster, desiredCount: props.desiredCount || 1, taskDefinition, - assignPublicIp + assignPublicIp, + serviceName: props.serviceName || undefined }); this.service = service; diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json new file mode 100644 index 0000000000000..6a97a37817db5 --- /dev/null +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json @@ -0,0 +1,704 @@ +{ + "Resources": { + "Vpc8378EB38": { + "Type": "AWS::EC2::VPC", + "Properties": { + "CidrBlock": "10.0.0.0/16", + "EnableDnsHostnames": true, + "EnableDnsSupport": true, + "InstanceTenancy": "default", + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc" + } + ] + } + }, + "VpcPublicSubnet1Subnet5C2D37C4": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "CidrBlock": "10.0.0.0/18", + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1a", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PublicSubnet1" + }, + { + "Key": "aws-cdk:subnet-name", + "Value": "Public" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public" + } + ] + } + }, + "VpcPublicSubnet1RouteTable6C95E38E": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PublicSubnet1" + } + ] + } + }, + "VpcPublicSubnet1RouteTableAssociation97140677": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" + }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + } + } + }, + "VpcPublicSubnet1DefaultRoute3DA9E72A": { + "Type": "AWS::EC2::Route", + "Properties": { + "RouteTableId": { + "Ref": "VpcPublicSubnet1RouteTable6C95E38E" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "VpcIGWD7BA715C" + } + }, + "DependsOn": [ + "VpcVPCGWBF912B6E" + ] + }, + "VpcPublicSubnet1EIPD7E02669": { + "Type": "AWS::EC2::EIP", + "Properties": { + "Domain": "vpc" + } + }, + "VpcPublicSubnet1NATGateway4D7517AA": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "VpcPublicSubnet1EIPD7E02669", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PublicSubnet1" + } + ] + } + }, + "VpcPublicSubnet2Subnet691E08A3": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "CidrBlock": "10.0.64.0/18", + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1b", + "MapPublicIpOnLaunch": true, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PublicSubnet2" + }, + { + "Key": "aws-cdk:subnet-name", + "Value": "Public" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Public" + } + ] + } + }, + "VpcPublicSubnet2RouteTable94F7E489": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PublicSubnet2" + } + ] + } + }, + "VpcPublicSubnet2RouteTableAssociationDD5762D8": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" + }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + } + } + }, + "VpcPublicSubnet2DefaultRoute97F91067": { + "Type": "AWS::EC2::Route", + "Properties": { + "RouteTableId": { + "Ref": "VpcPublicSubnet2RouteTable94F7E489" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "GatewayId": { + "Ref": "VpcIGWD7BA715C" + } + }, + "DependsOn": [ + "VpcVPCGWBF912B6E" + ] + }, + "VpcPublicSubnet2EIP3C605A87": { + "Type": "AWS::EC2::EIP", + "Properties": { + "Domain": "vpc" + } + }, + "VpcPublicSubnet2NATGateway9182C01D": { + "Type": "AWS::EC2::NatGateway", + "Properties": { + "AllocationId": { + "Fn::GetAtt": [ + "VpcPublicSubnet2EIP3C605A87", + "AllocationId" + ] + }, + "SubnetId": { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PublicSubnet2" + } + ] + } + }, + "VpcPrivateSubnet1Subnet536B997A": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "CidrBlock": "10.0.128.0/18", + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1a", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PrivateSubnet1" + }, + { + "Key": "aws-cdk:subnet-name", + "Value": "Private" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private" + } + ] + } + }, + "VpcPrivateSubnet1RouteTableB2C5B500": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PrivateSubnet1" + } + ] + } + }, + "VpcPrivateSubnet1RouteTableAssociation70C59FA6": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" + }, + "SubnetId": { + "Ref": "VpcPrivateSubnet1Subnet536B997A" + } + } + }, + "VpcPrivateSubnet1DefaultRouteBE02A9ED": { + "Type": "AWS::EC2::Route", + "Properties": { + "RouteTableId": { + "Ref": "VpcPrivateSubnet1RouteTableB2C5B500" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "VpcPublicSubnet1NATGateway4D7517AA" + } + } + }, + "VpcPrivateSubnet2Subnet3788AAA1": { + "Type": "AWS::EC2::Subnet", + "Properties": { + "CidrBlock": "10.0.192.0/18", + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "AvailabilityZone": "test-region-1b", + "MapPublicIpOnLaunch": false, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PrivateSubnet2" + }, + { + "Key": "aws-cdk:subnet-name", + "Value": "Private" + }, + { + "Key": "aws-cdk:subnet-type", + "Value": "Private" + } + ] + } + }, + "VpcPrivateSubnet2RouteTableA678073B": { + "Type": "AWS::EC2::RouteTable", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc/PrivateSubnet2" + } + ] + } + }, + "VpcPrivateSubnet2RouteTableAssociationA89CAD56": { + "Type": "AWS::EC2::SubnetRouteTableAssociation", + "Properties": { + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" + }, + "SubnetId": { + "Ref": "VpcPrivateSubnet2Subnet3788AAA1" + } + } + }, + "VpcPrivateSubnet2DefaultRoute060D2087": { + "Type": "AWS::EC2::Route", + "Properties": { + "RouteTableId": { + "Ref": "VpcPrivateSubnet2RouteTableA678073B" + }, + "DestinationCidrBlock": "0.0.0.0/0", + "NatGatewayId": { + "Ref": "VpcPublicSubnet2NATGateway9182C01D" + } + } + }, + "VpcIGWD7BA715C": { + "Type": "AWS::EC2::InternetGateway", + "Properties": { + "Tags": [ + { + "Key": "Name", + "Value": "aws-ecs-integ/Vpc" + } + ] + } + }, + "VpcVPCGWBF912B6E": { + "Type": "AWS::EC2::VPCGatewayAttachment", + "Properties": { + "VpcId": { + "Ref": "Vpc8378EB38" + }, + "InternetGatewayId": { + "Ref": "VpcIGWD7BA715C" + } + } + }, + "FargateCluster7CCD5F93": { + "Type": "AWS::ECS::Cluster" + }, + "ExecutionRole605A040B": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": [ + { + "Fn::Join": [ + "", + [ + "ecs.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + }, + { + "Fn::Join": [ + "", + [ + "ecs-tasks.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + } + ] + } + } + ], + "Version": "2012-10-17" + } + } + }, + "ExecutionRoleDefaultPolicyA5B92313": { + "Type": "AWS::IAM::Policy", + "Properties": { + "PolicyDocument": { + "Statement": [ + { + "Action": [ + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Effect": "Allow", + "Resource": { + "Fn::GetAtt": [ + "L3LoggingLogGroupBD1F02DD", + "Arn" + ] + } + } + ], + "Version": "2012-10-17" + }, + "PolicyName": "ExecutionRoleDefaultPolicyA5B92313", + "Roles": [ + { + "Ref": "ExecutionRole605A040B" + } + ] + } + }, + "L3LB212FC0E0": { + "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer", + "Properties": { + "LoadBalancerAttributes": [], + "Scheme": "internet-facing", + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "L3LBSecurityGroupEDE61198", + "GroupId" + ] + } + ], + "Subnets": [ + { + "Ref": "VpcPublicSubnet1Subnet5C2D37C4" + }, + { + "Ref": "VpcPublicSubnet2Subnet691E08A3" + } + ], + "Type": "application" + }, + "DependsOn": [ + "VpcPublicSubnet1DefaultRoute3DA9E72A", + "VpcPublicSubnet2DefaultRoute97F91067" + ] + }, + "L3LBSecurityGroupEDE61198": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "Automatically created Security Group for ELB awsecsintegL3LB6453BA0A", + "SecurityGroupEgress": [], + "SecurityGroupIngress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow from anyone on port 80", + "FromPort": 80, + "IpProtocol": "tcp", + "ToPort": 80 + } + ], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "L3LBSecurityGrouptoawsecsintegL3ServiceSecurityGroup7B96C87F8094933E0A": { + "Type": "AWS::EC2::SecurityGroupEgress", + "Properties": { + "GroupId": { + "Fn::GetAtt": [ + "L3LBSecurityGroupEDE61198", + "GroupId" + ] + }, + "IpProtocol": "tcp", + "Description": "Load balancer to target", + "DestinationSecurityGroupId": { + "Fn::GetAtt": [ + "L3ServiceSecurityGroup677B0897", + "GroupId" + ] + }, + "FromPort": 80, + "ToPort": 80 + } + }, + "L3LBPublicListener156FFC0F": { + "Type": "AWS::ElasticLoadBalancingV2::Listener", + "Properties": { + "DefaultActions": [ + { + "TargetGroupArn": { + "Ref": "L3LBPublicListenerECSGroup648EEA11" + }, + "Type": "forward" + } + ], + "LoadBalancerArn": { + "Ref": "L3LB212FC0E0" + }, + "Port": 80, + "Protocol": "HTTP", + "Certificates": [] + } + }, + "L3LBPublicListenerECSGroup648EEA11": { + "Type": "AWS::ElasticLoadBalancingV2::TargetGroup", + "Properties": { + "Port": 80, + "Protocol": "HTTP", + "TargetGroupAttributes": [], + "Targets": [], + "TargetType": "ip", + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "L3TaskDefTaskRole21C75D10": { + "Type": "AWS::IAM::Role", + "Properties": { + "AssumeRolePolicyDocument": { + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": { + "Fn::Join": [ + "", + [ + "ecs-tasks.", + { + "Ref": "AWS::URLSuffix" + } + ] + ] + } + } + } + ], + "Version": "2012-10-17" + } + } + }, + "L3TaskDef48D8ACB8": { + "Type": "AWS::ECS::TaskDefinition", + "Properties": { + "ContainerDefinitions": [ + { + "Essential": true, + "Image": "amazon/amazon-ecs-sample", + "Links": [], + "LogConfiguration": { + "LogDriver": "awslogs", + "Options": { + "awslogs-group": { + "Ref": "L3LoggingLogGroupBD1F02DD" + }, + "awslogs-stream-prefix": "L3", + "awslogs-region": { + "Ref": "AWS::Region" + } + } + }, + "MountPoints": [], + "Name": "web", + "PortMappings": [ + { + "ContainerPort": 80, + "Protocol": "tcp" + } + ], + "Ulimits": [], + "VolumesFrom": [] + } + ], + "Cpu": "512", + "ExecutionRoleArn": { + "Fn::GetAtt": [ + "ExecutionRole605A040B", + "Arn" + ] + }, + "Family": "awsecsintegL3TaskDefAA25240E", + "Memory": "1GB", + "NetworkMode": "awsvpc", + "RequiresCompatibilities": [ + "FARGATE" + ], + "TaskRoleArn": { + "Fn::GetAtt": [ + "L3TaskDefTaskRole21C75D10", + "Arn" + ] + }, + "Volumes": [] + } + }, + "L3LoggingLogGroupBD1F02DD": { + "Type": "AWS::Logs::LogGroup", + "DeletionPolicy": "Retain" + }, + "L3Service616D5A93": { + "Type": "AWS::ECS::Service", + "Properties": { + "TaskDefinition": { + "Ref": "L3TaskDef48D8ACB8" + }, + "Cluster": { + "Ref": "FargateCluster7CCD5F93" + }, + "DeploymentConfiguration": { + "MaximumPercent": 200, + "MinimumHealthyPercent": 50 + }, + "DesiredCount": 1, + "LaunchType": "FARGATE", + "LoadBalancers": [ + { + "ContainerName": "web", + "ContainerPort": 80, + "TargetGroupArn": { + "Ref": "L3LBPublicListenerECSGroup648EEA11" + } + } + ], + "NetworkConfiguration": { + "AwsvpcConfiguration": { + "AssignPublicIp": "DISABLED", + "SecurityGroups": [ + { + "Fn::GetAtt": [ + "L3ServiceSecurityGroup677B0897", + "GroupId" + ] + } + ], + "Subnets": [ + { + "Ref": "VpcPrivateSubnet1Subnet536B997A" + }, + { + "Ref": "VpcPrivateSubnet2Subnet3788AAA1" + } + ] + } + }, + "ServiceRegistries": [] + }, + "DependsOn": [ + "L3LBPublicListenerECSGroup648EEA11", + "L3LBPublicListener156FFC0F" + ] + }, + "L3ServiceSecurityGroup677B0897": { + "Type": "AWS::EC2::SecurityGroup", + "Properties": { + "GroupDescription": "aws-ecs-integ/L3/Service/SecurityGroup", + "SecurityGroupEgress": [ + { + "CidrIp": "0.0.0.0/0", + "Description": "Allow all outbound traffic by default", + "IpProtocol": "-1" + } + ], + "SecurityGroupIngress": [], + "VpcId": { + "Ref": "Vpc8378EB38" + } + } + }, + "L3ServiceSecurityGroupfromawsecsintegL3LBSecurityGroupA70DA46C80DBDFBCD6": { + "Type": "AWS::EC2::SecurityGroupIngress", + "Properties": { + "IpProtocol": "tcp", + "Description": "Load balancer to target", + "FromPort": 80, + "GroupId": { + "Fn::GetAtt": [ + "L3ServiceSecurityGroup677B0897", + "GroupId" + ] + }, + "SourceSecurityGroupId": { + "Fn::GetAtt": [ + "L3LBSecurityGroupEDE61198", + "GroupId" + ] + }, + "ToPort": 80 + } + } + }, + "Outputs": { + "L3LoadBalancerDNSC6CB4A70": { + "Value": { + "Fn::GetAtt": [ + "L3LB212FC0E0", + "DNSName" + ] + } + } + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts new file mode 100644 index 0000000000000..85b790ed5e493 --- /dev/null +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts @@ -0,0 +1,27 @@ +import ec2 = require('@aws-cdk/aws-ec2'); +import ecs = require('@aws-cdk/aws-ecs'); +import iam = require('@aws-cdk/aws-iam'); +import cdk = require('@aws-cdk/cdk'); +import ecsPatterns = require('../../lib'); + +const app = new cdk.App(); +const stack = new cdk.Stack(app, 'aws-ecs-integ'); + +const vpc = new ec2.Vpc(stack, 'Vpc', { maxAZs: 2 }); + +const cluster = new ecs.Cluster(stack, 'FargateCluster', { vpc }); + +new ecsPatterns.LoadBalancedFargateService(stack, 'L3', { + cluster, + memoryMiB: '1GB', + cpu: '512', + image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"), + executionRole: new iam.Role(stack, 'ExecutionRole', { + assumedBy: new iam.CompositePrincipal( + new iam.ServicePrincipal("ecs.amazonaws.com"), + new iam.ServicePrincipal("ecs-tasks.amazonaws.com") + ) + }) +}); + +app.run(); diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts index 59062c8105564..d3cc4fa1de038 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts @@ -1,7 +1,8 @@ -import { expect, haveResourceLike } from '@aws-cdk/assert'; +import { expect, haveResourceLike, SynthUtils } from '@aws-cdk/assert'; import { Certificate } from '@aws-cdk/aws-certificatemanager'; import ec2 = require('@aws-cdk/aws-ec2'); import ecs = require('@aws-cdk/aws-ecs'); +import iam = require('@aws-cdk/aws-iam'); import cdk = require('@aws-cdk/cdk'); import { Test } from 'nodeunit'; import ecsPatterns = require('../../lib'); @@ -48,5 +49,138 @@ export = { })); test.done(); - } + }, + + 'setting executionRole updated taskDefinition with given execution role'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + const executionRole = new iam.Role(stack, 'ExecutionRole', { + path: '/', + assumedBy: new iam.CompositePrincipal( + new iam.ServicePrincipal("ecs.amazonaws.com"), + new iam.ServicePrincipal("ecs-tasks.amazonaws.com") + ) + }); + + // WHEN + new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + cluster, + loadBalancerType: ecsPatterns.LoadBalancerType.Network, + image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + executionRole + }); + + // THEN + const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; + test.deepEqual(serviceTaskDefinition.Properties.ExecutionRoleArn, { 'Fn::GetAtt': [ 'ExecutionRole605A040B', 'Arn' ] }); + test.done(); + }, + + 'setting taskRole updated taskDefinition with given task role'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + const taskRole = new iam.Role(stack, 'taskRoleTest', { + path: '/', + assumedBy: new iam.CompositePrincipal( + new iam.ServicePrincipal("ecs.amazonaws.com"), + new iam.ServicePrincipal("ecs-tasks.amazonaws.com") + ) + }); + + // WHEN + new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + cluster, + loadBalancerType: ecsPatterns.LoadBalancerType.Network, + image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + taskRole + }); + + // THEN + const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; + test.deepEqual(serviceTaskDefinition.Properties.TaskRoleArn, { 'Fn::GetAtt': [ 'taskRoleTest9DA66B6E', 'Arn' ] }); + test.done(); + }, + + 'setting containerName updates container name with given name'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + + // WHEN + new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + cluster, + loadBalancerType: ecsPatterns.LoadBalancerType.Network, + image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + containerName: 'bob' + }); + + // THEN + const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; + test.deepEqual(serviceTaskDefinition.Properties.ContainerDefinitions[0].Name, 'bob'); + test.done(); + }, + + 'not setting containerName updates container name with default'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + + // WHEN + new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + cluster, + loadBalancerType: ecsPatterns.LoadBalancerType.Network, + image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + }); + + // THEN + const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; + test.deepEqual(serviceTaskDefinition.Properties.ContainerDefinitions[0].Name, 'web'); + test.done(); + }, + + // 'setting servicename updates service name with given name'(test: Test) { + // // GIVEN + // const stack = new cdk.Stack(); + // const vpc = new ec2.Vpc(stack, 'VPC'); + // const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + + // // WHEN + // new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + // cluster, + // loadBalancerType: ecsPatterns.LoadBalancerType.Network, + // image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + // serviceName: 'bob' + // }); + + // // THEN + // const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; + // console.log(serviceTaskDefinition); + // test.deepEqual(serviceTaskDefinition.Properties.ContainerDefinitions[0].Name, 'bob'); + // test.done(); + // }, + + // 'not setting servicename updates service name with default'(test: Test) { + // // GIVEN + // const stack = new cdk.Stack(); + // const vpc = new ec2.Vpc(stack, 'VPC'); + // const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + + // // WHEN + // new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + // cluster, + // loadBalancerType: ecsPatterns.LoadBalancerType.Network, + // image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + // }); + + // // THEN + // const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; + // test.deepEqual(serviceTaskDefinition.Properties.ContainerDefinitions[0].Name, 'web'); + // test.done(); + // } }; \ No newline at end of file From b19c1c201c7f3d51bc96f5d674a265baeef150d3 Mon Sep 17 00:00:00 2001 From: David Christiansen Date: Thu, 13 Jun 2019 01:48:01 +0100 Subject: [PATCH 2/2] FIxed tests --- .../fargate/load-balanced-fargate-service.ts | 31 +------- .../fargate/integ.executionrole.expected.json | 2 +- .../test/fargate/integ.executionrole.ts | 4 +- .../test.load-balanced-fargate-service.ts | 76 +++++++++---------- 4 files changed, 41 insertions(+), 72 deletions(-) diff --git a/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts b/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts index 6c10de20a739e..9343f00fcb237 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/lib/fargate/load-balanced-fargate-service.ts @@ -42,35 +42,7 @@ export interface LoadBalancedFargateServiceProps extends LoadBalancedServiceBase * * @default 512 */ - readonly memoryMiB?: string; - - /** - * Determines whether your Fargate Service will be assigned a public IP address. - * - * @default false - */ - readonly publicTasks?: boolean; - - /** - * Domain name for the service, e.g. api.example.com - * - * @default - No domain name. - */ - readonly domainName?: string; - - /** - * Route53 hosted zone for the domain, e.g. "example.com." - * - * @default - No Route53 hosted domain zone. - */ - readonly domainZone?: IHostedZone; - - /** - * Whether to create an AWS log driver - * - * @default true - */ - readonly createLogs?: boolean; + readonly memoryLimitMiB?: number; /** * Override for the Fargate Task Definition execution role @@ -132,7 +104,6 @@ export class LoadBalancedFargateService extends LoadBalancedServiceBase { container.addPortMappings({ containerPort: props.containerPort || 80, }); - const assignPublicIp = props.publicTasks !== undefined ? props.publicTasks : false; const service = new ecs.FargateService(this, "Service", { cluster: props.cluster, diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json index 6a97a37817db5..3169c50366974 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.expected.json @@ -582,7 +582,7 @@ ] }, "Family": "awsecsintegL3TaskDefAA25240E", - "Memory": "1GB", + "Memory": "1024", "NetworkMode": "awsvpc", "RequiresCompatibilities": [ "FARGATE" diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts index 85b790ed5e493..89627269e9576 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/integ.executionrole.ts @@ -13,8 +13,8 @@ const cluster = new ecs.Cluster(stack, 'FargateCluster', { vpc }); new ecsPatterns.LoadBalancedFargateService(stack, 'L3', { cluster, - memoryMiB: '1GB', - cpu: '512', + memoryLimitMiB: 1024, + cpu: 512, image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"), executionRole: new iam.Role(stack, 'ExecutionRole', { assumedBy: new iam.CompositePrincipal( diff --git a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts index d3cc4fa1de038..327103c71b0e5 100644 --- a/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts +++ b/packages/@aws-cdk/aws-ecs-patterns/test/fargate/test.load-balanced-fargate-service.ts @@ -144,43 +144,41 @@ export = { test.done(); }, - // 'setting servicename updates service name with given name'(test: Test) { - // // GIVEN - // const stack = new cdk.Stack(); - // const vpc = new ec2.Vpc(stack, 'VPC'); - // const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); - - // // WHEN - // new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { - // cluster, - // loadBalancerType: ecsPatterns.LoadBalancerType.Network, - // image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), - // serviceName: 'bob' - // }); - - // // THEN - // const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; - // console.log(serviceTaskDefinition); - // test.deepEqual(serviceTaskDefinition.Properties.ContainerDefinitions[0].Name, 'bob'); - // test.done(); - // }, - - // 'not setting servicename updates service name with default'(test: Test) { - // // GIVEN - // const stack = new cdk.Stack(); - // const vpc = new ec2.Vpc(stack, 'VPC'); - // const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); - - // // WHEN - // new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { - // cluster, - // loadBalancerType: ecsPatterns.LoadBalancerType.Network, - // image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), - // }); - - // // THEN - // const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.ServiceTaskDef1922A00F; - // test.deepEqual(serviceTaskDefinition.Properties.ContainerDefinitions[0].Name, 'web'); - // test.done(); - // } + 'setting servicename updates service name with given name'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + + // WHEN + new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + cluster, + loadBalancerType: ecsPatterns.LoadBalancerType.Network, + image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + serviceName: 'bob' + }); + // THEN + const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.Service9571FDD8; + test.deepEqual(serviceTaskDefinition.Properties.ServiceName, 'bob'); + test.done(); + }, + + 'not setting servicename updates service name with default'(test: Test) { + // GIVEN + const stack = new cdk.Stack(); + const vpc = new ec2.Vpc(stack, 'VPC'); + const cluster = new ecs.Cluster(stack, 'Cluster', { vpc }); + + // WHEN + new ecsPatterns.LoadBalancedFargateService(stack, 'Service', { + cluster, + loadBalancerType: ecsPatterns.LoadBalancerType.Network, + image: ecs.ContainerImage.fromRegistry("/aws/aws-example-app"), + }); + + // THEN + const serviceTaskDefinition = SynthUtils.synthesize(stack).template.Resources.Service9571FDD8; + test.equal(serviceTaskDefinition.Properties.ServiceName, undefined); + test.done(); + } }; \ No newline at end of file