如何为单个AWS SAM函数配置两个自定义域名映射
单AWS SAM函数绑定双域名配置方案
AWS::Serverless::Api 内置的Domain属性仅支持配置单个自定义域名,要实现同个函数绑定两个域名可以通过新增独立域名关联资源实现,不需要重复创建API或函数资源,原有运行逻辑不受影响。
配置步骤
- 为第二个待绑定域名申请独立的ACM证书,证书的域名校验方式和现有证书保持一致即可
- 单独创建API Gateway自定义域名资源,端点类型和现有API保持一致(当前配置为REGIONAL类型),关联刚申请的第二个域名证书
- 创建API基础路径映射资源,将第二个自定义域名绑定到已有的RestApi实例和对应部署阶段,完成域名和现有API的流量打通
- 为第二个域名添加Route53别名解析记录,指向API Gateway为第二个域名分配的访问端点
完整配置示例
以下是调整后可直接使用的模板,新增部分已经和原有配置做了兼容:
Parameters: StageName: Type: String Default: prod Resources: # 原有第一个域名的ACM证书 ApiCertificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: !Sub abc-${StageName}.xyz.com ValidationMethod: DNS # 新增:第二个域名的ACM证书 SecondApiCertificate: Type: AWS::CertificateManager::Certificate Properties: DomainName: !Sub login-${StageName}.xyz.com ValidationMethod: DNS RestApi: Type: AWS::Serverless::Api Properties: StageName: !Ref StageName EndpointConfiguration: REGIONAL Domain: DomainName: !Sub abc-${StageName}.xyz.com CertificateArn: !Ref ApiCertificate Route53: HostedZoneName: "xyz.com." # 新增:第二个自定义域名配置 SecondCustomDomain: Type: AWS::ApiGateway::DomainName Properties: RegionalCertificateArn: !Ref SecondApiCertificate DomainName: !Sub login-${StageName}.xyz.com EndpointConfiguration: Types: - REGIONAL # 新增:第二个域名到现有API的路径映射 SecondDomainApiMapping: Type: AWS::ApiGateway::BasePathMapping DependsOn: - RestApi - SecondCustomDomain Properties: DomainName: !Ref SecondCustomDomain RestApiId: !Ref RestApi Stage: !Ref StageName # 新增:第二个域名的Route53解析记录 SecondDomainRoute53Record: Type: AWS::Route53::RecordSet Properties: HostedZoneName: "xyz.com." Name: !Sub login-${StageName}.xyz.com Type: A AliasTarget: DNSName: !GetAtt SecondCustomDomain.RegionalDomainName HostedZoneId: !GetAtt SecondCustomDomain.RegionalHostedZoneId EvaluateTargetHealth: false loginFunction: Type: AWS::Serverless::Function Properties: Handler: src/handlers/login.loginHandler Runtime: nodejs16.x Architectures: - x86_64 MemorySize: 128 Timeout: 100 Events: Api: Type: Api Properties: Path: /login Method: POST RestApiId: !Ref RestApi
注意事项
- 示例中第二个域名使用
login-${StageName}.xyz.com作为演示,实际使用时替换成你需要绑定的真实域名即可,如果两个域名归属不同的托管区,对应修改证书域名、Route53记录的HostedZoneName配置就行 - 两个域名最终都映射到同一个API实例,后端login函数不需要做任何代码修改,两个域名的请求都会正常路由到该函数
- 如果需要给两个域名设置不同的访问路径前缀,只需要在
SecondDomainApiMapping资源中添加BasePath属性指定路径即可,不配置该属性时默认做根路径映射
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

