From 4b6dc8c650822bcd0231c8890bd94a934a0cd34d Mon Sep 17 00:00:00 2001 From: Jimmy Gaussen Date: Wed, 15 May 2024 02:41:40 +0200 Subject: [PATCH] feat(servicecatalog): `ProductStack` memoryLimit prop (#30105) ### Issue # (if applicable) Closes #29862 ### Reason for this change Exposes `BucketDeployment`'s `memoryLimit` prop in the `ProductStack` class. While not an ideal solution, this allows users to handle larger files ### Description of changes * Added `memoryLimit` to `ProductStackProps` and the internal `ProductStackSynthesizerProps` ### Description of how you validated changes Updated unit and integ tests ### Checklist - [x] My code adheres to the [CONTRIBUTING GUIDE](https://github.com/aws/aws-cdk/blob/main/CONTRIBUTING.md) and [DESIGN GUIDELINES](https://github.com/aws/aws-cdk/blob/main/docs/DESIGN_GUIDELINES.md) ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license* --- ...eg-servicecatalog-two-products.assets.json | 4 +- ...-servicecatalog-two-products.template.json | 23 ++++---- .../manifest.json | 54 +++++++++++++++---- .../integ.two-products.js.snapshot/tree.json | 41 +++++++------- .../test/integ.two-products.ts | 1 + .../lib/private/product-stack-synthesizer.ts | 14 +++++ .../aws-servicecatalog/lib/product-stack.ts | 12 +++++ .../test/product-stack.test.ts | 29 ++++++++++ 8 files changed, 136 insertions(+), 42 deletions(-) diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.assets.json b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.assets.json index 4fdb7e86c9db0..a75e5727de3b3 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.assets.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.assets.json @@ -99,7 +99,7 @@ } } }, - "49601d5a6b94fcf55a896a4f206d04c02be9cd7c33306b0e5491326168431f77": { + "f42e56a6bc2b884855b02a3254e4e741308601759e6982df848c505067b2ba75": { "source": { "path": "integ-servicecatalog-two-products.template.json", "packaging": "file" @@ -107,7 +107,7 @@ "destinations": { "12345678-test-region": { "bucketName": "cdk-hnb659fds-assets-12345678-test-region", - "objectKey": "49601d5a6b94fcf55a896a4f206d04c02be9cd7c33306b0e5491326168431f77.json", + "objectKey": "f42e56a6bc2b884855b02a3254e4e741308601759e6982df848c505067b2ba75.json", "region": "test-region", "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-file-publishing-role-12345678-test-region" } diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.template.json b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.template.json index 4fef751752c2c..8d0d95f1ea423 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.template.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/integ-servicecatalog-two-products.template.json @@ -41,7 +41,7 @@ "Value": "true" }, { - "Key": "aws-cdk:cr-owned:8a3b3620", + "Key": "aws-cdk:cr-owned:978d2e9b", "Value": "true" } ] @@ -130,12 +130,12 @@ "Description": "/opt/awscli/aws" } }, - "TestAssetBucketProductAssetsDeploymentCustomResource5F81E30F": { + "TestAssetBucketProductAssetsDeploymentCustomResource256MiBB5A849A6": { "Type": "Custom::CDKBucketDeployment", "Properties": { "ServiceToken": { "Fn::GetAtt": [ - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB5F7BD223", "Arn" ] }, @@ -217,7 +217,7 @@ "CustomS3AutoDeleteObjectsCustomResourceProviderRole3B1BD092" ] }, - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265": { + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { @@ -248,7 +248,7 @@ ] } }, - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF": { + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleDefaultPolicyE5468F0E": { "Type": "AWS::IAM::Policy", "Properties": { "PolicyDocument": { @@ -327,15 +327,15 @@ ], "Version": "2012-10-17" }, - "PolicyName": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF", + "PolicyName": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleDefaultPolicyE5468F0E", "Roles": [ { - "Ref": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265" + "Ref": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F" } ] } }, - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": { + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB5F7BD223": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { @@ -353,9 +353,10 @@ "Ref": "TestAssetBucketProductAssetsDeploymentAwsCliLayerD1E52C82" } ], + "MemorySize": 256, "Role": { "Fn::GetAtt": [ - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F", "Arn" ] }, @@ -363,8 +364,8 @@ "Timeout": 900 }, "DependsOn": [ - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF", - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265" + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleDefaultPolicyE5468F0E", + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F" ] }, "Product133E85955": { diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/manifest.json b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/manifest.json index 7520b0e3e9e52..c07f855c725de 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/manifest.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/manifest.json @@ -18,7 +18,7 @@ "validateOnSynth": false, "assumeRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-deploy-role-12345678-test-region", "cloudFormationExecutionRoleArn": "arn:${AWS::Partition}:iam::12345678:role/cdk-hnb659fds-cfn-exec-role-12345678-test-region", - "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-12345678-test-region/49601d5a6b94fcf55a896a4f206d04c02be9cd7c33306b0e5491326168431f77.json", + "stackTemplateAssetObjectUrl": "s3://cdk-hnb659fds-assets-12345678-test-region/f42e56a6bc2b884855b02a3254e4e741308601759e6982df848c505067b2ba75.json", "requiresBootstrapStackVersion": 6, "bootstrapStackVersionSsmParameter": "/cdk-bootstrap/hnb659fds/version", "additionalDependencies": [ @@ -76,10 +76,10 @@ "data": "TestAssetBucketProductAssetsDeploymentAwsCliLayerD1E52C82" } ], - "/integ-servicecatalog-two-products/TestAssetBucket/ProductAssetsDeployment/CustomResource/Default": [ + "/integ-servicecatalog-two-products/TestAssetBucket/ProductAssetsDeployment/CustomResource-256MiB/Default": [ { "type": "aws:cdk:logicalId", - "data": "TestAssetBucketProductAssetsDeploymentCustomResource5F81E30F" + "data": "TestAssetBucketProductAssetsDeploymentCustomResource256MiBB5A849A6" } ], "/integ-servicecatalog-two-products/Custom::S3AutoDeleteObjectsCustomResourceProvider/Role": [ @@ -94,22 +94,22 @@ "data": "CustomS3AutoDeleteObjectsCustomResourceProviderHandler9D90184F" } ], - "/integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/Resource": [ + "/integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole/Resource": [ { "type": "aws:cdk:logicalId", - "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265" + "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F" } ], - "/integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/DefaultPolicy/Resource": [ + "/integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole/DefaultPolicy/Resource": [ { "type": "aws:cdk:logicalId", - "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF" + "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleDefaultPolicyE5468F0E" } ], - "/integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource": [ + "/integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/Resource": [ { "type": "aws:cdk:logicalId", - "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536" + "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB5F7BD223" } ], "/integ-servicecatalog-two-products/Product1/Resource": [ @@ -141,6 +141,42 @@ "type": "aws:cdk:logicalId", "data": "CheckBootstrapVersion" } + ], + "TestAssetBucketProductAssetsDeploymentCustomResource5F81E30F": [ + { + "type": "aws:cdk:logicalId", + "data": "TestAssetBucketProductAssetsDeploymentCustomResource5F81E30F", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } + ], + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536": [ + { + "type": "aws:cdk:logicalId", + "data": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C81C01536", + "trace": [ + "!!DESTRUCTIVE_CHANGES: WILL_DESTROY" + ] + } ] }, "displayName": "integ-servicecatalog-two-products" diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/tree.json b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/tree.json index 6803f10a864ee..da44e58f7268d 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/tree.json +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.js.snapshot/tree.json @@ -90,7 +90,7 @@ "value": "true" }, { - "key": "aws-cdk:cr-owned:8a3b3620", + "key": "aws-cdk:cr-owned:978d2e9b", "value": "true" } ] @@ -255,13 +255,13 @@ "version": "0.0.0" } }, - "CustomResource": { - "id": "CustomResource", - "path": "integ-servicecatalog-two-products/TestAssetBucket/ProductAssetsDeployment/CustomResource", + "CustomResource-256MiB": { + "id": "CustomResource-256MiB", + "path": "integ-servicecatalog-two-products/TestAssetBucket/ProductAssetsDeployment/CustomResource-256MiB", "children": { "Default": { "id": "Default", - "path": "integ-servicecatalog-two-products/TestAssetBucket/ProductAssetsDeployment/CustomResource/Default", + "path": "integ-servicecatalog-two-products/TestAssetBucket/ProductAssetsDeployment/CustomResource-256MiB/Default", "constructInfo": { "fqn": "aws-cdk-lib.CfnResource", "version": "0.0.0" @@ -455,17 +455,17 @@ "version": "0.0.0" } }, - "Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C": { - "id": "Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C", + "Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB": { + "id": "Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB", "children": { "ServiceRole": { "id": "ServiceRole", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole", "children": { "ImportServiceRole": { "id": "ImportServiceRole", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/ImportServiceRole", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole/ImportServiceRole", "constructInfo": { "fqn": "aws-cdk-lib.Resource", "version": "0.0.0" @@ -473,7 +473,7 @@ }, "Resource": { "id": "Resource", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/Resource", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole/Resource", "attributes": { "aws:cdk:cloudformation:type": "AWS::IAM::Role", "aws:cdk:cloudformation:props": { @@ -512,11 +512,11 @@ }, "DefaultPolicy": { "id": "DefaultPolicy", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/DefaultPolicy", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole/DefaultPolicy", "children": { "Resource": { "id": "Resource", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/ServiceRole/DefaultPolicy/Resource", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/ServiceRole/DefaultPolicy/Resource", "attributes": { "aws:cdk:cloudformation:type": "AWS::IAM::Policy", "aws:cdk:cloudformation:props": { @@ -596,10 +596,10 @@ ], "Version": "2012-10-17" }, - "policyName": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRoleDefaultPolicy88902FDF", + "policyName": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleDefaultPolicyE5468F0E", "roles": [ { - "Ref": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265" + "Ref": "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F" } ] } @@ -623,11 +623,11 @@ }, "Code": { "id": "Code", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/Code", "children": { "Stage": { "id": "Stage", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code/Stage", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/Code/Stage", "constructInfo": { "fqn": "aws-cdk-lib.AssetStaging", "version": "0.0.0" @@ -635,7 +635,7 @@ }, "AssetBucket": { "id": "AssetBucket", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Code/AssetBucket", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/Code/AssetBucket", "constructInfo": { "fqn": "aws-cdk-lib.aws_s3.BucketBase", "version": "0.0.0" @@ -649,7 +649,7 @@ }, "Resource": { "id": "Resource", - "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C/Resource", + "path": "integ-servicecatalog-two-products/Custom::CDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiB/Resource", "attributes": { "aws:cdk:cloudformation:type": "AWS::Lambda::Function", "aws:cdk:cloudformation:props": { @@ -668,9 +668,10 @@ "Ref": "TestAssetBucketProductAssetsDeploymentAwsCliLayerD1E52C82" } ], + "memorySize": 256, "role": { "Fn::GetAtt": [ - "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756CServiceRole89A01265", + "CustomCDKBucketDeployment8693BB64968944B69AAFB0CC9EB8756C256MiBServiceRoleF991ED9F", "Arn" ] }, diff --git a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.ts b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.ts index 6c4902fcd2073..6e3a7c6952d94 100644 --- a/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.ts +++ b/packages/@aws-cdk-testing/framework-integ/test/aws-servicecatalog/test/integ.two-products.ts @@ -36,6 +36,7 @@ class PortfolioStack extends cdk.Stack { cloudFormationTemplate: servicecatalog.CloudFormationTemplate.fromProductStack( new TestAssetProductStack1(this, 'MyProductStack1', { assetBucket: testAssetBucket, + memoryLimit: 256, }), ), }], diff --git a/packages/aws-cdk-lib/aws-servicecatalog/lib/private/product-stack-synthesizer.ts b/packages/aws-cdk-lib/aws-servicecatalog/lib/private/product-stack-synthesizer.ts index 8ccfce748b4bc..2ddad085b066d 100644 --- a/packages/aws-cdk-lib/aws-servicecatalog/lib/private/product-stack-synthesizer.ts +++ b/packages/aws-cdk-lib/aws-servicecatalog/lib/private/product-stack-synthesizer.ts @@ -31,6 +31,17 @@ export interface ProductStackSynthesizerProps { * @default - No KMS KeyId and SSE_KMS encryption cannot be used */ readonly serverSideEncryptionAwsKmsKeyId? : string; + + /** + * The amount of memory (in MiB) to allocate to the AWS Lambda function which + * replicates the files from the CDK bucket to the destination bucket. + * + * If you are deploying large files, you will need to increase this number + * accordingly. + * + * @default 128 + */ + readonly memoryLimit?: number; } /** @@ -43,6 +54,7 @@ export class ProductStackSynthesizer extends cdk.StackSynthesizer { private readonly assetBucket?: IBucket; private readonly serverSideEncryption? : ServerSideEncryption; private readonly serverSideEncryptionAwsKmsKeyId? : string; + private readonly memoryLimit?: number; private parentAssetBucket?: IBucket; constructor(props: ProductStackSynthesizerProps) { @@ -51,6 +63,7 @@ export class ProductStackSynthesizer extends cdk.StackSynthesizer { this.assetBucket = props.assetBucket; this.serverSideEncryption = props.serverSideEncryption; this.serverSideEncryptionAwsKmsKeyId = props.serverSideEncryptionAwsKmsKeyId; + this.memoryLimit = props.memoryLimit; if (this.assetBucket && !cdk.Resource.isOwnedResource(this.assetBucket)) { cdk.Annotations.of(this.parentStack).addWarningV2('@aws-cdk/aws-servicecatalog:assetsManuallyAddBucketPermissions', '[WARNING] Bucket Policy Permissions cannot be added to' + @@ -90,6 +103,7 @@ export class ProductStackSynthesizer extends cdk.StackSynthesizer { retainOnDelete: true, serverSideEncryption: this.serverSideEncryption, serverSideEncryptionAwsKmsKeyId: this.serverSideEncryptionAwsKmsKeyId, + memoryLimit: this.memoryLimit, }); bucketDeployment.addSource(source); diff --git a/packages/aws-cdk-lib/aws-servicecatalog/lib/product-stack.ts b/packages/aws-cdk-lib/aws-servicecatalog/lib/product-stack.ts index 08db79eea7994..7214cf1a913de 100644 --- a/packages/aws-cdk-lib/aws-servicecatalog/lib/product-stack.ts +++ b/packages/aws-cdk-lib/aws-servicecatalog/lib/product-stack.ts @@ -32,6 +32,17 @@ export interface ProductStackProps { * @default - No KMS KeyId and SSE_KMS encryption cannot be used */ readonly serverSideEncryptionAwsKmsKeyId? : string; + + /** + * The amount of memory (in MiB) to allocate to the AWS Lambda function which + * replicates the files from the CDK bucket to the destination bucket. + * + * If you are deploying large files, you will need to increase this number + * accordingly. + * + * @default 128 + */ + readonly memoryLimit?: number; } /** @@ -58,6 +69,7 @@ export class ProductStack extends cdk.Stack { assetBucket: props.assetBucket, serverSideEncryption: props.serverSideEncryption, serverSideEncryptionAwsKmsKeyId: props.serverSideEncryptionAwsKmsKeyId, + memoryLimit: props.memoryLimit, }), }); diff --git a/packages/aws-cdk-lib/aws-servicecatalog/test/product-stack.test.ts b/packages/aws-cdk-lib/aws-servicecatalog/test/product-stack.test.ts index 956fa49729f56..6cfbe8f26a3da 100644 --- a/packages/aws-cdk-lib/aws-servicecatalog/test/product-stack.test.ts +++ b/packages/aws-cdk-lib/aws-servicecatalog/test/product-stack.test.ts @@ -385,6 +385,35 @@ describe('ProductStack', () => { }); }); + test('BucketDeployment with custom memoryLimit', () => { + // GIVEN + const app = new cdk.App(); + const mainStack = new cdk.Stack(app, 'MyStack'); + const testAssetBucket = new s3.Bucket(mainStack, 'TestAssetBucket', { + bucketName: 'test-asset-bucket', + }); + const productStack = new servicecatalog.ProductStack(mainStack, 'MyProductStack', { + assetBucket: testAssetBucket, + memoryLimit: 256, + }); + + new lambda.Function(productStack, 'HelloHandler', { + runtime: lambda.Runtime.PYTHON_3_9, + code: lambda.Code.fromAsset(path.join(__dirname, 'assets')), + handler: 'index.handler', + }); + + // WHEN + const assembly = app.synth(); + + // THEN + expect(productStack._getAssetBucket()).toBeDefined(); + const mainStackTemplate = JSON.parse(fs.readFileSync(path.join(assembly.directory, mainStack.templateFile), 'utf-8')); + Template.fromJSON(mainStackTemplate).hasResourceProperties('AWS::Lambda::Function', { + MemorySize: 256, + }); + }); + test('Two product stacks with assets in the same portfolio', () => { // GIVEN const app = new cdk.App();