首页 > 解决方案 > 同一 AWS API 网关内的多个微服务

问题描述

我正在开发一系列需要共享同一个 AWS API 网关的微服务。这是我的结构:

/
   /assessments
      /skills
      /work-values      
   /graphql

/skills/work-values/graphql是我尝试向同一个 AWS API 网关注册的 3 个不同的微服务。我遇到的问题是获取 serverless.yaml 文件/skills/work-values用于嵌套在“评估”下的路由。没有自在的功能/assessments。它的存在只是为了让我们可以在相同的 URL 路径结构下组织我们的所有评估。

这是我的“/work-values”的 serverless.yaml 文件:

service:
  name: assessments-workvalues

...
custom:
  stage: ${opt:stage, self:provider.stage}

provider:
  ...
  apiGateway:
    restApiId:
       # THE FOLLOWING REFERENCES A VARIABLE FROM MY API GATEWAY ROOT
      'Fn::ImportValue': ${self:custom.stage}-ApiGatewayRestApiId
    restApiRootResourceId: 
      'Fn::ImportValue':   # HOW DO I GET THE PROPER VALUE HERE TO MAP TO `/assessments`?
    ...

functions:
  ...

这是我的“/评估”的 serverless.yaml 文件:

service:
  name: assessments

custom:
  stage: ${opt:stage, self:provider.stage}

provider:
  ...
  apiGateway:
    restApiId:
       # THE FOLLOWING REFERENCES A VARIABLE FROM MY API GATEWAY ROOT
      'Fn::ImportValue': ${self:custom.stage}-ApiGatewayRestApiId
    restApiRootResourceId:
      'Fn::ImportValue': ${self:custom.stage}-ApiGatewayRestApiRootResourceId   

functions:
  ...

resources:
  Outputs:
    ApiGatewayRestApiId:
      Value:
        Ref: ApiGatewayRestApi
      Export:
        Name: ${self:custom.stage}-Assessments-ApiGatewayRestApiId
    ApiGatewayRestApiRootResourceId:
      Value:
         Fn::GetAtt:
          - ApiGatewayRestApi
          - RootResourceId 
      Export:
        Name: ${self:custom.stage}-Assessments-ApiGatewayRestApiRootResourceId

问题似乎是对评估路由的 serverless.yaml 文件中的输出进行编码。当我运行无服务器部署时,我收到以下错误消息:

Error: The CloudFormation template is invalid: Unresolved resource dependencies [ApiGatewayRestApi] in the Outputs block of the template

在“在服务之间共享 API 端点”一文的末尾,作者提到“您必须从 billing-api 导入 /billing,因此新服务只需要创建 /billing/xyz 部分。” (这似乎是我所处的情况)。但是,作者没有解释如何导入/billing. 或者就我而言,如何将/assessments每个评估微服务的 serverless.yaml 文件导入?

标签: microservicesaws-api-gatewayserverless-frameworkserverless-architecture

解决方案


经过进一步研究,我发现了这个链接:

在 AWS 上拆分您的无服务器框架 API

我最终按照上面文章中的内容重新设计了我的原始方法。我缺少的部分是有一个根或基本无服务器文件,该文件用于在 AWS API Gateway 中创建您的路由,并将这些占位符作为输出公开,您的后续子无服务器文件将其用作将您的子 lambda 函数连接到路由下的输入API 网关保护伞。


推荐阅读