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

Aws lambda 如何引用使用无服务器框架创建的AWS lambda函数的Arn和名称,aws-lambda,amazon-cloudformation,serverless-framework,Aws Lambda,Amazon Cloudformation,Serverless Framework,我正在使用Serverless框架创建一个lambda函数,并希望能够在Serverless.yml的其他部分交叉引用它的Arn和名称 我很惊讶我发现这是多么困难!格塔特和!如果lambda是通过vanilla CloudFormation创建的,那么Ref似乎不像我预期的那样工作。AWS::Lambda::函数返回Ref和Fn::GetAtt,这将使操作变得简单 我发现有几篇文章提到了解决方案,但没有用通俗易懂的英语说明如何做到这一点 设置 serverless.yml sendmail.ym

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

我很惊讶我发现这是多么困难!格塔特和!如果lambda是通过vanilla CloudFormation创建的,那么Ref似乎不像我预期的那样工作。AWS::Lambda::函数返回Ref和Fn::GetAtt,这将使操作变得简单

我发现有几篇文章提到了解决方案,但没有用通俗易懂的英语说明如何做到这一点

设置 serverless.yml sendmail.yml 试图引用 阿恩 在模板的另一部分中,我尝试了:

...    
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和名称,将不胜感激

提前谢谢!

我不确定最佳实践,但下面的内容对我很有用

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

test.yaml

引用时

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

我不确定最佳实践,但下面的内容对我很有用

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

test.yaml

引用时

LambdaArn: !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:myFunction
好的,感谢您让我走上正轨,我实现了如下功能解决方案:

serverless.yml 注:符号为:

#{AWS::AccountId}
需要plugin:serverless伪参数

sendmail.yml 在别处 如果lambda是通过普通的CloudFormation、AWS::lambda::Function、resource创建的,那么我不能简单地使用Ref和Fn::GetAtt,这仍然是一件很遗憾的事情,但这目前还有效

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

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

serverless.yml 注:符号为:

#{AWS::AccountId}
需要plugin:serverless伪参数

sendmail.yml 在别处 如果lambda是通过普通的CloudFormation、AWS::lambda::Function、resource创建的,那么我不能简单地使用Ref和Fn::GetAtt,这仍然是一件很遗憾的事情,但这目前还有效


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

这就是为什么我不建议使用那个框架,SAM好得多。这就是为什么我不建议使用那个框架,SAM好得多。
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:
  ...
  name: ${self:custom.myContact.lambdaFuncName}
  ...
LambdaFunctionArn: ${self:custom.myContact.lambdaFuncArn}