如何引用使用无服务器框架创建的 AWS lambda 函数的 Arn 和名称

Hap*_*aze 3 aws-cloudformation aws-lambda serverless-framework

我正在使用 Serverless Framework 创建 lambda 函数,并希望能够在 serverless.yml 的其他部分交叉引用其 Arn 和名称。

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

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

设置

无服务器.yml

...
functions:
  - ${file(functions/sendEmail.yml)}
...
Run Code Online (Sandbox Code Playgroud)

发送电子邮件.yml

sendEmail:
  handler: lambda-functions/send-email.handler
...
Run Code Online (Sandbox Code Playgroud)

尝试参考

阿恩

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

...    
LambdaFunctionArn: !GetAtt sendEmail.Arn
Run Code Online (Sandbox Code Playgroud)

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

Error: The CloudFormation template is invalid: Template error: instance of Fn::GetAtt references undefined resource sendEmail
Run Code Online (Sandbox Code Playgroud)

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

LambdaFunctionArn: !GetAtt sendEmailLambdaFunction.Arn
Run Code Online (Sandbox Code Playgroud)

但收到类似的错误。

姓名

我也希望能够引用这个名字,但遗憾的是

!Ref sendEmail
Run Code Online (Sandbox Code Playgroud)

导致错误:

Error: The CloudFormation template is invalid: Template format error: Unresolved resource dependencies [sendEmail] in the Resources block of the template
Run Code Online (Sandbox Code Playgroud)

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

提前致谢!我

小智 11

我不确定最佳实践,但以下内容对我有用。

在无服务器函数中提供 functionName,当您需要 arn 时,可以形成它。

测试.yaml

TestFunction:
  Type: AWS::Serverless::Function
  Properties:
    Handler: index.handler
    FunctionName: myFunction
Run Code Online (Sandbox Code Playgroud)

引用时,

LambdaArn: !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:myFunction
Run Code Online (Sandbox Code Playgroud)


Hap*_*aze 6

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

无服务器.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}
Run Code Online (Sandbox Code Playgroud)

注:记号:

#{AWS::AccountId}
Run Code Online (Sandbox Code Playgroud)

需要插件:serverless-pseudo-parameters。

发送电子邮件.yml

sendEmail:
  ...
  name: ${self:custom.myContact.lambdaFuncName}
  ...
Run Code Online (Sandbox Code Playgroud)

别处

LambdaFunctionArn: ${self:custom.myContact.lambdaFuncArn}
Run Code Online (Sandbox Code Playgroud)

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

希望这对其他人有帮助。再次感谢迪努什为我安排了这门课程!