具有相同自定义域,不同路径映射的多个SAM模板

问题描述

我正在尝试使用不同的存储库创建多个服务; actorsmovies。每个存储库都有自己的template.yaml

不幸的是,如果我在这两个template.yaml中使用相同的域但使用不同的基本路径,则我会出错,并且第二个服务未部署;

演员存储库中; template.yaml

Mapping:
    Type: AWS::ApiGateway::BasePathMapping
    Properties:
      BasePath: actors
      DomainName: api.example.com
      RestApiId: !Ref Api
      Stage: !Ref Env
  Api:
    Type: AWS::Serverless::Api
    Properties:
     # ... other props

电影存储库中; template.yaml

Mapping:
    Type: AWS::ApiGateway::BasePathMapping
    Properties:
      BasePath: movies
      DomainName: api.example.com
      RestApiId: !Ref Api
      Stage: !Ref Env
  Api:
    Type: AWS::Serverless::Api
    Properties:
     # ... other props

似乎无法完成。即使我在Api resource definition中移动域配置,它也表示域正在另一个堆栈中使用,因为堆栈名称也不同。

有什么办法解决吗?

解决方法

您不能创建两个具有相同域名的资源。这将允许非常糟糕的事情。

相反,

选项1 1:单个AWS::Serverless::Api

使用一个域名和多个事件创建一个AWS::Serverless::Api资源

选项2:多个AWS::Serverless::Api

  • 使用唯一的域名创建多个AWS::Serverless::Api资源(创建时使用默认资源)
  • 创建一个具有多个“起源”的单个AWS::CloudFront::Distribution资源,这些起源是您的AWS::Serverless::Api和您要使用的域名。通过这种方式,它将使该域“到达”您的许多起源(api网关)

注释:

如果您决定继续使用多个模板文件,则可能会遇到一些语法问题,我建议您使用nested approach

,

@Revenant现在看来这是可能的。您现在的做法听起来很合法。

  1. 每个服务具有单独的API
  2. 每个服务具有单独的基本路径
  • api.example.com/actors
  • api.example.com/moviews

只需确保您的服务支持通过根路径/

进行调用