在使用AWS CloudFront时,如果您想在域名别名上渲染S3存储桶,可以通过以下步骤解决:
在AWS管理控制台中,导航到CloudFront服务。
创建一个新的Distribution或者选择现有的Distribution。
在Distribution设置中,找到"Alternate Domain Names (CNAMEs)"或者"Alternate Domain Names"选项,添加您想要使用的域名别名。
在Origin设置中,选择您的S3存储桶作为Origin Domain Name。
在缓存行为设置中,选择"Use Origin Cache Headers",这样CloudFront将会使用S3存储桶返回的缓存头信息。
点击"Create Distribution"或者"Update Distribution"来保存更改。
接下来是一个使用AWS SDK for Python(Boto3)的代码示例,来创建或更新CloudFront Distribution:
import boto3
def create_or_update_distribution(domain_name, s3_bucket):
cloudfront_client = boto3.client('cloudfront')
distributions = cloudfront_client.list_distributions()
for distribution in distributions['DistributionList']['Items']:
if 'Aliases' in distribution['Aliases'] and domain_name in distribution['Aliases']['Items']:
distribution_id = distribution['Id']
cloudfront_client.update_distribution(
DistributionConfig={
'CallerReference': distribution['CallerReference'],
'DefaultCacheBehavior': distribution['DefaultCacheBehavior'],
'Origins': {
'Quantity': 1,
'Items': [
{
'Id': 'S3-{}-{}'.format(s3_bucket, domain_name),
'DomainName': '{}.s3.amazonaws.com'.format(s3_bucket),
'S3OriginConfig': {
'OriginAccessIdentity': ''
},
'CustomOriginConfig': {
'HTTPPort': 80,
'HTTPSPort': 443,
'OriginProtocolPolicy': 'https-only'
}
}
]
},
'Aliases': {
'Quantity': 1,
'Items': [domain_name]
},
'DefaultRootObject': distribution['DefaultRootObject'],
'Comment': distribution['Comment'],
'Enabled': distribution['Enabled'],
'PriceClass': distribution['PriceClass'],
'ViewerCertificate': distribution['ViewerCertificate'],
'Restrictions': distribution['Restrictions']
},
Id=distribution_id,
IfMatch=distribution['ETag']
)
print('CloudFront Distribution updated successfully.')
return
cloudfront_client.create_distribution(
DistributionConfig={
'CallerReference': domain_name,
'DefaultCacheBehavior': {
'TargetOriginId': 'S3-{}-{}'.format(s3_bucket, domain_name),
'ViewerProtocolPolicy': 'redirect-to-https',
'AllowedMethods': {
'Quantity': 7,
'Items': ['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']
},
'Compress': True,
'CachePolicyId': '658327ea-f89d-4fab-a63d-7e88639e58f6',
'OriginRequestPolicyId': '658327ea-f89d-4fab-a63d-7e88639e58f6',
'TrustedKeyGroups': {
'Enabled': False,
'Quantity': 0
},
'TrustedSigners': {
'Enabled': False,
'Quantity': 0
},
},
'Origins': {
'Quantity': 1,
'Items': [
{
'Id': 'S3-{}-{}'.format(s3_bucket, domain_name),
'DomainName': '{}.s3.amazonaws.com'.format(s3_bucket),
'S3OriginConfig': {
'OriginAccessIdentity': ''
},
'CustomOriginConfig': {
'HTTPPort': 80,
'HTTPSPort': 443,
'OriginProtocolPolicy': 'https-only'
}
}
]
},
'Aliases': {
'Quantity': 1,
'Items': [domain_name]
},
'DefaultRootObject': '',
'Comment': '',
'Enabled': True,
'PriceClass': 'PriceClass_All',
'ViewerCertificate': {
'CloudFrontDefaultCertificate': True,
'MinimumProtocolVersion': 'TLSv1.2_2018',
'CertificateSource': 'cloudfront'
},
'Restrictions': {
'GeoRestriction': {