如何在使用Serverless Framework创建的AWS Lambda函数中引用ARN和名称?

3
我正在使用Serverless Framework创建一个lambda函数,并希望能够在serverless.yml的其他部分中交叉引用它的Arn和名称。
我很惊讶地发现,如果lambda是通过vanilla CloudFormation创建的,!GetAtt和!Ref似乎不像我预期的那样工作。(AWS :: Lambda :: Function返回Ref和Fn :: GetAtt,这将使此过程变得简单!)
我已经找到了一些帖子,暗示了解决方案,但没有明确说明如何以简单明了的英语实现此目的。
设置
serverless.yml
...
functions:
  - ${file(functions/sendEmail.yml)}
...

sendEmail.yml

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

尝试引用

Arn

在模板的另一部分中,我尝试了:

...    
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和名称,将不胜感激!
提前致谢!
2个回答

11

我不确定最佳实践,但以下方法对我有效。

在无服务器函数中提供 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

6

感谢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}

需要使用插件:serverless-pseudo-parameters。

sendEmail.yml

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

其他地方

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

我仍然认为很遗憾,如果lambda函数是通过基础的CloudFormation数据模板AWS::Lambda::Function创建的话,我就可以简单地使用Ref和Fn::GetAtt(但现在不行)。但目前这个方法可以解决问题。

希望这能帮到其他人。再次感谢Dinush让我了解了这个方法!


1
这正是为什么我不建议使用那个框架,SAM要好得多。 - Matteo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接