From e074e1c1ad7c84870ef3c6fdd3d5950b3d45ffba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9F=91=A8=F0=9F=8F=BC=E2=80=8D=F0=9F=92=BB=20Romain=20M?= =?UTF-8?q?arcadier-Muller?= Date: Fri, 7 Jun 2019 15:43:49 +0200 Subject: [PATCH] feat(lambda): Expose $LATEST function version Sometimes, one wants to create an `Alias` to the `$LATEST` version of a `Function`, but this requires access to an `IVersion` representing that. This features adds a `latestVersion` property to `IFunction` that offers simple access to `$LATEST`. Prior to this, each user needing to access this would have had to roll theiw own implementation of `IVersion`, which is rather cumbersome. Fixes #2776 --- .../@aws-cdk/aws-lambda/lib/function-base.ts | 24 ++++++++++++++ packages/@aws-cdk/aws-lambda/lib/function.ts | 2 +- .../@aws-cdk/aws-lambda/test/test.alias.ts | 33 +++++++++++++++++++ 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-lambda/lib/function-base.ts b/packages/@aws-cdk/aws-lambda/lib/function-base.ts index d569ff8cc9d26..a2979ae2ffcee 100644 --- a/packages/@aws-cdk/aws-lambda/lib/function-base.ts +++ b/packages/@aws-cdk/aws-lambda/lib/function-base.ts @@ -4,6 +4,7 @@ import iam = require('@aws-cdk/aws-iam'); import { IResource, Resource } from '@aws-cdk/cdk'; import { IEventSource } from './event-source'; import { EventSourceMapping, EventSourceMappingOptions } from './event-source-mapping'; +import { IVersion } from './lambda-version'; import { CfnPermission } from './lambda.generated'; import { Permission } from './permission'; @@ -40,6 +41,11 @@ export interface IFunction extends IResource, ec2.IConnectable, iam.IGrantable { */ readonly isBoundToVpc: boolean; + /** + * The `$LATEST` version of this function. + */ + readonly latestVersion: IVersion; + /** * Adds an event source that maps to this AWS Lambda function. * @param id construct ID @@ -139,6 +145,11 @@ export abstract class FunctionBase extends Resource implements IFunction { */ public abstract readonly role?: iam.IRole; + /** + * The $LATEST version of this function. + */ + public readonly latestVersion: IVersion = new LatestVersion(this); + /** * Whether the addPermission() call adds any permissions * @@ -277,3 +288,16 @@ export abstract class FunctionBase extends Resource implements IFunction { 'Supported: AccountPrincipal, ServicePrincipal'); } } + +/** + * The $LATEST version of a function, useful when attempting to create aliases. + */ +class LatestVersion extends Resource implements IVersion { + public readonly lambda: IFunction; + public readonly version = '$LATEST'; + + constructor(lambda: FunctionBase) { + super(lambda, '$LATEST'); + this.lambda = lambda; + } +} diff --git a/packages/@aws-cdk/aws-lambda/lib/function.ts b/packages/@aws-cdk/aws-lambda/lib/function.ts index e7aa0cee86089..6beb1fb72febe 100644 --- a/packages/@aws-cdk/aws-lambda/lib/function.ts +++ b/packages/@aws-cdk/aws-lambda/lib/function.ts @@ -241,7 +241,7 @@ export class Function extends FunctionBase { /** * Creates a Lambda function object which represents a function not defined - * within this stack. + * within this stwack. * * Lambda.import(this, 'MyImportedFunction', { lambdaArn: new LambdaArn('arn:aws:...') }); * diff --git a/packages/@aws-cdk/aws-lambda/test/test.alias.ts b/packages/@aws-cdk/aws-lambda/test/test.alias.ts index f3208e37f0d39..f4e404308098f 100644 --- a/packages/@aws-cdk/aws-lambda/test/test.alias.ts +++ b/packages/@aws-cdk/aws-lambda/test/test.alias.ts @@ -40,6 +40,39 @@ export = { test.done(); }, + 'can create an alias to $LATEST'(test: Test): void { + const stack = new Stack(); + const fn = new lambda.Function(stack, 'MyLambda', { + code: new lambda.InlineCode('hello()'), + handler: 'index.hello', + runtime: lambda.Runtime.NodeJS810, + }); + + new lambda.Alias(stack, 'Alias', { + aliasName: 'latest', + version: fn.latestVersion, + }); + + expect(stack).to(beASupersetOfTemplate({ + MyLambdaVersion16CDE3C40: { + Type: "AWS::Lambda::Version", + Properties: { + FunctionName: { Ref: "MyLambdaCCE802FB" } + } + }, + Alias325C5727: { + Type: "AWS::Lambda::Alias", + Properties: { + FunctionName: { Ref: "MyLambdaCCE802FB" }, + FunctionVersion: '$LATEST', + Name: "latest" + } + } + })); + + test.done(); + }, + 'can use newVersion to create a new Version'(test: Test) { const stack = new Stack(); const fn = new lambda.Function(stack, 'MyLambda', {