Cloudfront.net 分发和 Route53 域的 504 错误

504 Error for Cloudfront.net distribution and Route53 Domain

我正在尝试设置一个静态 S3 网站以通过我的自定义域访问,但是当我测试我的云端时 URL 我收到 504 错误并且在日志中,我看到以下:

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>ZFD3NVWGP7DE08W1</RequestId>
<HostId>o2iGHpwIdQjHQ51nG6HwoFtCx5QE9l0rZytYatSMF3zOVjKpHg00ph2vSAiUYJog5ZVsnxr5C18=</HostId>
</Error>

这是我的存储桶策略:

{
    "Version": "2012-10-17",
    "Id": "MyPolicy",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::xyz-cloud-website/*"
        }
    ]
}

我已经按照 AWS 文档中的说明检查了我的 S3 存储桶设置,但据我所知,以下所有内容都是正确的:

我使用以下模板通过 IaC SAM CLI 部署构建了它:

Resources:
  MyWebsite:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      WebsiteConfiguration:
        IndexDocument: index.html
      BucketName: xyz-cloud-website

  MyRoute53Record:
    Type: "AWS::Route53::RecordSetGroup"
    Properties:
      HostedZoneId: 00000000000000000 
      RecordSets:
        - Name: xyz-website.com
          Type: A
          AliasTarget:
            HostedZoneId: Z2FDTNDATAQYW2
            DNSName: !GetAtt MyDistribution.DomainName

  MyDistribution:
    Type: "AWS::CloudFront::Distribution"
    Properties:
      DistributionConfig:
        ViewerCertificate:
          AcmCertificateArn: !Ref MyCertificate
          SslSupportMethod: sni-only
        Aliases:
          - xyz-website.com
        DefaultCacheBehavior:
          ViewerProtocolPolicy: allow-all
          TargetOriginId: xyz-cloud-website.s3-website-us-east-1.amazonaws.com
          DefaultTTL: 0
          MinTTL: 0
          MaxTTL: 0
          ForwardedValues:
            QueryString: "false"
        Origins:
          - DomainName: xyz-cloud-website.s3-website-us-east-1.amazonaws.com
            Id: xyz-cloud-website.s3-website-us-east-1.amazonaws.com
            CustomOriginConfig:
              OriginProtocolPolicy: match-viewer
        Enabled: "true"
        DefaultRootObject: index.html

当我通过 xyz-cloud-website.s3-website-us-east-1.amazonaws.com 访问我的静态 s3 存储桶时,没有任何问题。只有当我尝试使用我的 xyz123.cloudfront.net URL 或我获得 504 的自定义域时。

我的 Cloudfront 域、Alt 和 Origin 看起来都是正确的...关于为什么在我尝试使用 Cloudfront 时会抛出 504 错误的任何想法?尽量避免在 AWS 上花钱寻求个人项目的帮助。

*请注意,在这些示例中,我显然掩盖了我的 URL。正确的在我的模板中并出现在 AWS 控制台中。

我想通了。 CloudFront 希望 Origin 的输入略有不同,因为最近的更新使得去标记静态 S3 存储桶网站的旧方法现在有点不同。

所以代替:

        Origins:
          - DomainName: xyz-cloud-website.s3-website-us-east-1.amazonaws.com
            Id: xyz-cloud-website.s3-website-us-east-1.amazonaws.com
            CustomOriginConfig:
              OriginProtocolPolicy: match-viewer

应该更像:

        Origins:
          - DomainName: xyz-cloud-website.s3.us-east-1.amazonaws.com
            Id: xyz-cloud-website.s3.us-east-1.amazonaws.com
            CustomOriginConfig:
              OriginProtocolPolicy: match-viewer # OR HTTPS-only if appropriate, as it was in my case

这现在按预期显示了我的 CloudFront 和自定义域。这也可以通过控制台实现。