diff --git a/packages/@aws-cdk/aws-apigateway/test/integ.restapi.books.expected.json b/packages/@aws-cdk/aws-apigateway/test/integ.restapi.books.expected.json index 74e92fce8436e..0baf839a608ca 100644 --- a/packages/@aws-cdk/aws-apigateway/test/integ.restapi.books.expected.json +++ b/packages/@aws-cdk/aws-apigateway/test/integ.restapi.books.expected.json @@ -65,7 +65,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BooksHandler3EB83358" + "Fn::GetAtt": [ + "BooksHandler3EB83358", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -103,7 +106,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BooksHandler3EB83358" + "Fn::GetAtt": [ + "BooksHandler3EB83358", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -137,7 +143,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BooksHandler3EB83358" + "Fn::GetAtt": [ + "BooksHandler3EB83358", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -175,7 +184,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BooksHandler3EB83358" + "Fn::GetAtt": [ + "BooksHandler3EB83358", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -269,7 +281,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BookHandlerF9638A7A" + "Fn::GetAtt": [ + "BookHandlerF9638A7A", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -307,7 +322,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BookHandlerF9638A7A" + "Fn::GetAtt": [ + "BookHandlerF9638A7A", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -341,7 +359,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BookHandlerF9638A7A" + "Fn::GetAtt": [ + "BookHandlerF9638A7A", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -379,7 +400,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "BookHandlerF9638A7A" + "Fn::GetAtt": [ + "BookHandlerF9638A7A", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -473,7 +497,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "Hello4A628BD4" + "Fn::GetAtt": [ + "Hello4A628BD4", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -511,7 +538,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "Hello4A628BD4" + "Fn::GetAtt": [ + "Hello4A628BD4", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -890,4 +920,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-apigateway/test/integ.restapi.expected.json b/packages/@aws-cdk/aws-apigateway/test/integ.restapi.expected.json index f00374b4201ea..c46e8005d766f 100644 --- a/packages/@aws-cdk/aws-apigateway/test/integ.restapi.expected.json +++ b/packages/@aws-cdk/aws-apigateway/test/integ.restapi.expected.json @@ -395,7 +395,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyHandler6B74D312" + "Fn::GetAtt": [ + "MyHandler6B74D312", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -433,7 +436,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyHandler6B74D312" + "Fn::GetAtt": [ + "MyHandler6B74D312", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -467,7 +473,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyHandler6B74D312" + "Fn::GetAtt": [ + "MyHandler6B74D312", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -505,7 +514,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyHandler6B74D312" + "Fn::GetAtt": [ + "MyHandler6B74D312", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -539,7 +551,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyHandler6B74D312" + "Fn::GetAtt": [ + "MyHandler6B74D312", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -577,7 +592,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyHandler6B74D312" + "Fn::GetAtt": [ + "MyHandler6B74D312", + "Arn" + ] }, "Principal": "apigateway.amazonaws.com", "SourceArn": { @@ -635,4 +653,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-apigateway/test/test.lambda-api.ts b/packages/@aws-cdk/aws-apigateway/test/test.lambda-api.ts index 723718c4f8720..5a16869d06149 100644 --- a/packages/@aws-cdk/aws-apigateway/test/test.lambda-api.ts +++ b/packages/@aws-cdk/aws-apigateway/test/test.lambda-api.ts @@ -126,12 +126,9 @@ export = { }, ":lambda:path/2015-03-31/functions/", { - "Fn::GetAtt": [ - "handlerE1533BD5", - "Arn" - ] + "Ref": "alias68BF17F5" }, - ":my-alias/invocations" + "/invocations" ] ] } diff --git a/packages/@aws-cdk/aws-codedeploy/test/lambda/integ.deployment-group.expected.json b/packages/@aws-cdk/aws-codedeploy/test/lambda/integ.deployment-group.expected.json index fa1ff2aba0ce3..6b6a4f5473809 100644 --- a/packages/@aws-cdk/aws-codedeploy/test/lambda/integ.deployment-group.expected.json +++ b/packages/@aws-cdk/aws-codedeploy/test/lambda/integ.deployment-group.expected.json @@ -430,18 +430,13 @@ { "Name": "FunctionName", "Value": { - "Fn::Join": [ - "", - [ - { - "Fn::GetAtt": [ - "Handler886CB40B", - "Arn" - ] - }, - ":alias" - ] - ] + "Ref": "Handler886CB40B" + } + }, + { + "Name": "Resource", + "Value": { + "Ref": "Alias325C5727" } } ], @@ -590,4 +585,4 @@ "Description": "S3 key for asset version \"aws-cdk-codedeploy-lambda/PostHook/Code\"" } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-cognito/test/test.user-pool.ts b/packages/@aws-cdk/aws-cognito/test/test.user-pool.ts index bfae0eb1513e1..11c92b4669180 100644 --- a/packages/@aws-cdk/aws-cognito/test/test.user-pool.ts +++ b/packages/@aws-cdk/aws-cognito/test/test.user-pool.ts @@ -105,7 +105,7 @@ export = { // THEN expect(stack).to(haveResourceLike('AWS::Lambda::Permission', { - FunctionName: fn.node.resolve(fn.functionName), + FunctionName: fn.node.resolve(fn.functionArn), Principal: 'cognito-idp.amazonaws.com' })); diff --git a/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.expected.json b/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.expected.json index 8d1363d1343ab..747bf88fc32ac 100644 --- a/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.expected.json +++ b/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.expected.json @@ -490,7 +490,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E" + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { @@ -1160,4 +1163,4 @@ "Description": "S3 key for asset version \"aws-ecs-integ-ecs/AdoptEcrRepositorydbc60defc59544bcaa5c28c95d68f62c/Code\"" } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.ts b/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.ts index 3b098d1a196f3..3b6844b81c1fb 100644 --- a/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.ts +++ b/packages/@aws-cdk/aws-ecs/test/ec2/integ.event-task.lit.ts @@ -3,6 +3,8 @@ import events = require('@aws-cdk/aws-events'); import cdk = require('@aws-cdk/cdk'); import ecs = require('../../lib'); +import path = require('path'); + const app = new cdk.App(); class EventStack extends cdk.Stack { @@ -20,7 +22,9 @@ class EventStack extends cdk.Stack { // Create a Task Definition for the container to start const taskDefinition = new ecs.Ec2TaskDefinition(this, 'TaskDef'); taskDefinition.addContainer('TheContainer', { - image: ecs.ContainerImage.fromAsset(this, 'EventImage', { directory: 'eventhandler-image' }), + image: ecs.ContainerImage.fromAsset(this, 'EventImage', { + directory: path.resolve(__dirname, '..', 'eventhandler-image') + }), memoryLimitMiB: 256, logging: new ecs.AwsLogDriver(this, 'TaskLogging', { streamPrefix: 'EventDemo' }) }); diff --git a/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-awsvpc-nw.expected.json b/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-awsvpc-nw.expected.json index 4836aa89c2bca..82c328b78a8a5 100644 --- a/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-awsvpc-nw.expected.json +++ b/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-awsvpc-nw.expected.json @@ -646,7 +646,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E" + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { diff --git a/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-bridge-nw.expected.json b/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-bridge-nw.expected.json index 28fc6b69b6471..52835ec597619 100644 --- a/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-bridge-nw.expected.json +++ b/packages/@aws-cdk/aws-ecs/test/ec2/integ.lb-bridge-nw.expected.json @@ -667,7 +667,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E" + "Fn::GetAtt": [ + "EcsClusterDefaultAutoScalingGroupDrainECSHookFunctionE17A5F5E", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { diff --git a/packages/@aws-cdk/aws-lambda-event-sources/test/integ.s3.expected.json b/packages/@aws-cdk/aws-lambda-event-sources/test/integ.s3.expected.json index 3f9d5ad835291..615e8c3652d8a 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/test/integ.s3.expected.json +++ b/packages/@aws-cdk/aws-lambda-event-sources/test/integ.s3.expected.json @@ -65,7 +65,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "FC4345940" + "Fn::GetAtt": [ + "FC4345940", + "Arn" + ] }, "Principal": "s3.amazonaws.com", "SourceAccount": { @@ -205,4 +208,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sns.expected.json b/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sns.expected.json index ccb9bb05bb9af..6a50e98575458 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sns.expected.json +++ b/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sns.expected.json @@ -80,7 +80,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "FC4345940" + "Fn::GetAtt": [ + "FC4345940", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { @@ -92,4 +95,4 @@ "Type": "AWS::SNS::Topic" } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sqs.expected.json b/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sqs.expected.json index 4ae6c580fe0e9..53cbc327dc4ad 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sqs.expected.json +++ b/packages/@aws-cdk/aws-lambda-event-sources/test/integ.sqs.expected.json @@ -114,4 +114,4 @@ "Type": "AWS::SQS::Queue" } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts b/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts index bb9f5c1f11a4d..bcac2b353c278 100644 --- a/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts +++ b/packages/@aws-cdk/aws-lambda-event-sources/test/test.sns.ts @@ -21,7 +21,10 @@ export = { expect(stack).to(haveResource('AWS::Lambda::Permission', { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "Fn9270CBC0" + "Fn::GetAtt": [ + "Fn9270CBC0", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { diff --git a/packages/@aws-cdk/aws-lambda/lib/alias.ts b/packages/@aws-cdk/aws-lambda/lib/alias.ts index 4fec3458a5f07..98fa53ed58c02 100644 --- a/packages/@aws-cdk/aws-lambda/lib/alias.ts +++ b/packages/@aws-cdk/aws-lambda/lib/alias.ts @@ -1,9 +1,8 @@ -import iam = require('@aws-cdk/aws-iam'); +import cloudwatch = require('@aws-cdk/aws-cloudwatch'); import cdk = require('@aws-cdk/cdk'); import { FunctionBase, FunctionImportProps, IFunction } from './function-base'; import { Version } from './lambda-version'; import { CfnAlias } from './lambda.generated'; -import { Permission } from './permission'; /** * Properties for a new Lambda alias @@ -68,12 +67,7 @@ export class Alias extends FunctionBase { */ public readonly functionArn: string; - /** - * Role associated with this alias - */ - public readonly role?: iam.IRole | undefined; - - protected readonly canCreatePermissions: boolean = true; // Not used anyway + protected readonly canCreatePermissions: boolean = true; /** * The actual Lambda function object that this Alias is pointing to @@ -84,9 +78,8 @@ export class Alias extends FunctionBase { super(scope, id); this.underlyingLambda = props.version.lambda; - this.role = this.underlyingLambda.role; - new CfnAlias(this, 'Resource', { + const alias = new CfnAlias(this, 'Resource', { name: props.aliasName, description: props.description, functionName: this.underlyingLambda.functionName, @@ -94,10 +87,29 @@ export class Alias extends FunctionBase { routingConfig: this.determineRoutingConfig(props) }); - // Not actually the name, but an ARN can be used in all places - // where the name is expected, and an ARN can refer to an Alias. - this.functionName = `${props.version.lambda.functionArn}:${props.aliasName}`; - this.functionArn = `${props.version.lambda.functionArn}:${props.aliasName}`; + // ARN parsing splits on `:`, so we can only get the function's name from the ARN as resourceName... + // And we're parsing it out (instead of using the underlying function directly) in order to have use of it incur + // an implicit dependency on the resource. + this.functionName = `${this.node.stack.parseArn(alias.aliasArn, ":").resourceName!}:${props.aliasName}`; + this.functionArn = alias.aliasArn; + } + + /** + * Role associated with this alias + */ + public get role() { + return this.underlyingLambda.role; + } + + public metric(metricName: string, props: cloudwatch.MetricCustomization = {}): cloudwatch.Metric { + // Metrics on Aliases need the "bare" function name, and the alias' ARN, this differes from the base behavior. + return super.metric(metricName, { + dimensions: { + FunctionName: this.underlyingLambda.functionName, + Resource: this.functionArn + }, + ...props + }); } public export(): FunctionImportProps { @@ -106,11 +118,6 @@ export class Alias extends FunctionBase { }; } - public addPermission(name: string, permission: Permission) { - // Forward addPermission() to the underlying Lambda object - this.underlyingLambda.addPermission(name, permission); - } - /** * Calculate the routingConfig parameter from the input props */ diff --git a/packages/@aws-cdk/aws-lambda/lib/function-base.ts b/packages/@aws-cdk/aws-lambda/lib/function-base.ts index fecfcd7b49f11..dae6addfab995 100644 --- a/packages/@aws-cdk/aws-lambda/lib/function-base.ts +++ b/packages/@aws-cdk/aws-lambda/lib/function-base.ts @@ -176,7 +176,7 @@ export abstract class FunctionBase extends cdk.Construct implements IFunction { new CfnPermission(this, id, { action, principal, - functionName: this.functionName, + functionName: this.functionArn, eventSourceToken: permission.eventSourceToken, sourceAccount: permission.sourceAccount, sourceArn: permission.sourceArn, diff --git a/packages/@aws-cdk/aws-lambda/test/integ.bucket-notifications.expected.json b/packages/@aws-cdk/aws-lambda/test/integ.bucket-notifications.expected.json index e82d57546a874..738b14605a43c 100644 --- a/packages/@aws-cdk/aws-lambda/test/integ.bucket-notifications.expected.json +++ b/packages/@aws-cdk/aws-lambda/test/integ.bucket-notifications.expected.json @@ -110,7 +110,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyFunction3BAA72D1" + "Fn::GetAtt": [ + "MyFunction3BAA72D1", + "Arn" + ] }, "Principal": "s3.amazonaws.com", "SourceAccount": { @@ -129,7 +132,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyFunction3BAA72D1" + "Fn::GetAtt": [ + "MyFunction3BAA72D1", + "Arn" + ] }, "Principal": "s3.amazonaws.com", "SourceAccount": { diff --git a/packages/@aws-cdk/aws-lambda/test/integ.events.expected.json b/packages/@aws-cdk/aws-lambda/test/integ.events.expected.json index e68a46f29a6d5..f71081e3ff084 100644 --- a/packages/@aws-cdk/aws-lambda/test/integ.events.expected.json +++ b/packages/@aws-cdk/aws-lambda/test/integ.events.expected.json @@ -65,7 +65,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyFunc8A243A2C" + "Fn::GetAtt": [ + "MyFunc8A243A2C", + "Arn" + ] }, "Principal": "events.amazonaws.com", "SourceArn": { @@ -81,7 +84,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyFunc8A243A2C" + "Fn::GetAtt": [ + "MyFunc8A243A2C", + "Arn" + ] }, "Principal": "events.amazonaws.com", "SourceArn": { diff --git a/packages/@aws-cdk/aws-lambda/test/integ.lambda.expected.json b/packages/@aws-cdk/aws-lambda/test/integ.lambda.expected.json index 2a80228e6fd81..eac87632a5aa2 100644 --- a/packages/@aws-cdk/aws-lambda/test/integ.lambda.expected.json +++ b/packages/@aws-cdk/aws-lambda/test/integ.lambda.expected.json @@ -104,6 +104,16 @@ }, "Name": "prod" } + }, + "AliasAliasPermissionAF30F9E8": { + "Type": "AWS::Lambda::Permission", + "Properties": { + "Action": "lambda:InvokeFunction", + "FunctionName": { + "Ref": "Alias325C5727" + }, + "Principal": "cloudformation.amazonaws.com" + } } } } \ No newline at end of file diff --git a/packages/@aws-cdk/aws-lambda/test/integ.lambda.ts b/packages/@aws-cdk/aws-lambda/test/integ.lambda.ts index 4f1630042bea8..e76b4f90121a8 100644 --- a/packages/@aws-cdk/aws-lambda/test/integ.lambda.ts +++ b/packages/@aws-cdk/aws-lambda/test/integ.lambda.ts @@ -16,9 +16,12 @@ fn.addToRolePolicy(new iam.PolicyStatement().addAllResources().addAction('*')); const version = fn.addVersion('1'); -new lambda.Alias(stack, 'Alias', { +const alias = new lambda.Alias(stack, 'Alias', { aliasName: 'prod', version, }); +alias.addPermission('AliasPermission', { + principal: new iam.ServicePrincipal('cloudformation.amazonaws.com') +}); app.run(); diff --git a/packages/@aws-cdk/aws-lambda/test/test.alias.ts b/packages/@aws-cdk/aws-lambda/test/test.alias.ts index 7ff54f0a80c59..a41a075dfaf3a 100644 --- a/packages/@aws-cdk/aws-lambda/test/test.alias.ts +++ b/packages/@aws-cdk/aws-lambda/test/test.alias.ts @@ -1,5 +1,6 @@ +import cloudwatch = require('@aws-cdk/aws-cloudwatch'); + import { beASupersetOfTemplate, expect, haveResource } from '@aws-cdk/assert'; -import { AccountPrincipal, PolicyStatement } from '@aws-cdk/aws-iam'; import { Stack } from '@aws-cdk/cdk'; import { Test } from 'nodeunit'; import lambda = require('../lib'); @@ -103,7 +104,7 @@ export = { test.done(); }, - 'addPermission() on alias forward to real Lambda'(test: Test) { + 'metric adds Resource: aliasArn to dimensions'(test: Test) { const stack = new Stack(); // GIVEN @@ -117,14 +118,26 @@ export = { const alias = new lambda.Alias(stack, 'Alias', { aliasName: 'prod', version }); // WHEN - alias.addPermission('Perm', { - principal: new AccountPrincipal('123456') + new cloudwatch.Alarm(stack, 'Alarm', { + metric: alias.metric('Test'), + alarmName: 'Test', + threshold: 1, + evaluationPeriods: 1 }); // THEN - expect(stack).to(haveResource('AWS::Lambda::Permission', { - FunctionName: stack.node.resolve(fn.functionName), - Principal: "123456" + expect(stack).to(haveResource('AWS::CloudWatch::Alarm', { + Dimensions: [{ + Name: "FunctionName", + Value: { + Ref: "MyLambdaCCE802FB" + } + }, { + Name: "Resource", + Value: { + Ref: "Alias325C5727" + } + }] })); test.done(); @@ -149,7 +162,7 @@ export = { test.done(); }, - 'addToRolePolicy on alias forwards to real Lambda'(test: Test) { + 'functionName is derived from the aliasArn so that dependencies are sound'(test: Test) { const stack = new Stack(); // GIVEN @@ -163,26 +176,27 @@ export = { const alias = new lambda.Alias(stack, 'Alias', { aliasName: 'prod', version }); // WHEN - alias.addToRolePolicy(new PolicyStatement() - .addAction('s3:GetObject') - .addAllResources()); - test.equals(alias.role, fn.role); - - // THEN - expect(stack).to(haveResource('AWS::IAM::Policy', { - PolicyDocument: { - Statement: [{ - Action: "s3:GetObject", - Effect: "Allow", - Resource: "*" - }], - Version: "2012-10-17" - }, - PolicyName: "MyLambdaServiceRoleDefaultPolicy5BBC6F68", - Roles: [{ - Ref: "MyLambdaServiceRole4539ECB6" - }] - })); + test.deepEqual(stack.node.resolve(alias.functionName), { + "Fn::Join": [ + "", + [ + { + "Fn::Select": [ + 6, + { + "Fn::Split": [ + ":", + { + Ref: "Alias325C5727" + } + ] + } + ] + }, + ":prod" + ] + ] + }); test.done(); } diff --git a/packages/@aws-cdk/aws-lambda/test/test.lambda.ts b/packages/@aws-cdk/aws-lambda/test/test.lambda.ts index b24c2b0d81844..6b2fb74abfc24 100644 --- a/packages/@aws-cdk/aws-lambda/test/test.lambda.ts +++ b/packages/@aws-cdk/aws-lambda/test/test.lambda.ts @@ -153,8 +153,8 @@ export = { "Handler": "bar", "Role": { "Fn::GetAtt": [ - "MyLambdaServiceRole4539ECB6", - "Arn" + "MyLambdaServiceRole4539ECB6", + "Arn" ] }, "Runtime": "python2.7" @@ -168,7 +168,10 @@ export = { "Properties": { "Action": "lambda:*", "FunctionName": { - "Ref": "MyLambdaCCE802FB" + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] }, "Principal": "s3.amazonaws.com", "SourceAccount": { @@ -269,14 +272,24 @@ export = { expect(stack).to(haveResource('AWS::Lambda::Permission', { "Action": "lambda:InvokeFunction", - "FunctionName": { "Ref": lambdaId }, + "FunctionName": { + "Fn::GetAtt": [ + lambdaId, + "Arn" + ] + }, "Principal": "events.amazonaws.com", "SourceArn": { "Fn::GetAtt": [ "Rule4C995B7F", "Arn" ] } })); expect(stack).to(haveResource('AWS::Lambda::Permission', { "Action": "lambda:InvokeFunction", - "FunctionName": { "Ref": "MyLambdaCCE802FB" }, + "FunctionName": { + "Fn::GetAtt": [ + lambdaId, + "Arn" + ] + }, "Principal": "events.amazonaws.com", "SourceArn": { "Fn::GetAtt": [ "Rule270732244", "Arn" ] } })); diff --git a/packages/@aws-cdk/aws-lambda/test/test.subscriptiondestination.ts b/packages/@aws-cdk/aws-lambda/test/test.subscriptiondestination.ts index b9e5065858a22..f07817c5c22c1 100644 --- a/packages/@aws-cdk/aws-lambda/test/test.subscriptiondestination.ts +++ b/packages/@aws-cdk/aws-lambda/test/test.subscriptiondestination.ts @@ -30,7 +30,12 @@ export = { // THEN: Lambda has permissions to be invoked by CWL expect(stack).to(haveResource('AWS::Lambda::Permission', { Action: "lambda:InvokeFunction", - FunctionName: { Ref: "MyLambdaCCE802FB" }, + FunctionName: { + "Fn::GetAtt": [ + "MyLambdaCCE802FB", + "Arn" + ] + }, Principal: { "Fn::Join": ["", ["logs.", {Ref: "AWS::Region"}, ".amazonaws.com"]] } })); diff --git a/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json b/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json index e74ddbee8d0b3..24acd6873532f 100644 --- a/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json +++ b/packages/@aws-cdk/aws-ses/test/integ.receipt.expected.json @@ -68,7 +68,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "Function76856677" + "Fn::GetAtt": [ + "Function76856677", + "Arn" + ] }, "Principal": "ses.amazonaws.com", "SourceAccount": { @@ -405,7 +408,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "SingletonLambda224e77f9a32e4b4dac32983477abba164533EA15" + "Fn::GetAtt": [ + "SingletonLambda224e77f9a32e4b4dac32983477abba164533EA15", + "Arn" + ] }, "Principal": "ses.amazonaws.com", "SourceAccount": { @@ -436,4 +442,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts b/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts index 4ac0e349169cb..0d92ac3a8420f 100644 --- a/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts +++ b/packages/@aws-cdk/aws-ses/test/test.receipt-rule-action.ts @@ -179,7 +179,10 @@ export = { expect(stack).to(haveResource('AWS::Lambda::Permission', { Action: 'lambda:InvokeFunction', FunctionName: { - Ref: 'Function76856677' + 'Fn::GetAtt': [ + 'Function76856677', + 'Arn' + ] }, Principal: 'ses.amazonaws.com', SourceAccount: { diff --git a/packages/@aws-cdk/aws-sns/test/integ.sns-lambda.expected.json b/packages/@aws-cdk/aws-sns/test/integ.sns-lambda.expected.json index 7381f64431f7b..62614184e66a6 100644 --- a/packages/@aws-cdk/aws-sns/test/integ.sns-lambda.expected.json +++ b/packages/@aws-cdk/aws-sns/test/integ.sns-lambda.expected.json @@ -83,7 +83,10 @@ "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "Echo11F3FB29" + "Fn::GetAtt": [ + "Echo11F3FB29", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { @@ -92,4 +95,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-sns/test/integ.sns.expected.json b/packages/@aws-cdk/aws-sns/test/integ.sns.expected.json index 1b962de49eed7..8e5512e49281d 100644 --- a/packages/@aws-cdk/aws-sns/test/integ.sns.expected.json +++ b/packages/@aws-cdk/aws-sns/test/integ.sns.expected.json @@ -8,4 +8,4 @@ } } } -} \ No newline at end of file +} diff --git a/packages/@aws-cdk/aws-sns/test/test.sns.ts b/packages/@aws-cdk/aws-sns/test/test.sns.ts index e5af097c571b0..4a952522f73c4 100644 --- a/packages/@aws-cdk/aws-sns/test/test.sns.ts +++ b/packages/@aws-cdk/aws-sns/test/test.sns.ts @@ -355,7 +355,10 @@ export = { "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyFunc8A243A2C" + "Fn::GetAtt": [ + "MyFunc8A243A2C", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { @@ -554,7 +557,10 @@ export = { "Properties": { "Action": "lambda:InvokeFunction", "FunctionName": { - "Ref": "MyFunc8A243A2C" + "Fn::GetAtt": [ + "MyFunc8A243A2C", + "Arn" + ] }, "Principal": "sns.amazonaws.com", "SourceArn": { diff --git a/packages/decdk/test/__snapshots__/synth.test.js.snap b/packages/decdk/test/__snapshots__/synth.test.js.snap index e333c1430fc61..833645b3f00d0 100644 --- a/packages/decdk/test/__snapshots__/synth.test.js.snap +++ b/packages/decdk/test/__snapshots__/synth.test.js.snap @@ -142,7 +142,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloLambda3D9C82D6", + "Fn::GetAtt": Array [ + "HelloLambda3D9C82D6", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -180,7 +183,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloLambda3D9C82D6", + "Fn::GetAtt": Array [ + "HelloLambda3D9C82D6", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -218,7 +224,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloLambda3D9C82D6", + "Fn::GetAtt": Array [ + "HelloLambda3D9C82D6", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -256,7 +265,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloLambda3D9C82D6", + "Fn::GetAtt": Array [ + "HelloLambda3D9C82D6", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -290,7 +302,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloLambda3D9C82D6", + "Fn::GetAtt": Array [ + "HelloLambda3D9C82D6", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -324,7 +339,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloLambda3D9C82D6", + "Fn::GetAtt": Array [ + "HelloLambda3D9C82D6", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -1132,7 +1150,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloWorldFunctionB2AB6E79", + "Fn::GetAtt": Array [ + "HelloWorldFunctionB2AB6E79", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -1170,7 +1191,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloWorldFunctionB2AB6E79", + "Fn::GetAtt": Array [ + "HelloWorldFunctionB2AB6E79", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -1208,7 +1232,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloWorldFunctionB2AB6E79", + "Fn::GetAtt": Array [ + "HelloWorldFunctionB2AB6E79", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -1242,7 +1269,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloWorldFunctionB2AB6E79", + "Fn::GetAtt": Array [ + "HelloWorldFunctionB2AB6E79", + "Arn", + ], }, "Principal": "apigateway.amazonaws.com", "SourceArn": Object { @@ -1352,7 +1382,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "HelloWorldFunctionB2AB6E79", + "Fn::GetAtt": Array [ + "HelloWorldFunctionB2AB6E79", + "Arn", + ], }, "Principal": "sns.amazonaws.com", "SourceArn": Object { @@ -1595,7 +1628,10 @@ Object { "Properties": Object { "Action": "lambda:InvokeFunction", "FunctionName": Object { - "Ref": "LambdaD247545B", + "Fn::GetAtt": Array [ + "LambdaD247545B", + "Arn", + ], }, "Principal": "sns.amazonaws.com", "SourceArn": Object {