diff --git a/packages/@aws-cdk/aws-logs/lib/log-retention.ts b/packages/@aws-cdk/aws-logs/lib/log-retention.ts index ea2787705879f..5af8edaac96ed 100644 --- a/packages/@aws-cdk/aws-logs/lib/log-retention.ts +++ b/packages/@aws-cdk/aws-logs/lib/log-retention.ts @@ -175,6 +175,8 @@ class LogRetentionFunction extends CoreConstruct implements cdk.ITaggable { }); this.functionArn = resource.getAtt('Arn'); + asset.addResourceMetadata(resource, 'Code'); + // Function dependencies role.node.children.forEach((child) => { if (cdk.CfnResource.isCfnResource(child)) { diff --git a/packages/@aws-cdk/aws-logs/package.json b/packages/@aws-cdk/aws-logs/package.json index 8bd135621dccb..a865bde5c1dae 100644 --- a/packages/@aws-cdk/aws-logs/package.json +++ b/packages/@aws-cdk/aws-logs/package.json @@ -99,6 +99,7 @@ "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-s3-assets": "0.0.0", "@aws-cdk/core": "0.0.0", + "@aws-cdk/cx-api": "0.0.0", "constructs": "^3.3.69" }, "homepage": "https://github.com/aws/aws-cdk", @@ -108,6 +109,7 @@ "@aws-cdk/aws-kms": "0.0.0", "@aws-cdk/aws-s3-assets": "0.0.0", "@aws-cdk/core": "0.0.0", + "@aws-cdk/cx-api": "0.0.0", "constructs": "^3.3.69" }, "engines": { diff --git a/packages/@aws-cdk/aws-logs/test/log-retention.test.ts b/packages/@aws-cdk/aws-logs/test/log-retention.test.ts index 208031bc1744b..af746f956e675 100644 --- a/packages/@aws-cdk/aws-logs/test/log-retention.test.ts +++ b/packages/@aws-cdk/aws-logs/test/log-retention.test.ts @@ -1,7 +1,9 @@ +import * as path from 'path'; import '@aws-cdk/assert-internal/jest'; -import { ABSENT } from '@aws-cdk/assert-internal'; +import { ABSENT, ResourcePart } from '@aws-cdk/assert-internal'; import * as iam from '@aws-cdk/aws-iam'; import * as cdk from '@aws-cdk/core'; +import * as cxapi from '@aws-cdk/cx-api'; import { LogRetention, RetentionDays } from '../lib'; /* eslint-disable quote-props */ @@ -175,4 +177,28 @@ describe('log retention', () => { }); }); + + test('asset metadata added to log retention construct lambda function', () => { + // GIVEN + const stack = new cdk.Stack(); + stack.node.setContext(cxapi.ASSET_RESOURCE_METADATA_ENABLED_CONTEXT, true); + stack.node.setContext(cxapi.DISABLE_ASSET_STAGING_CONTEXT, true); + + const assetLocation = path.join(__dirname, '../', '/lib', '/log-retention-provider'); + + // WHEN + new LogRetention(stack, 'MyLambda', { + logGroupName: 'group', + retention: RetentionDays.ONE_MONTH, + }); + + // Then + expect(stack).toHaveResource('AWS::Lambda::Function', { + Metadata: { + 'aws:asset:path': assetLocation, + 'aws:asset:property': 'Code', + }, + }, ResourcePart.CompleteDefinition); + + }); }); diff --git a/packages/@aws-cdk/core/lib/custom-resource-provider/custom-resource-provider.ts b/packages/@aws-cdk/core/lib/custom-resource-provider/custom-resource-provider.ts index 22bc07f3ef865..013c1f49b8ab8 100644 --- a/packages/@aws-cdk/core/lib/custom-resource-provider/custom-resource-provider.ts +++ b/packages/@aws-cdk/core/lib/custom-resource-provider/custom-resource-provider.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; +import * as cxapi from '@aws-cdk/cx-api'; import { Construct } from 'constructs'; import { AssetStaging } from '../asset-staging'; import { FileAssetPackaging } from '../assets'; @@ -189,8 +190,10 @@ export class CustomResourceProvider extends CoreConstruct { sourcePath: props.codeDirectory, }); + const assetFileName = staging.relativeStagedPath(stack); + const asset = stack.synthesizer.addFileAsset({ - fileName: staging.relativeStagedPath(stack), + fileName: assetFileName, sourceHash: staging.assetHash, packaging: FileAssetPackaging.ZIP_DIRECTORY, }); @@ -242,6 +245,11 @@ export class CustomResourceProvider extends CoreConstruct { handler.addDependsOn(role); + if (this.node.tryGetContext(cxapi.ASSET_RESOURCE_METADATA_ENABLED_CONTEXT)) { + handler.addMetadata(cxapi.ASSET_RESOURCE_METADATA_PATH_KEY, assetFileName); + handler.addMetadata(cxapi.ASSET_RESOURCE_METADATA_PROPERTY_KEY, 'Code'); + } + this.serviceToken = Token.asString(handler.getAtt('Arn')); } diff --git a/packages/@aws-cdk/core/test/custom-resource-provider/custom-resource-provider.test.ts b/packages/@aws-cdk/core/test/custom-resource-provider/custom-resource-provider.test.ts index b038c1d831e23..ecda2d2741c5d 100644 --- a/packages/@aws-cdk/core/test/custom-resource-provider/custom-resource-provider.test.ts +++ b/packages/@aws-cdk/core/test/custom-resource-provider/custom-resource-provider.test.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; +import * as cxapi from '@aws-cdk/cx-api'; import { App, AssetStaging, CustomResourceProvider, CustomResourceProviderRuntime, DockerImageAssetLocation, DockerImageAssetSource, Duration, FileAssetLocation, FileAssetSource, ISynthesisSession, Size, Stack } from '../../lib'; import { toCloudFormation } from '../util'; @@ -122,6 +123,28 @@ describe('custom resource provider', () => { }); + test('asset metadata added to custom resource that contains code definition', () => { + // GIVEN + const stack = new Stack(); + stack.node.setContext(cxapi.ASSET_RESOURCE_METADATA_ENABLED_CONTEXT, true); + stack.node.setContext(cxapi.DISABLE_ASSET_STAGING_CONTEXT, true); + + // WHEN + CustomResourceProvider.getOrCreate(stack, 'Custom:MyResourceType', { + codeDirectory: TEST_HANDLER, + runtime: CustomResourceProviderRuntime.NODEJS_12_X, + }); + + // Then + const lambda = toCloudFormation(stack).Resources.CustomMyResourceTypeCustomResourceProviderHandler29FBDD2A; + expect(lambda).toHaveProperty('Metadata'); + expect(lambda.Metadata).toEqual({ + 'aws:asset:path': `${__dirname}/mock-provider`, + 'aws:asset:property': 'Code', + }); + + }); + test('custom resource provided creates asset in new-style synthesis with relative path', () => { // GIVEN