在其他 CloudFormation 资源的 serverless.yml 文件中引用 AWS API 网关的主机名?

Reference AWS API Gateway's hostname within the serverless.yml file for other CloudFormation resources?

我正在使用无服务器框架创建一个使用 S3、Lambda 和 API 网关的图像大小调整服务。这类似于概念 here,但是这将使用无服务器来设置和配置整个堆栈。

现在我需要找到一种合适的方法来引用 serverless.yml 文件中生成的 API 网关的主机名。这就是我的资源。 (只是一个片段)

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

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

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

主机名不直接由 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