You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:05:32