Aws lambda 无服务器错误:无法为设置基本域映射

Aws lambda 无服务器错误:无法为设置基本域映射,aws-lambda,aws-api-gateway,serverless,Aws Lambda,Aws Api Gateway,Serverless,我正在使用无服务器部署Lambda函数。我做了以下工作: 已在本地设置并运行我的代码库(使用无服务器脱机) 将我的Lambda函数部署到dev阶段(serverless deploy-v)并在那里进行了测试。因为我首先部署到dev,所以它使用默认端点image.example.com/ogImage(其中ogImage是我的函数) 将我的Lambda功能成功部署到prod阶段然而我随后发现定制域仍然指向开发阶段 手动进入AWS控制台,在API网关>自定义域名>image.example.com下

我正在使用无服务器部署Lambda函数。我做了以下工作:

  • 已在本地设置并运行我的代码库(使用无服务器脱机)
  • 将我的Lambda函数部署到dev阶段(
    serverless deploy-v
    )并在那里进行了测试。因为我首先部署到dev,所以它使用默认端点image.example.com/ogImage(其中ogImage是我的函数)
  • 将我的Lambda功能成功部署到prod阶段然而我随后发现定制域仍然指向开发阶段
  • 手动进入AWS控制台,在API网关>自定义域名>image.example.com下,单击配置API映射,并将其切换为使用prod API和prod阶段(参见下面的屏幕截图)
  • 这解决了问题,现在自定义域(image.example.com/ogImage)指向prod阶段

    但是当我通过运行
    serverless deploy-v--stage prod再次部署时,我得到了错误:

      Error: Error: Unable to setup base domain mappings for image.example.com
          at ServerlessCustomDomain.<anonymous> (/Users/me/software/git/zhxword-image/node_modules/serverless-domain-manager/dist/index.js:164:27)
          at Generator.throw (<anonymous>)
          at rejected (/Users/me/software/git/zhxword-image/node_modules/serverless-domain-manager/dist/index.js:6:65)
          at processTicksAndRejections (internal/process/task_queues.js:97:5)
    

    如果希望为dev和prod使用相同的域,可以使用basePath属性。当stage=dev时将其设置为“dev”,当stage=prod时将其设置为“prod”

    下面的serverless.yml应该适合您

    app: zhxw-image                                                            
    service: zhxw-image-service                                                
      
    plugins:
      - serverless-offline                                                     
      - serverless-domain-manager
        
    custom:
      customDomain:
        domainName: image.example.com                                          
        basePath: ${self:provider.stage}  #### Changed here                                                            
        stage: ${self:provider.stage}                                          
        createRoute53Record: true                                              
      serverless-offline:                                                      
        host: '0.0.0.0'                                                        
        httpPort: 4000  
    provider:
      name: aws
      runtime: nodejs12.x
      stage: ${opt:stage, 'dev'}   #### Changed here
    
    运行以下命令将创建端点映像。example.com/dev/

    serverless部署-v--stage dev

    这将创建端点映像。example.com/prod/


    serverless deploy-v--stage prod

    问题可能是因为您试图在两个api中使用相同的域。。。例如,对于“dev”env,我建议您进行更改,例如:
    image-${self:provider.stage}.example.com
    。您不能在两个API网关中使用一个域。@JoseCarlosRamosCarmenates是的,这听起来可能是问题所在。我是否需要为每个阶段设置不同的域?我可以让serverless.yml文件创建一个域,并让stage成为路径的一部分(例如image.example.com/stage/…)顺便说一句,如果最好的做法是为每个stage创建一个单独的域,我会坚持这样做;我对serverless还是相当陌生的。我正在尝试,但有点卡住了。在serverless.yml中,我将stage添加到域名:
    domainName:image-${self:provider.stage}.example.com
    。然后我运行了
    sls create\u domain
    来创建它。已经成功了-image-dev.example.com/ogImage现在启动了。但是当我尝试为prod阶段创建域(
    sls create_domain--stage prod
    )时,它一直在尝试创建开发阶段:“Custom domain image-dev.example.com已经存在。”这有点离题,但是如果您只对使用AWS感兴趣,并且对这方面的内容不熟悉,请查看AWS CDK。最近几个月我已经迁移了所有的堆栈。谢谢你Sarthak。在您看来,您认为最好按照您的建议将stage添加到basePath中,还是为每个stage(例如image-dev.example.com、image-prod.example.com等)创建一个单独的域?我认为这无关紧要:)域名和路径只是为了让客户端更容易阅读/直观地查看URL。所有实际的东西,如Lambda代理集成、API密钥、使用计划、监视、报警等,都是在API网关级别定义的。因此,选择您认为对您的用户/客户更具可读性的选项:)
    app: zhxw-image                                                            
    service: zhxw-image-service                                                
      
    plugins:
      - serverless-offline                                                     
      - serverless-domain-manager
        
    custom:
      customDomain:
        domainName: image.example.com                                          
        basePath: ${self:provider.stage}  #### Changed here                                                            
        stage: ${self:provider.stage}                                          
        createRoute53Record: true                                              
      serverless-offline:                                                      
        host: '0.0.0.0'                                                        
        httpPort: 4000  
    provider:
      name: aws
      runtime: nodejs12.x
      stage: ${opt:stage, 'dev'}   #### Changed here