如何引用使用 Serverless Framework 创建的 AWS lambda 函数的 Arn 和名称

How to reference Arn and name of AWS lambda function created with Serverless Framework

我正在使用无服务器框架创建一个 lambda 函数,并希望能够在 serverless.yml 的其他部分交叉引用其 Arn 和名称。

我很惊讶我发现它有多难,因为 !GetAtt 和 !Ref 似乎不能像我预期的那样工作,如果 lambda 是通过 vanilla CloudFormation 创建的。 (AWS::Lambda::Function returns Ref 和 Fn::GetAtt 这将使这变得简单!)

我找到了一些提到解决方案的帖子,但没有任何内容用简单的英语说明如何实现这一点。

设置

serverless.yml

...
functions:
  - ${file(functions/sendEmail.yml)}
...

sendEmail.yml

sendEmail:
  handler: lambda-functions/send-email.handler
...

尝试引用

阿恩

在模板的另一部分我尝试过:

...    
LambdaFunctionArn: !GetAtt sendEmail.Arn

但是,当我部署时,我得到:

Error: The CloudFormation template is invalid: Template error: instance of Fn::GetAtt references undefined resource sendEmail

我注意到最终的 CloudFormation 模板已将 sendEmail 转换为 sendEmailLambdaFunction,因此我尝试了:

LambdaFunctionArn: !GetAtt sendEmailLambdaFunction.Arn

但收到类似的错误。

姓名

我也希望能够参考这个名字,可惜

!Ref sendEmail

导致错误:

Error: The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [sendEmail] in the Resources block of the template

对于我需要进行的精确更改以实现获取 lambda 的 Arn 和名称的任何帮助,将不胜感激!

提前致谢! 我

我不确定最佳做法,但以下对我有用。

在serverless function中提供functionName,当你要arn的时候,你可以形成它。

test.yaml

TestFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    FunctionName: myFunction

引用时,

LambdaArn: !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:myFunction

好的,感谢 Dinush 让我走上正轨,我实现了如下功能解决方案:

serverless.yml

custom:
  ...
  myEnvironment:
    assetPreName: ${self:service.name}-${self:provider.stage}
    arnRegionAndAccount: ${self:provider.region}:#{AWS::AccountId}
  ...
  myContact:
    ...
    lambdaFuncName: ${self:custom.myEnvironment.assetPreName}-sendEmail
    lambdaFuncArn: arn:aws:lambda:${self:custom.myEnvironment.arnRegionAndAccount}:function:${self:custom.myContact.lambdaFuncName}

注: 表示法:

#{AWS::AccountId}

需要插件:无服务器伪参数。

sendEmail.yml

sendEmail:
  ...
  name: ${self:custom.myContact.lambdaFuncName}
  ...

别处

LambdaFunctionArn: ${self:custom.myContact.lambdaFuncArn}

我仍然认为我不能简单地使用 Ref 和 Fn::GetAtt 是一种耻辱(如果 lambda 是通过 vanilla CloudFormation、AWS::Lambda::Function、资源创建的,我就可以这样做) , 但目前有效。

希望这对其他人有帮助。再次感谢,Dinush 让我学习这门课程!