CloudFront 502错误(域名解析异常)及CustomOriginConfig下OAI配置咨询
问题描述
我使用S3作为静态网站托管服务并搭配CloudFront,通过CloudFormation和Ansible进行部署,遇到两个问题:
- DomainName引发的502错误:在控制台选择源域名时,默认显示存储桶名称(备用域名),其解析值与我在CloudFormation中配置的一致,但手动修改该配置后,502错误就消失了。
- CustomOriginConfig下的OAI设置:我仅在S3Origin属性中看到OAI相关配置选项,想咨询使用CustomOriginConfig时该如何设置OAI。
相关部署代码
CloudFormation配置
SourceBucket: Type: AWS::S3::Bucket Properties: BucketName: {{ S3.Bucket }} AccessControl: PublicRead WebsiteConfiguration: IndexDocument: index.html VersioningConfiguration: Status: Enabled BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 WebsiteCDN: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: Comment: CDN for S3-backed website Aliases: - !Ref SourceBucket Enabled: "true" DefaultCacheBehavior: Compress: true TargetOriginId: testid-origin ViewerProtocolPolicy: redirect-to-https ForwardedValues: QueryString: "true" DefaultRootObject: index.html Origins: - DomainName: !Join ['', [!Ref SourceBucket, ".s3.", !Ref 'AWS::Region', ".amazonaws.com"]] CustomOriginConfig: HTTPPort: '80' HTTPSPort: '443' OriginProtocolPolicy: https-only Id: testid
Ansible main.yml配置
S3: Bucket: "test-uat12.<domain>.com.au"
问题解答
1. 502错误的原因及修复
你当前CloudFormation中配置的源DomainName是S3的REST API端点(格式为bucketname.s3.region.amazonaws.com),但S3静态网站托管依赖的是网站托管端点(格式为bucketname.s3-website-region.amazonaws.com),二者行为存在本质差异:
- REST API端点要求请求签名(除非桶完全公开),而网站托管端点支持匿名访问静态内容;
- 控制台修改后选择的是网站托管端点,因此能正常返回内容,502错误消失。
修复步骤:
修改CloudFormation中Origins.DomainName为网站托管端点格式,同时调整源协议策略:
Origins: - DomainName: !Join ['', [!Ref SourceBucket, ".s3-website-", !Ref 'AWS::Region', ".amazonaws.com"]] CustomOriginConfig: HTTPPort: '80' HTTPSPort: '443' OriginProtocolPolicy: http-only # S3网站托管端点仅支持HTTP,必须设为此值 Id: testid
额外注意:
- 确保S3桶已启用静态网站托管(代码中已配置
WebsiteConfiguration); - 保持桶的
AccessControl: PublicRead配置,确保匿名用户能访问静态内容。
2. CustomOriginConfig下的OAI使用说明
OAI(Origin Access Identity)是专门为S3Origin(即直接使用S3 REST API端点作为源)设计的身份认证机制,用于让CloudFront成为唯一能访问S3桶的实体,此时桶无需公开访问。
而CustomOriginConfig适用于非S3源(如EC2、自定义服务器)或S3网站托管端点——由于S3网站托管端点不支持OAI认证,因此无法在CustomOriginConfig下使用OAI。
如果想使用OAI,需切换为S3Origin配置,同时用CloudFront的配置替代S3静态网站托管功能:
# 1. 创建CloudFront OAI CloudFrontOAI: Type: AWS::CloudFront::CloudFrontOriginAccessIdentity Properties: CloudFrontOriginAccessIdentityConfig: Comment: OAI for S3 bucket # 2. 修改S3桶为私有,并配置桶策略允许OAI访问 SourceBucket: Type: AWS::S3::Bucket Properties: BucketName: {{ S3.Bucket }} VersioningConfiguration: Status: Enabled BucketEncryption: ServerSideEncryptionConfiguration: - ServerSideEncryptionByDefault: SSEAlgorithm: AES256 BucketPolicy: Statement: - Effect: Allow Principal: AWS: !Sub 'arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ${CloudFrontOAI}' Action: s3:GetObject Resource: !Sub '${SourceBucket.Arn}/*' # 3. 修改CloudFront Distribution使用S3Origin WebsiteCDN: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: Comment: CDN for S3-backed website Aliases: - !Ref SourceBucket Enabled: "true" DefaultCacheBehavior: Compress: true TargetOriginId: testid-origin ViewerProtocolPolicy: redirect-to-https ForwardedValues: QueryString: "true" DefaultRootObject: index.html # 替代S3的IndexDocument配置 Origins: - DomainName: !Join ['', [!Ref SourceBucket, ".s3.", !Ref 'AWS::Region', ".amazonaws.com"]] S3OriginConfig: OriginAccessIdentity: !Sub 'origin-access-identity/cloudfront/${CloudFrontOAI}' Id: testid
内容的提问来源于stack exchange,提问作者choloboy
相关产品推荐
相关产品推荐

