您如何将一个应用程序或服务的无服务器输出引用到另一个应用程序或服务?

How do you reference serverless outputs from one app or service to another?

我希望能够使用无服务器框架引用一个 app/service 和另一个 app/service 中的输出或功能级信息(ARN 或名称)。我对引用函数的 ARN 特别感兴趣,如果它因任何原因发生变化,我可以在另一个 service/app.

中有一个解耦引用

例如,我在应用程序 A 中有这个 serverless.yml:

org: myOrg
app: appA
service: serviceA

...
myFunction:
  handler: src/index.handler
  name: ${self:app}-${self:service}-myFunction-${sls:stage}
  events:
    - httpApi:
        method: 'POST'
        path: /my-path

我希望能够在 appA 和 serviceA、appB 和 serviceB 中使用 myFunction 的 ARN。像这样:

org: myOrg
app: appB
service: serviceB

...
custom:
  myFunctionArn: ${app:A-service:A-myFunctionArn} # <- here I want to be able to reference the ARN of the other deployed service

您可以使用 serverless's outputs 实现此目的,然后在其他无服务器应用程序或服务中引用它。

使用您的示例,在 appA、serviceA 中执行此操作:

org: myOrg
app: appA
service: serviceA

...
myFunction:
  handler: src/index.handler
  name: ${self:app}-${self:service}-myFunction-${sls:stage}
  events:
    - httpApi:
        method: 'POST'
        path: /my-path

resources:
  Outputs:
    myFunctionArn:
      Value:
        'Fn::GetAtt': [MyFunctionLambdaFunction, Arn]
      Export:
        Name: serviceA-myFunctionArn-${self:custom.currentStage}

请注意,您必须使用 CloudFormation 生成的资源名称(参见 this great Whosebug answer here)。 CloudFormation 始终将 lambda 函数名称输出为 {titleCasedFunctionName}LambdaFunction,因此 myFunction 变为 MyFunctionLambdaFunction

然后,在 appB、serviceB 中,您可以按照上面链接的 Serverless 文档中提到的 ${output:appname:stagename:regionname:my-service.var-key} 来引用输出。这使得您的 appB, serviceB serverless.yml 为:

org: myOrg
app: appB
service: serviceB

...
custom:
  myFunctionArn: 
     'Fn::ImportValue': 'serviceB-myFunctionArn-${self:custom.currentStage}'

请注意,输出在 AWS 账户中必须是唯一的,因此请确保使用适当的 stage/region 变量来帮助优化唯一性。

您还可以将服务 A 中的区域命名为:

resources:
  Outputs:
    myFunctionArn:
      Value:
        'Fn::GetAtt': [MyFunctionLambdaFunction, Arn]
      Export:
        Name: serviceA-myFunctionArn-${self:provider.region}-${self:custom.currentStage}