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 存储桶设置,但据我所知,以下所有内容都是正确的:
- 我的对象可以公开访问
- 我的对象未使用 KMS 加密
- 我的帐户同时拥有存储桶和对象
我使用以下模板通过 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 和自定义域。这也可以通过控制台实现。
我正在尝试设置一个静态 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 存储桶设置,但据我所知,以下所有内容都是正确的:
- 我的对象可以公开访问
- 我的对象未使用 KMS 加密
- 我的帐户同时拥有存储桶和对象
我使用以下模板通过 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 和自定义域。这也可以通过控制台实现。