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/test/test.alias.ts b/packages/@aws-cdk/aws-lambda/test/test.alias.ts index 0df0eca7c6689..2ffac353d2b20 100644 --- a/packages/@aws-cdk/aws-lambda/test/test.alias.ts +++ b/packages/@aws-cdk/aws-lambda/test/test.alias.ts @@ -40,6 +40,29 @@ 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(haveResource('AWS::Lambda::Alias', { + FunctionName: { Ref: "MyLambdaCCE802FB" }, + FunctionVersion: '$LATEST', + Name: 'latest', + })); + expect(stack).notTo(haveResource('AWS::Lambda::Version')); + + test.done(); + }, + 'can use newVersion to create a new Version'(test: Test) { const stack = new Stack(); const fn = new lambda.Function(stack, 'MyLambda', {