如何为 serverless-1.0.0 框架添加自定义域 defined/deployed API?

How to add a custom domain for a serverless-1.0.0 framework defined/deployed API?

Serverless-1.0.0-rc.1 可以部署一个 API 以通过 AWS API 网关访问。

问题:我需要部署的 API 通过带有 SSL 证书的自定义域公开,而不是随机分配的 URL https://qwertylgbtqert.execute-api....)?

可以在 serverless.yml 或无服务器框架内完成吗?

这是我的简单服务serverless.yml定义:

service: my-service
provider:
  name: aws
  runtime: nodejs4.3

functions:
  generate:
    handler: handler.generate
    events:
      - http:
         method: get
         path: url
         cors: true

有一个问题与此相关:the answer here,但没有提供适用的答案。特别是如何从 serverless.yml 本身内部分配自定义域。

它认为是否可以创建 AWS::Route53 资源并利用它,但是我不知道如何在无服务器中做到这一点。

您需要先创建自定义域并上传证书。这不应该是此代码的一部分或您对该软件的部署。

拥有自定义域后,您需要考虑 CloudFormation。

与无服务器框架中的其他所有内容一样;您可以利用 CloudFormation 模板来管理 AWS 中的资源。

所以你的问题变成了如何将 API 网关添加到 CloudFormation 中的自定义域(提示:如果你搜索 CloudFormation 而不是无服务器框架,Google 上有更多帮助) ?通过在 CloudFormation 中创建 AWS::ApiGateway::BasePathMapping 就是答案。

这是在 serverless.yml 文件的资源中完成的。例如:

resources:
    Resources:
        pathmapping:
            Type: AWS::ApiGateway::BasePathMapping
            Properties:
                BasePath: oauth2
                DomainName: ${self:vars.domainName}
                RestApiId: 
                    Ref: ApiGatewayRestApi
                Stage: ${self:vars.stage}

这要求您在 serverless.env.yml 文件中为您使用的阶段设置 domainNamestageName 的变量。

编辑: 对于 rc1 之前的 Serverless Framework 1 版本,您必须将 DependsOn: IamPolicyLambda 添加到路径映射资源。这已修复:https://github.com/serverless/serverless/pull/1783

在 rc1 之前你应该使用 RestApiApigEvent 而不是 ApiGatewayRestApi

我认为这个主题值得更新,所以我会试一试。请务必先使用 Certificate Manager 创建证书。然后确保您的 "serverless user" 具有修改 Route53 记录集的正确管理员权限。然后将以下内容添加到您的 serverless.yaml:

custom:
  customDomain:
    domainName: "api.example.com"
    certificateName: "*.example.com"
    createRoute53Record: true

plugins:
  - serverless-domain-manager

部署之前 运行(这可能需要一段时间):

serverless create_domain

可以找到来源和其他选项 here