diff --git a/lib/plugins/aws/lib/naming.js b/lib/plugins/aws/lib/naming.js index 645e09589..145255237 100644 --- a/lib/plugins/aws/lib/naming.js +++ b/lib/plugins/aws/lib/naming.js @@ -541,6 +541,9 @@ module.exports = { getLambdaHttpApiPermissionLogicalId(functionName) { return `${this.getNormalizedFunctionName(functionName)}LambdaPermissionHttpApi`; }, + getLambdaFnPermissionLogicalId(functionName) { + return `${this.getNormalizedFunctionName(functionName)}LambdaPermissionFn`; + }, getLambdaFnUrlPermissionLogicalId(functionName) { return `${this.getNormalizedFunctionName(functionName)}LambdaPermissionFnUrl`; }, diff --git a/lib/plugins/aws/package/compile/functions.js b/lib/plugins/aws/package/compile/functions.js index 33b9fc586..b18e4685d 100644 --- a/lib/plugins/aws/package/compile/functions.js +++ b/lib/plugins/aws/package/compile/functions.js @@ -723,6 +723,16 @@ class AwsCompileFunctions { }, DependsOn: _.get(functionObject.targetAlias, 'logicalId'), }; + cfTemplate.Resources[this.provider.naming.getLambdaFnPermissionLogicalId(functionName)] = { + Type: 'AWS::Lambda::Permission', + Properties: { + FunctionName: resolveLambdaTarget(functionName, functionObject), + Action: 'lambda:InvokeFunction', + Principal: '*', + InvokedViaFunctionUrl: true, + }, + DependsOn: _.get(functionObject.targetAlias, 'logicalId'), + }; } } diff --git a/test/unit/lib/plugins/aws/lib/naming.test.js b/test/unit/lib/plugins/aws/lib/naming.test.js index 48afeee7d..b60ab611f 100644 --- a/test/unit/lib/plugins/aws/lib/naming.test.js +++ b/test/unit/lib/plugins/aws/lib/naming.test.js @@ -1064,6 +1064,14 @@ describe('#naming()', () => { }); }); + describe('#getLambdaFnPermissionLogicalId()', () => { + it('should normalize the name and append correct suffix', () => { + expect(sdk.naming.getLambdaFnPermissionLogicalId('fnName')).to.equal( + 'FnNameLambdaPermissionFn' + ); + }); + }); + describe('#getHttpApiName()', () => { it('should return the composition of service & stage name if custom name not provided and shouldStartNameWithService is true', () => { serverless.service.service = 'myService'; diff --git a/test/unit/lib/plugins/aws/package/compile/functions.test.js b/test/unit/lib/plugins/aws/package/compile/functions.test.js index 8a34d194f..5e604097a 100644 --- a/test/unit/lib/plugins/aws/package/compile/functions.test.js +++ b/test/unit/lib/plugins/aws/package/compile/functions.test.js @@ -1958,6 +1958,14 @@ describe('lib/plugins/aws/package/compile/functions/index.test.js', () => { FunctionUrlAuthType: 'NONE', Principal: '*', }); + expect(cfResources[naming.getLambdaFnPermissionLogicalId('fnUrl')].Properties).to.deep.equal({ + Action: 'lambda:InvokeFunction', + FunctionName: { + 'Fn::GetAtt': ['FnUrlLambdaFunction', 'Arn'], + }, + InvokedViaFunctionUrl: true, + Principal: '*', + }); }); it('should support `functions[].url` set to `true` with provisionedConcurrency set', () => {