diff --git a/packages/@aws-cdk/aws-batch/lib/job-definition.ts b/packages/@aws-cdk/aws-batch/lib/job-definition.ts index 3666356c5b06f..6a412adfbd239 100644 --- a/packages/@aws-cdk/aws-batch/lib/job-definition.ts +++ b/packages/@aws-cdk/aws-batch/lib/job-definition.ts @@ -303,6 +303,18 @@ export interface JobDefinitionProps { * @default - EC2 */ readonly platformCapabilities?: PlatformCapabilities[]; + + /** + * Specifies whether to propagate the tags from the job or job definition to the corresponding Amazon ECS task. + * If no value is specified, the tags aren't propagated. + * Tags can only be propagated to the tasks during task creation. For tags with the same name, + * job tags are given priority over job definitions tags. + * If the total number of combined tags from the job and job definition is over 50, the job is moved to the `FAILED` state. + * + * @link http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-batch-jobdefinition.html#cfn-batch-jobdefinition-propagatetags + * @default - undefined + */ + readonly propagateTags?: boolean; } /** @@ -458,6 +470,7 @@ export class JobDefinition extends Resource implements IJobDefinition { attemptDurationSeconds: props.timeout ? props.timeout.toSeconds() : undefined, }, platformCapabilities: props.platformCapabilities ?? [PlatformCapabilities.EC2], + propagateTags: props.propagateTags, }); // add read secrets permission to execution role @@ -602,4 +615,4 @@ export class JobDefinition extends Resource implements IJobDefinition { }; }); } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-batch/test/integ.job-definition.ts b/packages/@aws-cdk/aws-batch/test/integ.job-definition.ts index e83a95734e6d8..b4cfffc3d574b 100644 --- a/packages/@aws-cdk/aws-batch/test/integ.job-definition.ts +++ b/packages/@aws-cdk/aws-batch/test/integ.job-definition.ts @@ -14,6 +14,13 @@ new JobDefinition(stack, "JobDefinition", { }, }); +new JobDefinition(stack, "JobDefinitionTags", { + container: { + image: ContainerImage.fromRegistry("docker/whalesay"), + }, + propagateTags: true, +}); + const integ = new IntegTest(app, "IntegTest-BatchDefaultEnvVarsStack", { testCases: [stack], regions: ["us-east-1"], diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.assets.json b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.assets.json index 12e2c17d12ef1..b179fad6984b7 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.assets.json +++ b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.assets.json @@ -1,7 +1,7 @@ { "version": "21.0.0", "files": { - "0a50911921bcac3c1775e3a82fc9c4414e3f12ea24b1e2c73bf1fc4c625ee16c": { + "fa4cb3c0495612b2b5dea9687948520b07f859705061dad691367153183cbc90": { "source": { "path": "BatchDefaultEnvVarsStack.template.json", "packaging": "file" @@ -9,7 +9,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "0a50911921bcac3c1775e3a82fc9c4414e3f12ea24b1e2c73bf1fc4c625ee16c.json", + "objectKey": "fa4cb3c0495612b2b5dea9687948520b07f859705061dad691367153183cbc90.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.template.json b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.template.json index 499ea08cc489a..6d794288a5646 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.template.json +++ b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/BatchDefaultEnvVarsStack.template.json @@ -41,6 +41,49 @@ }, "Timeout": {} } + }, + "JobDefinitionTags76FA063A": { + "Type": "AWS::Batch::JobDefinition", + "Properties": { + "Type": "container", + "ContainerProperties": { + "Environment": [ + { + "Name": "AWS_REGION", + "Value": { + "Ref": "AWS::Region" + } + }, + { + "Name": "AWS_ACCOUNT", + "Value": { + "Ref": "AWS::AccountId" + } + } + ], + "Image": "docker/whalesay", + "Privileged": false, + "ReadonlyRootFilesystem": false, + "ResourceRequirements": [ + { + "Type": "VCPU", + "Value": "1" + }, + { + "Type": "MEMORY", + "Value": "4" + } + ] + }, + "PlatformCapabilities": [ + "EC2" + ], + "PropagateTags": true, + "RetryStrategy": { + "Attempts": 1 + }, + "Timeout": {} + } } }, "Parameters": { diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json index 7eb7d384ef06c..004a618fef948 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json +++ b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.assets.json @@ -14,7 +14,7 @@ } } }, - "de70b340a5b843502197c20700c9328cb928be11584f66762e1ac05dc5380bed": { + "674d442d4a977a672cccae088b5eabcf91e06ee46b2464e4437c0332e04cf1a8": { "source": { "path": "IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.template.json", "packaging": "file" @@ -22,7 +22,7 @@ "destinations": { "current_account-current_region": { "bucketName": "cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}", - "objectKey": "de70b340a5b843502197c20700c9328cb928be11584f66762e1ac05dc5380bed.json", + "objectKey": "674d442d4a977a672cccae088b5eabcf91e06ee46b2464e4437c0332e04cf1a8.json", "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-file-publishing-role-${AWS::AccountId}-${AWS::Region}" } } diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.template.json b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.template.json index be4d151ea7fed..0e6c0ecbbafc9 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.template.json +++ b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/IntegTestBatchDefaultEnvVarsStackDefaultTestDeployAssertC15EFFF2.template.json @@ -15,7 +15,7 @@ "status": "ACTIVE" }, "flattenResponse": "true", - "salt": "1661947601911" + "salt": "1662181496271" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" @@ -36,7 +36,7 @@ ] }, "expected": "{\"$StringLike\":\"AWS_REGION\"}", - "salt": "1661947601912" + "salt": "1662181496272" }, "UpdateReplacePolicy": "Delete", "DeletionPolicy": "Delete" diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/manifest.json b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/manifest.json index 10e78afde8dab..19876e95fd885 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/manifest.json +++ b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/manifest.json @@ -23,7 +23,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/0a50911921bcac3c1775e3a82fc9c4414e3f12ea24b1e2c73bf1fc4c625ee16c.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/fa4cb3c0495612b2b5dea9687948520b07f859705061dad691367153183cbc90.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -45,6 +45,12 @@ "data": "JobDefinition24FFE3ED" } ], + "/BatchDefaultEnvVarsStack/JobDefinitionTags/Resource": [ + { + "type": "aws:cdk:logicalId", + "data": "JobDefinitionTags76FA063A" + } + ], "/BatchDefaultEnvVarsStack/BootstrapVersion": [ { "type": "aws:cdk:logicalId", @@ -76,7 +82,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-deploy-role-${AWS::AccountId}-${AWS::Region}", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-hnb659fds-cfn-exec-role-${AWS::AccountId}-${AWS::Region}", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/de70b340a5b843502197c20700c9328cb928be11584f66762e1ac05dc5380bed.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region}/674d442d4a977a672cccae088b5eabcf91e06ee46b2464e4437c0332e04cf1a8.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/tree.json b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/tree.json index 27c2310208279..ee0b8dbfac82c 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/tree.json +++ b/packages/@aws-cdk/aws-batch/test/job-definition.integ.snapshot/tree.json @@ -9,7 +9,7 @@ "path": "Tree", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.85" + "version": "10.1.92" } }, "BatchDefaultEnvVarsStack": { @@ -91,6 +91,83 @@ "fqn": "@aws-cdk/aws-batch.JobDefinition", "version": "0.0.0" } + }, + "JobDefinitionTags": { + "id": "JobDefinitionTags", + "path": "BatchDefaultEnvVarsStack/JobDefinitionTags", + "children": { + "Resource-Batch-Task-Definition-Role": { + "id": "Resource-Batch-Task-Definition-Role", + "path": "BatchDefaultEnvVarsStack/JobDefinitionTags/Resource-Batch-Task-Definition-Role", + "constructInfo": { + "fqn": "@aws-cdk/aws-iam.LazyRole", + "version": "0.0.0" + } + }, + "Resource-Batch-Job-Container-Definition": { + "id": "Resource-Batch-Job-Container-Definition", + "path": "BatchDefaultEnvVarsStack/JobDefinitionTags/Resource-Batch-Job-Container-Definition", + "constructInfo": { + "fqn": "@aws-cdk/aws-ecs.ContainerDefinition", + "version": "0.0.0" + } + }, + "Resource": { + "id": "Resource", + "path": "BatchDefaultEnvVarsStack/JobDefinitionTags/Resource", + "attributes": { + "aws:cdk:cloudformation:type": "AWS::Batch::JobDefinition", + "aws:cdk:cloudformation:props": { + "type": "container", + "containerProperties": { + "environment": [ + { + "name": "AWS_REGION", + "value": { + "Ref": "AWS::Region" + } + }, + { + "name": "AWS_ACCOUNT", + "value": { + "Ref": "AWS::AccountId" + } + } + ], + "image": "docker/whalesay", + "privileged": false, + "readonlyRootFilesystem": false, + "resourceRequirements": [ + { + "type": "VCPU", + "value": "1" + }, + { + "type": "MEMORY", + "value": "4" + } + ] + }, + "platformCapabilities": [ + "EC2" + ], + "propagateTags": true, + "retryStrategy": { + "attempts": 1 + }, + "timeout": {} + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-batch.CfnJobDefinition", + "version": "0.0.0" + } + } + }, + "constructInfo": { + "fqn": "@aws-cdk/aws-batch.JobDefinition", + "version": "0.0.0" + } } }, "constructInfo": { @@ -111,7 +188,7 @@ "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/Default", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.85" + "version": "10.1.92" } }, "DeployAssert": { @@ -131,7 +208,7 @@ "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/DeployAssert/AwsApiCallBatchdescribeJobDefinitions/SdkProvider/AssertionsProvider", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.85" + "version": "10.1.92" } } }, @@ -171,7 +248,7 @@ "path": "IntegTest-BatchDefaultEnvVarsStack/DefaultTest/DeployAssert/AwsApiCallBatchdescribeJobDefinitions/AssertEqualsBatchdescribeJobDefinitions/AssertionProvider/AssertionsProvider", "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.85" + "version": "10.1.92" } } }, @@ -249,7 +326,7 @@ }, "constructInfo": { "fqn": "constructs.Construct", - "version": "10.1.85" + "version": "10.1.92" } } }, diff --git a/packages/@aws-cdk/aws-batch/test/job-definition.test.ts b/packages/@aws-cdk/aws-batch/test/job-definition.test.ts index 0174ad372b2ab..6793c0aee527d 100644 --- a/packages/@aws-cdk/aws-batch/test/job-definition.test.ts +++ b/packages/@aws-cdk/aws-batch/test/job-definition.test.ts @@ -284,6 +284,21 @@ describe('Batch Job Definition', () => { }); }); + test('Can propagate tags', () => { + // WHEN + new batch.JobDefinition(stack, 'job-def', { + container: { + image: ecs.ContainerImage.fromRegistry('docker/whalesay'), + }, + propagateTags: true, + }); + + // THEN + Template.fromStack(stack).hasResourceProperties('AWS::Batch::JobDefinition', { + PropagateTags: true, + }); + }); + test('can use an ecr image', () => { // WHEN const repo = new ecr.Repository(stack, 'image-repo');