diff --git a/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts b/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts index 8d6f73fe7dfe6..4b7fd0cbb30a4 100644 --- a/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts +++ b/packages/aws-cdk-lib/core/lib/helpers-internal/cfn-parse.ts @@ -472,6 +472,7 @@ export class CfnParser { case 'Delete': return CfnDeletionPolicy.DELETE; case 'Retain': return CfnDeletionPolicy.RETAIN; case 'Snapshot': return CfnDeletionPolicy.SNAPSHOT; + case 'RetainExceptOnCreate': return CfnDeletionPolicy.RETAIN_EXCEPT_ON_CREATE; default: throw new Error(`Unrecognized DeletionPolicy '${policy}'`); } } diff --git a/packages/aws-cdk/lib/api/hotswap/ecs-services.ts b/packages/aws-cdk/lib/api/hotswap/ecs-services.ts index 7f2dea19ea493..42aa610795b4f 100644 --- a/packages/aws-cdk/lib/api/hotswap/ecs-services.ts +++ b/packages/aws-cdk/lib/api/hotswap/ecs-services.ts @@ -132,8 +132,9 @@ export async function isHotswappableEcsServiceChange( }, }, } as const; + const excludeFromTransformLowercased = transformObjectKeys(excludeFromTransform, lowerCaseFirstCharacter); // We first uppercase the task definition to properly merge it with the one from CloudFormation template. - const upperCasedTaskDef = transformObjectKeys(target.taskDefinition, upperCaseFirstCharacter, excludeFromTransform); + const upperCasedTaskDef = transformObjectKeys(target.taskDefinition, upperCaseFirstCharacter, excludeFromTransformLowercased); // merge evaluatable diff from CloudFormation template. const updatedTaskDef = applyPropertyUpdates(changes.updates, upperCasedTaskDef); // lowercase the merged task definition to use it in AWS SDK. diff --git a/packages/aws-cdk/test/api/hotswap/ecs-services-hotswap-deployments.test.ts b/packages/aws-cdk/test/api/hotswap/ecs-services-hotswap-deployments.test.ts index b9be0725315c8..2d41d1b13ba58 100644 --- a/packages/aws-cdk/test/api/hotswap/ecs-services-hotswap-deployments.test.ts +++ b/packages/aws-cdk/test/api/hotswap/ecs-services-hotswap-deployments.test.ts @@ -812,13 +812,22 @@ describe.each([HotswapMode.FALL_BACK, HotswapMode.HOTSWAP_ONLY])('%p mode', (hot }); }); - test('should call registerTaskDefinition with certain properties not lowercased', async () => { + test('should call registerTaskDefinition with certain properties not lowercased nor uppercased', async () => { // GIVEN setupCurrentTaskDefinition({ taskDefinitionProperties: { Family: 'my-task-def', ContainerDefinitions: [ - { Image: 'image1' }, + { + Image: 'image1', + DockerLabels: { Label1: 'label1' }, + FirelensConfiguration: { + Options: { Name: 'cloudwatch' }, + }, + LogConfiguration: { + Options: { Option1: 'option1', option2: 'option2' }, + }, + }, ], Volumes: [ { @@ -846,7 +855,7 @@ describe.each([HotswapMode.FALL_BACK, HotswapMode.HOTSWAP_ONLY])('%p mode', (hot Options: { Name: 'cloudwatch' }, }, LogConfiguration: { - Options: { Option1: 'option1' }, + Options: { Option1: 'option1', option2: 'option2' }, }, }, ], @@ -887,7 +896,7 @@ describe.each([HotswapMode.FALL_BACK, HotswapMode.HOTSWAP_ONLY])('%p mode', (hot }, }, logConfiguration: { - options: { Option1: 'option1' }, + options: { Option1: 'option1', option2: 'option2' }, }, }, ],