Skip to content

Commit f213efa

Browse files
rogperezcuperman
andauthored
VCASREF-15848: add tagging support to ecs tasks (#1)
* Publish blue-green to github packages * Add branch to allowBranch deploy * Publish - @verimatrix/cdk-blue-green-container-deployment@1.45.1-rperez.0 * add lerna publish configs * bump version * Publish - @verimatrix/cdk-blue-green-container-deployment@1.45.1-rperez.2 * change registry string * bump * Publish - @verimatrix/cdk-blue-green-container-deployment@1.45.1 * Use release candidate versioning * Publish - @verimatrix/cdk-blue-green-container-deployment@1.46.0-rc.2 * VCASREF-15848: support propagation tags in cdk-blue-green-container-deployment * VCASREF-15848: downgrade to 1.46.0-rc.1 * VCASREF-15848: 1.46.0-rc.4 * Fix typo * Add unit tests * VCASREF-15848: revert lerna specific logic Co-authored-by: Jeff Cooper <jcooper@verimatrix.com> Co-authored-by: Jeff Cooper <jeff@cuperman.net>
1 parent a4736e5 commit f213efa

10 files changed

Lines changed: 200 additions & 2218 deletions

File tree

.nvmrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
12.22.7

.prettierrc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"trailingComma": "es5",
3+
"tabWidth": 2,
4+
"semi": true,
5+
"singleQuote": false,
6+
"printWidth": 120,
7+
"overrides": [
8+
{
9+
"files": ["*.yml"],
10+
"options": {
11+
"tabWidth": 2
12+
}
13+
}
14+
]
15+
}

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@
33
"editor.codeActionsOnSave": {
44
"source.fixAll.eslint": true
55
},
6-
"explorer.autoReveal": false
6+
"explorer.autoReveal": false,
7+
"editor.formatOnSave": false
78
}

packages/cdk-blue-green-container-deployment/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export class BlueGreenContainerDeploymentStack extends Stack {
6969
internetFacing: true,
7070
});
7171

72-
const prodListener = loadBalancer.addListener('ProfListener', {
72+
const prodListener = loadBalancer.addListener('ProdListener', {
7373
port: 80,
7474
});
7575

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"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}]}]
1+
[{"timestamp":1636492609712,"files":[{"filename":"ecs-deployment-group/index.js","previous":144825,"size":144825,"diff":0},{"filename":"ecs-service/index.js","previous":144797,"size":144819,"diff":22}]},{"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}]}]

packages/cdk-blue-green-container-deployment/package.json

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
{
2-
"name": "@cloudcomponents/cdk-blue-green-container-deployment",
3-
"version": "1.45.0",
2+
"name": "@verimatrix/cdk-blue-green-container-deployment",
3+
"version": "1.46.0-rc.4",
44
"description": "Blue green container deployment with CodeDeploy",
55
"license": "MIT",
6+
"publishConfig": {
7+
"registry": "https://npm.pkg.github.com"
8+
},
69
"author": {
710
"name": "hupe1980",
811
"url": "https://github.com/hupe1980"
@@ -12,10 +15,10 @@
1215
},
1316
"repository": {
1417
"type": "git",
15-
"url": "https://github.com/cloudcomponents/cdk-constructs.git",
18+
"url": "https://github.com/Verimatrix/cdk-constructs.git",
1619
"directory": "packages/cdk-blue-green-deployment"
1720
},
18-
"homepage": "https://github.com/cloudcomponents/cdk-constructs",
21+
"homepage": "https://github.com/Verimatrix/cdk-constructs",
1922
"keywords": [
2023
"aws",
2124
"cdk",
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import * as cdk from '@aws-cdk/core';
2+
import * as ecs from '@aws-cdk/aws-ecs';
3+
import * as elb from '@aws-cdk/aws-elasticloadbalancingv2';
4+
5+
import { expect as expectCDK, haveResource } from '@aws-cdk/assert';
6+
7+
import { EcsService, PropagateTags } from '../ecs-service';
8+
import { DummyTaskDefinition } from '../dummy-task-definition';
9+
10+
describe('EcsService', () => {
11+
const app = new cdk.App();
12+
13+
describe('with default props', () => {
14+
const stack = new cdk.Stack(app, 'MyStackWithDefaults');
15+
const cluster = new ecs.Cluster(stack, 'Cluster');
16+
const prodTargetGroup = new elb.ApplicationTargetGroup(stack, 'ProdTargetGroup', { vpc: cluster.vpc });
17+
const testTargetGroup = new elb.ApplicationTargetGroup(stack, 'TestTargetGroup', { vpc: cluster.vpc });
18+
const taskDefinition = new DummyTaskDefinition(stack, 'DummyTaskDefinition', { image: 'nginx' });
19+
20+
new EcsService(stack, 'Service', {
21+
cluster,
22+
serviceName: 'My Service',
23+
prodTargetGroup,
24+
testTargetGroup,
25+
taskDefinition,
26+
});
27+
28+
it('Creates a BlueGreenService custom resource', () => {
29+
expectCDK(stack).to(haveResource('Custom::BlueGreenService', {
30+
ServiceName: 'My Service',
31+
LaunchType: 'FARGATE'
32+
}));
33+
});
34+
});
35+
36+
describe('with tag propagation', () => {
37+
const stack = new cdk.Stack(app, 'MyStackWithTagPropagation');
38+
const cluster = new ecs.Cluster(stack, 'Cluster');
39+
const prodTargetGroup = new elb.ApplicationTargetGroup(stack, 'ProdTargetGroup', { vpc: cluster.vpc });
40+
const testTargetGroup = new elb.ApplicationTargetGroup(stack, 'TestTargetGroup', { vpc: cluster.vpc });
41+
const taskDefinition = new DummyTaskDefinition(stack, 'DummyTaskDefinition', { image: 'nginx' });
42+
43+
new EcsService(stack, 'Service', {
44+
cluster,
45+
serviceName: 'My Service',
46+
prodTargetGroup,
47+
testTargetGroup,
48+
taskDefinition,
49+
propagateTags: PropagateTags.SERVICE
50+
});
51+
52+
it('enables tag propagation', () => {
53+
expectCDK(stack).to(haveResource('Custom::BlueGreenService', {
54+
ServiceName: 'My Service',
55+
LaunchType: 'FARGATE',
56+
PropagateTags: 'SERVICE'
57+
}));
58+
});
59+
});
60+
});

packages/cdk-blue-green-container-deployment/src/ecs-service.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ export interface IEcsService {
1313
readonly serviceName: string;
1414
}
1515

16+
export enum PropagateTags {
17+
SERVICE = 'SERVICE',
18+
TASK_DEFINITION = 'TASK_DEFINITION'
19+
}
20+
1621
export interface EcsServiceProps {
1722
readonly securityGroups?: SecurityGroup[];
1823
readonly cluster: ICluster;
@@ -24,6 +29,7 @@ export interface EcsServiceProps {
2429
readonly prodTargetGroup: ITargetGroup;
2530
readonly testTargetGroup: ITargetGroup;
2631
readonly taskDefinition: DummyTaskDefinition;
32+
readonly propagateTags?: PropagateTags;
2733

2834
/**
2935
* The period of time, in seconds, that the Amazon ECS service scheduler ignores unhealthy
@@ -141,7 +147,9 @@ export class EcsService extends Construct implements IConnectable, IEcsService {
141147
rollback: props.circuitBreaker.rollback ?? false,
142148
}
143149
: undefined,
150+
PropagateTags: props.propagateTags
144151
},
152+
PropagateTags: props.propagateTags
145153
},
146154
});
147155

packages/cdk-blue-green-container-deployment/src/lambdas/ecs-service/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export interface BlueGreenServiceProps {
2424
schedulingStrategy: string;
2525
healthCheckGracePeriodSeconds: number;
2626
deploymentConfiguration: ECS.DeploymentConfiguration;
27+
propagateTags: 'SERVICE'|'TASK_DEFINITION'|string;
2728
}
2829

2930
const ecs = new ECS();
@@ -43,6 +44,7 @@ const getProperties = (props: CloudFormationCustomResourceEvent['ResourcePropert
4344
schedulingStrategy: props.SchedulingStrategy,
4445
healthCheckGracePeriodSeconds: props.HealthCheckGracePeriodSeconds,
4546
deploymentConfiguration: props.DeploymentConfiguration,
47+
propagateTags: props.PropagateTags
4648
});
4749

4850
const handleCreate: OnCreateHandler = async (event): Promise<ResourceHandlerReturn> => {
@@ -61,6 +63,7 @@ const handleCreate: OnCreateHandler = async (event): Promise<ResourceHandlerRetu
6163
schedulingStrategy,
6264
healthCheckGracePeriodSeconds,
6365
deploymentConfiguration,
66+
propagateTags
6467
} = getProperties(event.ResourceProperties);
6568

6669
const { service } = await ecs
@@ -90,6 +93,7 @@ const handleCreate: OnCreateHandler = async (event): Promise<ResourceHandlerRetu
9093
containerName,
9194
},
9295
],
96+
propagateTags
9397
})
9498
.promise();
9599

0 commit comments

Comments
 (0)