在serverless.yml文件中引用AWS API Gateway的主机名以获取其他CloudFormation资源吗?

arj*_*bar 2 amazon-web-services aws-cloudformation aws-api-gateway serverless-framework serverless-architecture

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

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

imageBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: ${env:IMAGE_BUCKET}
    WebsiteConfiguration:
      RoutingRules:
        -
          RedirectRule:
            Hostname: ${HOSTNAME HERE}
            HttpRedirectCode: 302
          RoutingRuleCondition:
            HttpErrorCodeReturnedEquals: 404
Run Code Online (Sandbox Code Playgroud)

$ {HOSTNAME HERE}的显示位置,我需要为无服务器框架生成的API Gateway API的主机名。

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

jen*_*ter 5

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

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

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
Run Code Online (Sandbox Code Playgroud)