代码之家  ›  专栏  ›  技术社区  ›  shesupplypi

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

  •  2
  • shesupplypi  · 技术社区  · 2 年前

    我希望能够使用无服务器框架引用一个应用程序/服务、另一个应用程序/服务中的输出或功能级别信息(ARN或名称)。我对引用函数的ARN特别感兴趣,如果它因任何原因发生更改,我可以在其他服务/应用程序中使用解耦的引用。

    例如,我有一个无服务器的。应用程序A中的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
    
    1 回复  |  直到 2 年前
        1
  •  1
  •   pomSense    2 年前

    您可以通过使用 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
    
    outputs:
      myFunctionArn:
        'Fn::GetAtt': [MyFunctionLambdaFunction, Arn]
    

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

    然后,在appB、serviceB中,可以通过以下方式引用输出 ${output:appname:stagename:regionname:my-service.var-key} 在上面链接的无服务器文档中提到。这使您的appB、serviceB无服务器。yml组件:

    org: myOrg
    app: appB
    service: serviceB
    
    ...
    custom:
      myFunctionArn: ${output:appA:${self:provider.stage}:${self:provider.region}:serviceA.myFunctionArn}
    

    我为stage和region添加了变量,假设这是一个多阶段部署,并假设它位于同一个区域。如果它位于不同的区域,则更改 ${self:provider.region} appA/serviceA地区。