如何通过API/SDK确认AWS CloudFront分发未被使用后再禁用?
操作方案:筛选、验证并禁用未使用的CloudFront默认证书分发
1. 筛选使用默认证书的分发
通过AWS SDK(以Python的boto3为例)遍历所有CloudFront分发,筛选出使用CloudFront默认证书的实例。默认证书的标识是分发配置中ViewerCertificate.CloudFrontDefaultCertificate为True,或者证书ARN匹配arn:aws:cloudfront::cloudfront:default-certificate。
示例代码:
import boto3 cloudfront = boto3.client('cloudfront') # 列出所有分发 response = cloudfront.list_distributions() distributions = response['DistributionList']['Items'] # 筛选使用默认证书的分发 default_cert_dists = [] for dist in distributions: cert_config = dist['ViewerCertificate'] if cert_config.get('CloudFrontDefaultCertificate') is True: default_cert_dists.append({ 'Id': dist['Id'], 'DomainName': dist['DomainName'], 'Enabled': dist['Enabled'] }) print(f"找到 {len(default_cert_dists)} 个使用默认证书的分发")
2. 验证分发是否未被访问(通过CloudWatch指标)
不用分析日志,直接用CloudFront的CloudWatch指标查询指定时间区间的请求总量,这是最简便的方法。核心指标是Requests,统计指定时间段内的请求数总和即可判断是否有访问。
示例代码(查询过去7天的请求总量):
from datetime import datetime, timedelta cloudwatch = boto3.client('cloudwatch') def get_dist_request_count(dist_id, days=7): end_time = datetime.utcnow() start_time = end_time - timedelta(days=days) response = cloudwatch.get_metric_statistics( Namespace='AWS/CloudFront', MetricName='Requests', Dimensions=[ { 'Name': 'DistributionId', 'Value': dist_id }, { 'Name': 'Region', 'Value': 'Global' # CloudFront是全球服务,固定为Global } ], StartTime=start_time, EndTime=end_time, Period=86400, # 按天统计,单位秒 Statistics=['Sum'], Unit='Count' ) # 计算总请求数 total_requests = sum(datapoint['Sum'] for datapoint in response['Datapoints']) return total_requests # 遍历筛选出的分发,检查请求量 for dist in default_cert_dists: req_count = get_dist_request_count(dist['Id']) print(f"分发ID {dist['Id']} ({dist['DomainName']}) 过去7天请求量: {req_count}") if req_count == 0 and dist['Enabled']: print("该分发无访问记录,可考虑禁用")
注意:CloudFront指标存在约15分钟的延迟,查询时确保结束时间不是当前时刻,或者延长统计区间覆盖延迟窗口。
3. 禁用目标分发
确认分发无访问记录后,通过SDK更新分发配置,将Enabled字段设为False。更新时需要携带当前配置的ETag(IfMatch参数),避免并发修改冲突。
示例代码:
def disable_distribution(dist_id): # 获取当前分发配置和ETag dist_response = cloudfront.get_distribution(Id=dist_id) current_config = dist_response['Distribution']['DistributionConfig'] etag = dist_response['ETag'] # 修改启用状态 current_config['Enabled'] = False # 更新分发 update_response = cloudfront.update_distribution( DistributionConfig=current_config, Id=dist_id, IfMatch=etag ) print(f"分发 {dist_id} 已提交禁用请求,新状态: {update_response['Distribution']['Enabled']}") # 对无访问的分发执行禁用 for dist in default_cert_dists: if get_dist_request_count(dist['Id']) == 0 and dist['Enabled']: disable_distribution(dist['Id'])
额外注意事项
- 即使请求量为0,建议同步检查分发关联的CNAME记录是否已从DNS系统移除,避免后续误访问导致的403错误。
- 对于长期未更新的分发,可结合
LastModifiedTime字段辅助判断活跃度,但核心判断依据仍是请求量。 - 禁用分发后,CloudFront仍会保留配置,如需彻底清理可后续删除分发(但删除前需确保无关联资源)。
内容的提问来源于stack exchange,提问作者matano
相关产品推荐
相关产品推荐

