Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { CodeBuildAction, CodeCommitSourceAction, CodeDeployEcsDeployAction } fr
import { Vpc, Port } from '@aws-cdk/aws-ec2';
import { Cluster } from '@aws-cdk/aws-ecs';
import { ApplicationLoadBalancer, ApplicationTargetGroup, TargetType } from '@aws-cdk/aws-elasticloadbalancingv2';
import { Construct, Stack, StackProps } from '@aws-cdk/core';
import { Construct, Duration, Stack, StackProps } from '@aws-cdk/core';

import { EcsService, DummyTaskDefinition, EcsDeploymentGroup, PushImageProject } from '@cloudcomponents/cdk-blue-green-container-deployment';
import { ImageRepository } from '@cloudcomponents/cdk-container-registry';
Expand Down Expand Up @@ -67,6 +67,7 @@ export class BlueGreenContainerDeploymentStack extends Stack {
desiredCount: 2,
taskDefinition,
prodTargetGroup,
testTargetGroup,
});

ecsService.connections.allowFrom(loadBalancer, Port.tcp(80));
Expand All @@ -76,10 +77,10 @@ export class BlueGreenContainerDeploymentStack extends Stack {
applicationName: 'blue-green-application',
deploymentGroupName: 'blue-green-deployment-group',
ecsServices: [ecsService],
targetGroupNames: [prodTargetGroup.targetGroupName, testTargetGroup.targetGroupName],
targetGroups: [prodTargetGroup, testTargetGroup],
prodTrafficListener: prodListener,
testTrafficListener: testListener,
terminationWaitTimeInMinutes: 100,
terminationWaitTime: Duration.minutes(100),
});

// @see files: ./blue-green-repository for example content
Expand Down
10 changes: 6 additions & 4 deletions packages/cdk-blue-green-container-deployment/API.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,12 @@ new EcsDeploymentGroup(scope: Construct, id: string, props: EcsDeploymentGroupPr
* **deploymentGroupName** (<code>string</code>) *No description*
* **ecsServices** (<code>Array<[IEcsService](#cloudcomponents-cdk-blue-green-container-deployment-iecsservice)></code>) *No description*
* **prodTrafficListener** (<code>[TrafficListener](#cloudcomponents-cdk-blue-green-container-deployment-trafficlistener)</code>) *No description*
* **targetGroupNames** (<code>Array<string></code>) *No description*
* **targetGroups** (<code>Array<[ApplicationTargetGroup](#aws-cdk-aws-elasticloadbalancingv2-applicationtargetgroup)></code>) *No description*
* **testTrafficListener** (<code>[TrafficListener](#cloudcomponents-cdk-blue-green-container-deployment-trafficlistener)</code>) *No description*
* **applicationName** (<code>string</code>) *No description* __*Optional*__
* **autoRollbackOnEvents** (<code>Array<[RollbackEvent](#cloudcomponents-cdk-blue-green-container-deployment-rollbackevent)></code>) The event type or types that trigger a rollback. __*Optional*__
* **deploymentConfig** (<code>[IEcsDeploymentConfig](#cloudcomponents-cdk-blue-green-container-deployment-iecsdeploymentconfig)</code>) *No description* __*Optional*__
* **terminationWaitTimeInMinutes** (<code>number</code>) the number of minutes before deleting the original (blue) task set. __*Default*__: 60
* **terminationWaitTime** (<code>[Duration](#aws-cdk-core-duration)</code>) the number of minutes before deleting the original (blue) task set. __*Default*__: 60 minutes



Expand Down Expand Up @@ -221,6 +221,7 @@ new EcsService(scope: Construct, id: string, props: EcsServiceProps)
* **prodTargetGroup** (<code>[ITargetGroup](#aws-cdk-aws-elasticloadbalancingv2-itargetgroup)</code>) *No description*
* **serviceName** (<code>string</code>) *No description*
* **taskDefinition** (<code>[DummyTaskDefinition](#cloudcomponents-cdk-blue-green-container-deployment-dummytaskdefinition)</code>) *No description*
* **testTargetGroup** (<code>[ITargetGroup](#aws-cdk-aws-elasticloadbalancingv2-itargetgroup)</code>) *No description*
* **circuitBreaker** (<code>[DeploymentCircuitBreaker](#aws-cdk-aws-ecs-deploymentcircuitbreaker)</code>) Whether to enable the deployment circuit breaker. __*Default*__: disabled
* **containerPort** (<code>number</code>) *No description* __*Optional*__
* **desiredCount** (<code>number</code>) *No description* __*Optional*__
Expand Down Expand Up @@ -317,12 +318,12 @@ Name | Type | Description
**deploymentGroupName** | <code>string</code> | <span></span>
**ecsServices** | <code>Array<[IEcsService](#cloudcomponents-cdk-blue-green-container-deployment-iecsservice)></code> | <span></span>
**prodTrafficListener** | <code>[TrafficListener](#cloudcomponents-cdk-blue-green-container-deployment-trafficlistener)</code> | <span></span>
**targetGroupNames** | <code>Array<string></code> | <span></span>
**targetGroups** | <code>Array<[ApplicationTargetGroup](#aws-cdk-aws-elasticloadbalancingv2-applicationtargetgroup)></code> | <span></span>
**testTrafficListener** | <code>[TrafficListener](#cloudcomponents-cdk-blue-green-container-deployment-trafficlistener)</code> | <span></span>
**applicationName**? | <code>string</code> | __*Optional*__
**autoRollbackOnEvents**? | <code>Array<[RollbackEvent](#cloudcomponents-cdk-blue-green-container-deployment-rollbackevent)></code> | The event type or types that trigger a rollback.<br/>__*Optional*__
**deploymentConfig**? | <code>[IEcsDeploymentConfig](#cloudcomponents-cdk-blue-green-container-deployment-iecsdeploymentconfig)</code> | __*Optional*__
**terminationWaitTimeInMinutes**? | <code>number</code> | the number of minutes before deleting the original (blue) task set.<br/>__*Default*__: 60
**terminationWaitTime**? | <code>[Duration](#aws-cdk-core-duration)</code> | the number of minutes before deleting the original (blue) task set.<br/>__*Default*__: 60 minutes



Expand All @@ -339,6 +340,7 @@ Name | Type | Description
**prodTargetGroup** | <code>[ITargetGroup](#aws-cdk-aws-elasticloadbalancingv2-itargetgroup)</code> | <span></span>
**serviceName** | <code>string</code> | <span></span>
**taskDefinition** | <code>[DummyTaskDefinition](#cloudcomponents-cdk-blue-green-container-deployment-dummytaskdefinition)</code> | <span></span>
**testTargetGroup** | <code>[ITargetGroup](#aws-cdk-aws-elasticloadbalancingv2-itargetgroup)</code> | <span></span>
**circuitBreaker**? | <code>[DeploymentCircuitBreaker](#aws-cdk-aws-ecs-deploymentcircuitbreaker)</code> | Whether to enable the deployment circuit breaker.<br/>__*Default*__: disabled
**containerPort**? | <code>number</code> | __*Optional*__
**desiredCount**? | <code>number</code> | __*Optional*__
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[{"timestamp":1631683651094,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":1728,"diff":0},{"filename":"ecs-deployment-group/index.js","previous":2182,"size":2182,"diff":0},{"filename":"ecs-service/index.js","previous":2152,"size":2138,"diff":-14}]},{"timestamp":1629825530770,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":1728,"diff":0},{"filename":"ecs-deployment-group/index.js","previous":2171,"size":2182,"diff":11},{"filename":"ecs-service/index.js","previous":2152,"size":2152,"diff":0}]},{"timestamp":1629823812165,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":1728,"diff":0},{"filename":"ecs-deployment-group/index.js","previous":2123,"size":2171,"diff":48},{"filename":"ecs-service/index.js","previous":2152,"size":2152,"diff":0}]},{"timestamp":1627652613714,"files":[{"filename":"dummy-task-definition/index.js","previous":1726,"size":1728,"diff":2},{"filename":"ecs-deployment-group/index.js","previous":2123,"size":2123,"diff":0},{"filename":"ecs-service/index.js","previous":2081,"size":2152,"diff":71}]},{"timestamp":1609276390870,"files":[{"filename":"dummy-task-definition/index.js","previous":1712,"size":1726,"diff":14},{"filename":"ecs-deployment-group/index.js","previous":2123,"size":2123,"diff":0},{"filename":"ecs-service/index.js","previous":2081,"size":2081,"diff":0}]},{"timestamp":1606329521054,"files":[{"filename":"dummy-task-definition/index.js","previous":1706,"size":1712,"diff":6},{"filename":"ecs-deployment-group/index.js","previous":2116,"size":2123,"diff":7},{"filename":"ecs-service/index.js","previous":2073,"size":2081,"diff":8}]},{"timestamp":1596457247342,"files":[{"filename":"dummy-task-definition/index.js","previous":1756,"size":1706,"diff":-50},{"filename":"ecs-deployment-group/index.js","previous":2116,"size":2116,"diff":0},{"filename":"ecs-service/index.js","previous":2073,"size":2073,"diff":0}]},{"timestamp":1596454924871,"files":[{"filename":"dummy-task-definition/index.js","previous":4964,"size":1756,"diff":-3208},{"filename":"ecs-deployment-group/index.js","previous":6103,"size":2116,"diff":-3987},{"filename":"ecs-service/index.js","previous":6141,"size":2073,"diff":-4068}]},{"timestamp":1596407637937,"files":[{"filename":"blue-green-service/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"blue-green-service/index.js","previous":3368,"size":0,"diff":-3368},{"filename":"dummy-task-definition/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"dummy-task-definition/index.js","previous":1963,"size":4964,"diff":3001},{"filename":"ecs-deployment-group/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"ecs-deployment-group/index.js","previous":2292,"size":6103,"diff":3811},{"filename":"ecs-service/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"ecs-service/index.js","previous":2312,"size":6141,"diff":3829}]}]
[{"timestamp":1634467601943,"files":[{"filename":"ecs-deployment-group/index.js","previous":144792,"size":144825,"diff":33},{"filename":"ecs-service/index.js","previous":2133,"size":144797,"diff":142664}]},{"timestamp":1634411334117,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":0,"diff":-1728},{"filename":"ecs-deployment-group/index.js","previous":2182,"size":144792,"diff":142610},{"filename":"ecs-service/index.js","previous":2138,"size":2133,"diff":-5}]},{"timestamp":1631683651094,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":1728,"diff":0},{"filename":"ecs-deployment-group/index.js","previous":2182,"size":2182,"diff":0},{"filename":"ecs-service/index.js","previous":2152,"size":2138,"diff":-14}]},{"timestamp":1629825530770,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":1728,"diff":0},{"filename":"ecs-deployment-group/index.js","previous":2171,"size":2182,"diff":11},{"filename":"ecs-service/index.js","previous":2152,"size":2152,"diff":0}]},{"timestamp":1629823812165,"files":[{"filename":"dummy-task-definition/index.js","previous":1728,"size":1728,"diff":0},{"filename":"ecs-deployment-group/index.js","previous":2123,"size":2171,"diff":48},{"filename":"ecs-service/index.js","previous":2152,"size":2152,"diff":0}]},{"timestamp":1627652613714,"files":[{"filename":"dummy-task-definition/index.js","previous":1726,"size":1728,"diff":2},{"filename":"ecs-deployment-group/index.js","previous":2123,"size":2123,"diff":0},{"filename":"ecs-service/index.js","previous":2081,"size":2152,"diff":71}]},{"timestamp":1609276390870,"files":[{"filename":"dummy-task-definition/index.js","previous":1712,"size":1726,"diff":14},{"filename":"ecs-deployment-group/index.js","previous":2123,"size":2123,"diff":0},{"filename":"ecs-service/index.js","previous":2081,"size":2081,"diff":0}]},{"timestamp":1606329521054,"files":[{"filename":"dummy-task-definition/index.js","previous":1706,"size":1712,"diff":6},{"filename":"ecs-deployment-group/index.js","previous":2116,"size":2123,"diff":7},{"filename":"ecs-service/index.js","previous":2073,"size":2081,"diff":8}]},{"timestamp":1596457247342,"files":[{"filename":"dummy-task-definition/index.js","previous":1756,"size":1706,"diff":-50},{"filename":"ecs-deployment-group/index.js","previous":2116,"size":2116,"diff":0},{"filename":"ecs-service/index.js","previous":2073,"size":2073,"diff":0}]},{"timestamp":1596454924871,"files":[{"filename":"dummy-task-definition/index.js","previous":4964,"size":1756,"diff":-3208},{"filename":"ecs-deployment-group/index.js","previous":6103,"size":2116,"diff":-3987},{"filename":"ecs-service/index.js","previous":6141,"size":2073,"diff":-4068}]},{"timestamp":1596407637937,"files":[{"filename":"blue-green-service/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"blue-green-service/index.js","previous":3368,"size":0,"diff":-3368},{"filename":"dummy-task-definition/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"dummy-task-definition/index.js","previous":1963,"size":4964,"diff":3001},{"filename":"ecs-deployment-group/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"ecs-deployment-group/index.js","previous":2292,"size":6103,"diff":3811},{"filename":"ecs-service/__entrypoint__.js","previous":6760,"size":0,"diff":-6760},{"filename":"ecs-service/index.js","previous":2312,"size":6141,"diff":3829}]}]
5 changes: 5 additions & 0 deletions packages/cdk-blue-green-container-deployment/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,27 +63,32 @@
"peerDependencies": {
"@aws-cdk/aws-codebuild": "^1.127.0",
"@aws-cdk/aws-codedeploy": "^1.127.0",
"@aws-cdk/custom-resources": "^1.127.0",
"@aws-cdk/aws-ec2": "^1.127.0",
"@aws-cdk/aws-ecr": "^1.127.0",
"@aws-cdk/aws-ecs": "^1.127.0",
"@aws-cdk/aws-elasticloadbalancingv2": "^1.127.0",
"@aws-cdk/aws-iam": "^1.127.0",
"@aws-cdk/aws-lambda": "^1.127.0",
"@aws-cdk/core": "^1.127.0",
"constructs": "^3.2.0"
},
"dependencies": {
"@aws-cdk/aws-codebuild": "^1.127.0",
"@aws-cdk/aws-codedeploy": "^1.127.0",
"@aws-cdk/custom-resources": "^1.127.0",
"@aws-cdk/aws-ec2": "^1.127.0",
"@aws-cdk/aws-ecr": "^1.127.0",
"@aws-cdk/aws-ecs": "^1.127.0",
"@aws-cdk/aws-elasticloadbalancingv2": "^1.127.0",
"@aws-cdk/aws-iam": "^1.127.0",
"@aws-cdk/aws-lambda": "^1.127.0",
"@aws-cdk/core": "^1.127.0"
},
"devDependencies": {
"@aws-cdk/assert": "^1.127.0",
"aws-sdk": "^2.1004.0",
"custom-resource-helper": "^1.0.15",
"jest-cdk-snapshot": "^1.4.2"
},
"externals": [
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`default setup 1`] = `
Object {
"Parameters": Any<Object>,
"Resources": Object {
"AWS679f53fac002430cb0da5b7982bd22872D164C4C": Object {
"DependsOn": Array [
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2",
],
"Properties": Object {
"Code": Any<Object>,
"Handler": "index.handler",
"Role": Object {
"Fn::GetAtt": Array [
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2",
"Arn",
],
},
"Runtime": "nodejs12.x",
"Timeout": 120,
},
"Type": "AWS::Lambda::Function",
},
"AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2": Object {
"Properties": Object {
"AssumeRolePolicyDocument": Object {
"Statement": Array [
Object {
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": Object {
"Service": "lambda.amazonaws.com",
},
},
],
"Version": "2012-10-17",
},
"ManagedPolicyArns": Array [
Object {
"Fn::Join": Array [
"",
Array [
"arn:",
Object {
"Ref": "AWS::Partition",
},
":iam::aws:policy/service-role/AWSLambdaBasicExecutionRole",
],
],
},
],
},
"Type": "AWS::IAM::Role",
},
"DummyTaskDefinitionCustomResourcePolicyB5660701": Object {
"Properties": Object {
"PolicyDocument": Object {
"Statement": Array [
Object {
"Action": Array [
"ecs:RegisterTaskDefinition",
"ecs:DeregisterTaskDefinition",
],
"Effect": "Allow",
"Resource": "*",
},
Object {
"Action": "iam:PassRole",
"Effect": "Allow",
"Resource": Object {
"Fn::GetAtt": Array [
"DummyTaskDefinitionExecutionRole715DBD43",
"Arn",
],
},
},
],
"Version": "2012-10-17",
},
"PolicyName": "DummyTaskDefinitionCustomResourcePolicyB5660701",
"Roles": Array [
Object {
"Ref": "AWS679f53fac002430cb0da5b7982bd2287ServiceRoleC1EA0FF2",
},
],
},
"Type": "AWS::IAM::Policy",
},
"DummyTaskDefinitionE3D9D432": Object {
"DeletionPolicy": "Delete",
"DependsOn": Array [
"DummyTaskDefinitionCustomResourcePolicyB5660701",
],
"Properties": Object {
"Create": Object {
"Fn::Join": Array [
"",
Array [
"{\\"service\\":\\"ECS\\",\\"action\\":\\"registerTaskDefinition\\",\\"parameters\\":{\\"requiresCompatibilities\\":[\\"FARGATE\\"],\\"family\\":\\"c86e1e5d419d3c124c7e40411b7e7805f91621e162\\",\\"executionRoleArn\\":\\"",
Object {
"Fn::GetAtt": Array [
"DummyTaskDefinitionExecutionRole715DBD43",
"Arn",
],
},
"\\",\\"networkMode\\":\\"awsvpc\\",\\"cpu\\":\\"256\\",\\"memory\\":\\"512\\",\\"containerDefinitions\\":[{\\"name\\":\\"sample-website\\",\\"image\\":\\"image\\",\\"portMappings\\":[{\\"hostPort\\":80,\\"protocol\\":\\"tcp\\",\\"containerPort\\":80}]}]},\\"physicalResourceId\\":{\\"responsePath\\":\\"taskDefinition.taskDefinitionArn\\"}}",
],
],
},
"Delete": "{\\"service\\":\\"ECS\\",\\"action\\":\\"deregisterTaskDefinition\\",\\"parameters\\":{\\"taskDefinition\\":\\"PHYSICAL:RESOURCEID:\\"}}",
"InstallLatestAwsSdk": true,
"ServiceToken": Object {
"Fn::GetAtt": Array [
"AWS679f53fac002430cb0da5b7982bd22872D164C4C",
"Arn",
],
},
},
"Type": "Custom::DummyTaskDefinition",
"UpdateReplacePolicy": "Delete",
},
"DummyTaskDefinitionExecutionRole715DBD43": Object {
"Properties": Object {
"AssumeRolePolicyDocument": Object {
"Statement": Array [
Object {
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": Object {
"Service": "ecs-tasks.amazonaws.com",
},
},
],
"Version": "2012-10-17",
},
"ManagedPolicyArns": Array [
Object {
"Fn::Join": Array [
"",
Array [
"arn:",
Object {
"Ref": "AWS::Partition",
},
":iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy",
],
],
},
],
},
"Type": "AWS::IAM::Role",
},
},
}
`;
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { Stack } from '@aws-cdk/core';
import 'jest-cdk-snapshot';

import { DummyTaskDefinition } from '../dummy-task-definition';

test('default setup', (): void => {
const stack = new Stack();

new DummyTaskDefinition(stack, 'DummyTaskDefinition', {
image: 'image',
});

expect(stack).toMatchCdkSnapshot({
ignoreAssets: true,
});
});
Loading