Skip to content

Commit

Permalink
fix: Fix function references when represented by alias (#11788)
Browse files Browse the repository at this point in the history
  • Loading branch information
rnielsen committed Mar 14, 2023
1 parent 6426589 commit 16dd286
Show file tree
Hide file tree
Showing 35 changed files with 499 additions and 121 deletions.
14 changes: 9 additions & 5 deletions lib/plugins/aws/package/compile/events/activemq.js
@@ -1,5 +1,8 @@
'use strict';

const resolveLambdaTarget = require('../../../utils/resolve-lambda-target');
const _ = require('lodash');

class AwsCompileActiveMQEvents {
constructor(serverless) {
this.serverless = serverless;
Expand Down Expand Up @@ -106,16 +109,17 @@ class AwsCompileActiveMQEvents {
functionName,
queue
);
const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(functionName);
const dependsOn = this.provider.resolveFunctionIamRoleResourceName(functionObj) || [];

const dependsOn = [
this.provider.resolveFunctionIamRoleResourceName(functionObj),
_.get(functionObj.targetAlias, 'logicalId'),
].filter(Boolean);

const mqResource = {
Type: 'AWS::Lambda::EventSourceMapping',
DependsOn: dependsOn,
Properties: {
FunctionName: {
'Fn::GetAtt': [lambdaLogicalId, 'Arn'],
},
FunctionName: resolveLambdaTarget(functionName, functionObj),
EventSourceArn: arn,
Queues: [queue],
SourceAccessConfigurations: [
Expand Down
@@ -1,6 +1,7 @@
'use strict';

const resolveLambdaTarget = require('../../../../../utils/resolve-lambda-target');
const _ = require('lodash');

const healthCheckDefaults = {
HealthCheckEnabled: false,
Expand Down Expand Up @@ -83,7 +84,10 @@ module.exports = {
},
],
},
DependsOn: [registerTargetPermissionLogicalId],
DependsOn: [
registerTargetPermissionLogicalId,
_.get(functionObj.targetAlias, 'logicalId'),
].filter(Boolean),
};
Object.assign(TargetGroup.Properties, healthCheckProperties);
Object.assign(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, {
Expand Down
8 changes: 3 additions & 5 deletions lib/plugins/aws/package/compile/events/alexa-skill.js
@@ -1,6 +1,7 @@
'use strict';

const _ = require('lodash');
const resolveLambdaTarget = require('../../../utils/resolve-lambda-target');

class AwsCompileAlexaSkillEvents {
constructor(serverless) {
Expand Down Expand Up @@ -58,14 +59,11 @@ class AwsCompileAlexaSkillEvents {
}
alexaSkillNumberInFunction++;

const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(functionName);

const permissionTemplate = {
Type: 'AWS::Lambda::Permission',
DependsOn: _.get(functionObj.targetAlias, 'logicalId'),
Properties: {
FunctionName: {
'Fn::GetAtt': [lambdaLogicalId, 'Arn'],
},
FunctionName: resolveLambdaTarget(functionName, functionObj),
Action: enabled ? 'lambda:InvokeFunction' : 'lambda:DisableInvokeFunction',
Principal: 'alexa-appkit.amazon.com',
},
Expand Down
7 changes: 3 additions & 4 deletions lib/plugins/aws/package/compile/events/alexa-smart-home.js
@@ -1,6 +1,7 @@
'use strict';

const _ = require('lodash');
const resolveLambdaTarget = require('../../../utils/resolve-lambda-target');

class AwsCompileAlexaSmartHomeEvents {
constructor(serverless) {
Expand Down Expand Up @@ -49,14 +50,12 @@ class AwsCompileAlexaSmartHomeEvents {
EventSourceToken = event.alexaSmartHome;
Action = 'lambda:InvokeFunction';
}
const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(functionName);

const permissionTemplate = {
Type: 'AWS::Lambda::Permission',
DependsOn: _.get(functionObj.targetAlias, 'logicalId'),
Properties: {
FunctionName: {
'Fn::GetAtt': [lambdaLogicalId, 'Arn'],
},
FunctionName: resolveLambdaTarget(functionName, functionObj),
Action: Action.replace(/\\n|\\r/g, ''),
Principal: 'alexa-connectedhome.amazon.com',
EventSourceToken: EventSourceToken.replace(/\\n|\\r/g, ''),
Expand Down
Expand Up @@ -51,6 +51,7 @@ module.exports = {
_.merge(this.serverless.service.provider.compiledCloudFormationTemplate.Resources, {
[authorizerLogicalId]: {
Type: 'AWS::ApiGateway::Authorizer',
DependsOn: authorizer.logicalId,
Properties: authorizerProperties,
},
});
Expand Down
Expand Up @@ -57,7 +57,7 @@ module.exports = {
AuthorizationType: authorizationType,
AuthorizerId: { Ref: authorizerLogicalId },
},
DependsOn: authorizerLogicalId,
DependsOn: [authorizerLogicalId],
};
if (http.authorizer.scopes && http.authorizer.scopes.length) {
cognitoReturn.Properties.AuthorizationScopes = http.authorizer.scopes;
Expand All @@ -70,7 +70,7 @@ module.exports = {
AuthorizationType: authorizationType,
AuthorizerId: { Ref: authorizerLogicalId },
},
DependsOn: authorizerLogicalId,
DependsOn: [authorizerLogicalId],
};
}

Expand Down
Expand Up @@ -61,6 +61,10 @@ module.exports = {
};
this.permissionMapping.push(singlePermissionMapping);

if (lambdaAliasLogicalId) {
template.DependsOn.push(lambdaAliasLogicalId);
}

_.merge(
template,
this.getMethodAuthorization(event.http),
Expand Down
10 changes: 7 additions & 3 deletions lib/plugins/aws/package/compile/events/cloud-watch-event.js
Expand Up @@ -2,6 +2,7 @@

const _ = require('lodash');
const ServerlessError = require('../../../../../serverless-error');
const resolveLambdaTarget = require('../../../utils/resolve-lambda-target');

class AwsCompileCloudWatchEventEvents {
constructor(serverless) {
Expand Down Expand Up @@ -86,7 +87,6 @@ class AwsCompileCloudWatchEventEvents {
InputTransformer = this.formatInputTransformer(InputTransformer);
}

const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(functionName);
const cloudWatchLogicalId = this.provider.naming.getCloudWatchEventLogicalId(
functionName,
cloudWatchEventNumberInFunction
Expand All @@ -98,9 +98,12 @@ class AwsCompileCloudWatchEventEvents {
);
const cloudWatchId = this.provider.naming.getCloudWatchEventId(functionName);

const dependsOn = _.get(functionObj.targetAlias, 'logicalId');

const cloudWatchEventRuleTemplate = `
{
"Type": "AWS::Events::Rule",
${dependsOn ? `"DependsOn": "${dependsOn}",` : ''}
"Properties": {
"EventPattern": ${EventPattern.replace(/\\n|\\r/g, '')},
"State": "${State}",
Expand All @@ -110,7 +113,7 @@ class AwsCompileCloudWatchEventEvents {
${Input ? `"Input": "${Input.replace(/\\n|\\r/g, '')}",` : ''}
${InputPath ? `"InputPath": "${InputPath.replace(/\r?\n/g, '')}",` : ''}
${InputTransformer ? `"InputTransformer": ${InputTransformer},` : ''}
"Arn": { "Fn::GetAtt": ["${lambdaLogicalId}", "Arn"] },
"Arn": ${JSON.stringify(resolveLambdaTarget(functionName, functionObj))},
"Id": "${cloudWatchId}"
}]
}
Expand All @@ -120,8 +123,9 @@ class AwsCompileCloudWatchEventEvents {
const permissionTemplate = `
{
"Type": "AWS::Lambda::Permission",
${dependsOn ? `"DependsOn": "${dependsOn}",` : ''}
"Properties": {
"FunctionName": { "Fn::GetAtt": ["${lambdaLogicalId}", "Arn"] },
"FunctionName": ${JSON.stringify(resolveLambdaTarget(functionName, functionObj))},
"Action": "lambda:InvokeFunction",
"Principal": "events.amazonaws.com",
"SourceArn": { "Fn::GetAtt": ["${cloudWatchLogicalId}", "Arn"] }
Expand Down
16 changes: 12 additions & 4 deletions lib/plugins/aws/package/compile/events/cloud-watch-log.js
Expand Up @@ -2,6 +2,7 @@

const _ = require('lodash');
const ServerlessError = require('../../../../../serverless-error');
const resolveLambdaTarget = require('../../../utils/resolve-lambda-target');

class AwsCompileCloudWatchLogEvents {
constructor(serverless) {
Expand Down Expand Up @@ -73,7 +74,6 @@ class AwsCompileCloudWatchLogEvents {
}
logGroupNamesThisFunction.push(LogGroupName);

const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(functionName);
const cloudWatchLogLogicalId = this.provider.naming.getCloudWatchLogLogicalId(
functionName,
cloudWatchLogNumberInFunction
Expand All @@ -88,14 +88,21 @@ class AwsCompileCloudWatchLogEvents {
FilterPattern = FilterPattern.replace(/\\("|\\|')/g, (match, g) => g);
}

const dependsOn = [
lambdaPermissionLogicalId,
_.get(functionObj.targetAlias, 'logicalId'),
].filter(Boolean);

const cloudWatchLogRuleTemplate = `
{
"Type": "AWS::Logs::SubscriptionFilter",
"DependsOn": "${lambdaPermissionLogicalId}",
${dependsOn.length ? `"DependsOn": ${JSON.stringify(dependsOn)},` : ''}
"Properties": {
"LogGroupName": "${LogGroupName}",
"FilterPattern": ${JSON.stringify(FilterPattern)},
"DestinationArn": { "Fn::GetAtt": ["${lambdaLogicalId}", "Arn"] }
"DestinationArn": ${JSON.stringify(
resolveLambdaTarget(functionName, functionObj)
)}
}
}
`;
Expand All @@ -105,8 +112,9 @@ class AwsCompileCloudWatchLogEvents {
const permissionTemplate = `
{
"Type": "AWS::Lambda::Permission",
${dependsOn.length ? `"DependsOn": ${JSON.stringify(dependsOn)},` : ''}
"Properties": {
"FunctionName": { "Fn::GetAtt": ["${lambdaLogicalId}", "Arn"] },
"FunctionName": ${JSON.stringify(resolveLambdaTarget(functionName, functionObj))},
"Action": "lambda:InvokeFunction",
"Principal": {
"Fn::Join": [ "", [
Expand Down
32 changes: 18 additions & 14 deletions lib/plugins/aws/package/compile/events/cognito-user-pool.js
Expand Up @@ -4,6 +4,7 @@ const _ = require('lodash');
const BbPromise = require('bluebird');
const { addCustomResourceToService } = require('../../../custom-resources');
const ServerlessError = require('../../../../../serverless-error');
const resolveLambdaTarget = require('../../../utils/resolve-lambda-target');

const customSenderSources = ['CustomSMSSender', 'CustomEmailSender'];
const validTriggerSources = [
Expand Down Expand Up @@ -85,16 +86,19 @@ class AwsCompileCognitoUserPoolEvents {
const userPoolLogicalId = this.provider.naming.getCognitoUserPoolLogicalId(
cognitoUserPoolTriggerFunction.poolName
);
const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(

const triggerFunctionObj = service.getFunction(
cognitoUserPoolTriggerFunction.functionName
);

const permissionTemplate = {
Type: 'AWS::Lambda::Permission',
DependsOn: _.get(triggerFunctionObj.targetAlias, 'logicalId'),
Properties: {
FunctionName: {
'Fn::GetAtt': [lambdaLogicalId, 'Arn'],
},
FunctionName: resolveLambdaTarget(
cognitoUserPoolTriggerFunction.functionName,
triggerFunctionObj
),
Action: 'lambda:InvokeFunction',
Principal: 'cognito-idp.amazonaws.com',
SourceArn: {
Expand Down Expand Up @@ -343,25 +347,21 @@ class AwsCompileCognitoUserPoolEvents {
generateTemplateForPool(poolName, currentPoolTriggerFunctions) {
const poolKmsIdMap = new Map();
const lambdaConfig = currentPoolTriggerFunctions.reduce((result, value) => {
const lambdaLogicalId = this.provider.naming.getLambdaLogicalId(value.functionName);
const functionObj = this.serverless.service.getFunction(value.functionName);

let triggerObject;
if (customSenderSources.includes(value.triggerSource)) {
triggerObject = {
[value.triggerSource]: {
LambdaArn: {
'Fn::GetAtt': [lambdaLogicalId, 'Arn'],
},
LambdaArn: resolveLambdaTarget(value.functionName, functionObj),
LambdaVersion: value.lambdaVersion || validLambdaVersions[0],
},
};
this.checkKmsArn(value.kmsKeyId, poolKmsIdMap, poolName);
triggerObject.KMSKeyID = value.kmsKeyId;
} else {
triggerObject = {
[value.triggerSource]: {
'Fn::GetAtt': [lambdaLogicalId, 'Arn'],
},
[value.triggerSource]: resolveLambdaTarget(value.functionName, functionObj),
};
}

Expand All @@ -372,9 +372,13 @@ class AwsCompileCognitoUserPoolEvents {
const userPoolLogicalId = this.provider.naming.getCognitoUserPoolLogicalId(poolName);

// Attach `DependsOn` for any relevant Lambdas
const DependsOn = currentPoolTriggerFunctions.map((value) =>
this.provider.naming.getLambdaLogicalId(value.functionName)
);
const DependsOn = currentPoolTriggerFunctions.map((value) => {
const functionObj = this.serverless.service.getFunction(value.functionName);
return (
_.get(functionObj.targetAlias, 'logicalId') ||
this.provider.naming.getLambdaLogicalId(value.functionName)
);
});

return {
[userPoolLogicalId]: {
Expand Down
12 changes: 6 additions & 6 deletions lib/plugins/aws/package/compile/events/event-bridge/index.js
Expand Up @@ -4,6 +4,7 @@ const _ = require('lodash');
const { addCustomResourceToService } = require('../../../../custom-resources');
const ServerlessError = require('../../../../../../serverless-error');
const { makeAndHashRuleName, makeEventBusTargetId, makeRuleName } = require('./utils');
const resolveLambdaTarget = require('../../../../utils/resolve-lambda-target');

class AwsCompileEventBridgeEvents {
constructor(serverless, options) {
Expand Down Expand Up @@ -404,10 +405,9 @@ class AwsCompileEventBridgeEvents {
] = eventBusResource;
}

const functionObj = this.serverless.service.getFunction(functionName);
const targetBase = {
Arn: {
'Fn::GetAtt': [this.provider.naming.getLambdaLogicalId(functionName), 'Arn'],
},
Arn: resolveLambdaTarget(functionName, functionObj),
Id: makeEventBusTargetId(RuleName),
};

Expand All @@ -423,6 +423,7 @@ class AwsCompileEventBridgeEvents {
// Create a rule
const eventRuleResource = {
Type: 'AWS::Events::Rule',
DependsOn: _.get(functionObj.targetAlias, 'logicalId'),
Properties: {
// default event bus is used when EventBusName is not set
EventBusName: eventBusName === 'default' ? undefined : eventBusName,
Expand Down Expand Up @@ -451,11 +452,10 @@ class AwsCompileEventBridgeEvents {
const ruleNameArnPath = eventBusName ? [eventBusName, RuleName] : [RuleName];
const lambdaPermissionResource = {
Type: 'AWS::Lambda::Permission',
DependsOn: _.get(functionObj.targetAlias, 'logicalId'),
Properties: {
Action: 'lambda:InvokeFunction',
FunctionName: {
Ref: this.provider.naming.getLambdaLogicalId(functionName),
},
FunctionName: resolveLambdaTarget(functionName, functionObj),
Principal: 'events.amazonaws.com',
SourceArn: {
'Fn::Join': [
Expand Down
5 changes: 5 additions & 0 deletions lib/plugins/aws/package/compile/events/http-api.js
Expand Up @@ -237,6 +237,10 @@ class HttpApiEvents {
],
],
};
authorizerResource.DependsOn = _.get(
_.get(authorizer.functionObject, 'targetAlias'),
'logicalId'
);

// If authorizer is not managed externally, we need to make sure the correct permission is created that
// allows API Gateway to invoke authorizer function
Expand Down Expand Up @@ -635,6 +639,7 @@ Object.defineProperties(
this.provider.naming.getHttpApiIntegrationLogicalId(routeTargetData.functionName)
] = {
Type: 'AWS::ApiGatewayV2::Integration',
DependsOn: _.get(routeTargetData.functionAlias, 'logicalId'),
Properties: properties,
};
}),
Expand Down

0 comments on commit 16dd286

Please sign in to comment.