Skip to content

Commit 43484a9

Browse files
authored
Merge branch 'master' into fix-per-function-role
2 parents 23ed742 + dd1dbba commit 43484a9

File tree

7 files changed

+284
-24
lines changed

7 files changed

+284
-24
lines changed

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
/node_modules
2-
/coverage
3-
/.nyc_output
42

53
# Jetbrains IDEs
64
.idea/

lib/stackops/apiGateway.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
186186
this.options.verbose && this._serverless.cli.log('Configuring stage');
187187
const stageResource = internal.createStageResource.call(this, `${stackName}-ApiGatewayRestApi`, deploymentName);
188188
aliasResources.push({ ApiGatewayStage: stageResource });
189-
189+
190190
const baseMapping = _.assign({}, _.pickBy(stageStack.Resources, ['Type', 'AWS::ApiGateway::BasePathMapping']));
191191
if (!_.isEmpty(baseMapping)) {
192192
const baseMappingName = _.keys(baseMapping)[0];
@@ -198,7 +198,7 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
198198
aliasResources.push(baseMapping);
199199
delete stageStack.Resources[baseMappingName];
200200
}
201-
}
201+
}
202202

203203
// Fetch lambda permissions, methods and resources. These have to be updated later to allow the aliased functions.
204204
const apiLambdaPermissions =
@@ -278,9 +278,9 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
278278
// Adjust permission to reference the function aliases
279279
_.forOwn(apiLambdaPermissions, (permission, name) => {
280280
const functionName = _.replace(name, /LambdaPermissionApiGateway$/, '');
281-
const versionName = _.find(_.keys(versions), version => _.startsWith(version, functionName));
282-
const aliasName = _.find(_.keys(aliases), alias => _.startsWith(alias, functionName));
283-
const isExternalRef = isExternalRefAuthorizerPredicate(permission.Properties.FunctionName);
281+
const versionName = utils.getFunctionVersionName(versions, functionName);
282+
const aliasName = utils.getAliasVersionName(aliases, functionName);
283+
const isExternalRef = isExternalRefAuthorizerPredicate(permission.Properties.FunctionName);
284284

285285
// Adjust references and alias permissions
286286
if (!isExternalRef) {
@@ -305,9 +305,9 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
305305
]
306306
};
307307
}
308-
308+
309309
// Add dependency on function version
310-
if (!isExternalRef) {
310+
if (!isExternalRef) {
311311
permission.DependsOn = [ versionName, aliasName ];
312312
} else {
313313
permission.DependsOn = _.compact([ versionName, aliasName ]);

lib/stackops/snsEvents.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
3131
_.forOwn(lambdaSubscriptions, subscription => {
3232
const functionNameRef = utils.findAllReferences(_.get(subscription, 'Endpoint'));
3333
const functionName = _.replace(_.get(functionNameRef, '[0].ref', ''), /LambdaFunction$/, '');
34-
const versionName = _.find(_.keys(versions), version => _.startsWith(version, functionName));
35-
const aliasName = _.find(_.keys(aliases), alias => _.startsWith(alias, functionName));
34+
const versionName = utils.getFunctionVersionName(versions, functionName);
35+
const aliasName = utils.getAliasVersionName(aliases, functionName);
3636

3737
subscription.Endpoint = { Ref: aliasName };
3838

@@ -54,8 +54,8 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
5454

5555
const functionNameRef = utils.findAllReferences(_.get(subscription.Properties, 'Endpoint'));
5656
const functionName = _.replace(_.get(functionNameRef, '[0].ref', ''), /LambdaFunction$/, '');
57-
const versionName = _.find(_.keys(versions), version => _.startsWith(version, functionName));
58-
const aliasName = _.find(_.keys(aliases), alias => _.startsWith(alias, functionName));
57+
const versionName = utils.getFunctionVersionName(versions, functionName);
58+
const aliasName = utils.getAliasVersionName(aliases, functionName);
5959

6060
subscription.Properties.Endpoint = { Ref: aliasName };
6161
subscription.DependsOn = [ versionName, aliasName ];
@@ -72,8 +72,8 @@ module.exports = function(currentTemplate, aliasStackTemplates, currentAliasStac
7272
// Adjust permission to reference the function aliases
7373
_.forOwn(snsLambdaPermissions, (permission, name) => {
7474
const functionName = _.replace(name, /LambdaPermission.*$/, '');
75-
const versionName = _.find(_.keys(versions), version => _.startsWith(version, functionName));
76-
const aliasName = _.find(_.keys(aliases), alias => _.startsWith(alias, functionName));
75+
const versionName = utils.getFunctionVersionName(versions, functionName);
76+
const aliasName = utils.getAliasVersionName(aliases, functionName);
7777

7878
// Adjust references and alias permissions
7979
permission.Properties.FunctionName = { Ref: aliasName };

lib/utils.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,8 @@ class Utils {
8989

9090
/**
9191
* Checks if a CF resource permission targets the given service as Principal.
92-
* @param {string} service
92+
* @param {Object} permission
93+
* @param {string} service
9394
*/
9495
static hasPermissionPrincipal(permission, service) {
9596
const principal = _.get(permission, 'Properties.Principal');
@@ -104,6 +105,23 @@ class Utils {
104105
return false;
105106
}
106107

108+
/**
109+
* @param {object} versions
110+
* @param {string} functionName
111+
* @returns {string}
112+
*/
113+
static getFunctionVersionName(versions, functionName) {
114+
return _.find(_.keys(versions), version => version === `${functionName}LambdaVersion`);
115+
}
116+
117+
/**
118+
* @param {object} aliases
119+
* @param {string} functionName
120+
* @returns {string}
121+
*/
122+
static getAliasVersionName(aliases, functionName) {
123+
return _.find(_.keys(aliases), alias => alias === `${functionName}Alias`);
124+
}
107125
}
108126

109127
module.exports = Utils;

test/data/alias-stack-1.json

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,25 @@
99
"RetentionInDays": 7
1010
}
1111
},
12+
"Testfct1WithSuffixAlias": {
13+
"Type": "AWS::Lambda::Alias",
14+
"Properties": {
15+
"Description": "Echo function echoes alias",
16+
"FunctionName": {
17+
"Fn::ImportValue": "sls-test-project-dev-Testfct1WithSuffix-LambdaFunctionArn"
18+
},
19+
"FunctionVersion": {
20+
"Fn::GetAtt": [
21+
"Testfct1WithSuffixLambdaVersionWh5jTkiTR67V05RPWQIlzPI25WiPbdHDYNgbtAMneU",
22+
"Version"
23+
]
24+
},
25+
"Name": "myAlias"
26+
},
27+
"DependsOn": [
28+
"Testfct1WithSuffixLambdaVersionWh5jTkiTR67V05RPWQIlzPI25WiPbdHDYNgbtAMneU"
29+
]
30+
},
1231
"Testfct1Alias": {
1332
"Type": "AWS::Lambda::Alias",
1433
"Properties": {
@@ -47,6 +66,17 @@
4766
"WarmUpPluginLambdaVersionWh5jTkiTR67V05RPWQIlzPI25WiPbdHDYNgbtAMneU"
4867
]
4968
},
69+
"Testfct1WithSuffixLambdaVersionWh5jTkiTR67V05RPWQIlzPI25WiPbdHDYNgbtAMneU": {
70+
"Type": "AWS::Lambda::Version",
71+
"DeletionPolicy": "Delete",
72+
"Properties": {
73+
"FunctionName": {
74+
"Fn::ImportValue": "sls-test-project-dev-Testfct1WithSuffix-LambdaFunctionArn"
75+
},
76+
"CodeSha256": "Wh5jTkiTR67+V05RPWQIlzPI25WiPbdHDYNgbtAMneU=",
77+
"Description": "Echo function echoes alias"
78+
}
79+
},
5080
"Testfct1LambdaVersionWh5jTkiTR67V05RPWQIlzPI25WiPbdHDYNgbtAMneU": {
5181
"Type": "AWS::Lambda::Version",
5282
"DeletionPolicy": "Delete",
@@ -97,6 +127,40 @@
97127
"ApiGatewayDeployment1494367071211"
98128
]
99129
},
130+
"Testfct1WithSuffixLambdaPermissionApiGateway": {
131+
"Type": "AWS::Lambda::Permission",
132+
"Properties": {
133+
"FunctionName": {
134+
"Ref": "Testfct1WithSuffixAlias"
135+
},
136+
"Action": "lambda:InvokeFunction",
137+
"Principal": "apigateway.amazonaws.com",
138+
"SourceArn": {
139+
"Fn::Join": [
140+
"",
141+
[
142+
"arn:aws:execute-api:",
143+
{
144+
"Ref": "AWS::Region"
145+
},
146+
":",
147+
{
148+
"Ref": "AWS::AccountId"
149+
},
150+
":",
151+
{
152+
"Fn::ImportValue": "sls-test-project-dev-ApiGatewayRestApi"
153+
},
154+
"/*/*"
155+
]
156+
]
157+
}
158+
},
159+
"DependsOn": [
160+
"Testfct1WithSuffixLambdaVersionWh5jTkiTR67V05RPWQIlzPI25WiPbdHDYNgbtAMneU",
161+
"Testfct1WithSuffixAlias"
162+
]
163+
},
100164
"Testfct1LambdaPermissionApiGateway": {
101165
"Type": "AWS::Lambda::Permission",
102166
"Properties": {

0 commit comments

Comments
 (0)