2

我正在使用无服务器框架使用 S3、Lambda 和 API Gateway 创建图像大小调整服务。这与此处的概念相似,但这将使用无服务器来设置和配置整个堆栈。

现在我需要找到一种体面的方法来引用 serverless.yml 文件中生成的 API Gateway 的主机名。这是我在我的资源下拥有的。(只是一个片段)

imageBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: ${env:IMAGE_BUCKET}
    WebsiteConfiguration:
      RoutingRules:
        -
          RedirectRule:
            Hostname: ${HOSTNAME HERE}
            HttpRedirectCode: 302
          RoutingRuleCondition:
            HttpErrorCodeReturnedEquals: 404

它说 ${HOSTNAME HERE} 我需要成为无服务器框架生成的 API Gateway API 的主机名。

现在,我能想到的最好方法是在某处创建一个 CNAME 别名并在我的 API 前面使用它。然后我将该 CNAME 作为环境变量传递,然后在此文件中引用它。但这对我来说并不理想。我希望有人能够将这个项目拉下来,并能够只用一个存储桶名称来运行它。有没有办法做到这一点?

4

1 回答 1

5

cloudformation 不会直接暴露主机名,因此您必须根据创建的资源的输出值来构建它。无服务器框架的所有资源都遵循一定的命名约定: AWS - Resources

使用此信息,您可以通过以下语句创建主机名:

imageBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: ${env:IMAGE_BUCKET}
    WebsiteConfiguration:
      RoutingRules:
        -
          RedirectRule:
            Hostname: 
              Fn::Join:
                - ""
                - - Ref: ApiGatewayRestApi
                  - ".execute-api."
                  - Ref: AWS::Region
                  - ".amazonaws.com"
            HttpRedirectCode: 302
          RoutingRuleCondition:
            HttpErrorCodeReturnedEquals: 404
于 2017-06-14T07:55:21.107 回答