如何使用boto和python3使CloudFront中的对象无效?

时间:2016-03-05 19:00:17

标签: python-3.x amazon-s3 boto3

我发现代码类似于我在page底部所需的代码。

#!/usr/bin/env python3
from boto.cloudfront import CloudFrontConnection

aws_access_key         = 'BJDJLSMQRWDSC4UPLS6S' # Not real
aws_secret_access_key  = '8xRnWKxRR/93TeQv3pwzMNR222nwe5kjhYweCAij' # Not real
aws_cf_distribution_id = 'foobar35'

objects = [ '/index.html' ]
conn = CloudFrontConnection(aws_access_key, aws_secret_access_key)
print(conn.create_invalidation_request(aws_cf_distribution_id, objects))

当我运行它时,我收到以下错误:

$ ./invalidate.py
Traceback (most recent call last):
  File "./invalidate.py", line 14, in <module>
    print(conn.create_invalidation_request(aws_cf_distribution_id, objects))
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/boto/cloudfront/__init__.py", line 263, in create_invalidation_request
    raise CloudFrontServerError(response.status, response.reason, body)
boto.cloudfront.exception.CloudFrontServerError: CloudFrontServerError: 404 Not Found
<?xml version="1.0"?>
<ErrorResponse xmlns="http://cloudfront.amazonaws.com/doc/2010-11-01/">
  <Error>
    <Type>Sender</Type>
    <Code>NoSuchDistribution</Code>
    <Message>The specified distribution does not exist.</Message>
  </Error>
  <RequestId>343d3d5b-e269-11e5-bc96-eb9a228cf3e7</RequestId>
</ErrorResponse>

我认为问题是我还没有确定/index.html所在的S3存储桶。我有大约20个桶,每个桶都以URL的域名部分命名。我尝试了各种排列但无济于事。

  • S3://www.example.com.s3.amazonaws.com/index.html
  • S3://www.example.com/index.html
  • /www.example.com/index.html
  • www.example.com/index.html
  • /index.html

有人可以告诉我如何让它发挥作用吗?

3 个答案:

答案 0 :(得分:4)

实际错误如下:

  

<Message>The specified distribution does not exist.</Message>

根据您的代码,您已将“foobar35”指定为您的分配ID - 这是不正确的。

在尝试使对象无效之前,您需要创建一个分发。创建它之后,您将收到一个分发ID,该ID应作为参数传递给create_invalidation_request方法。

有关详细信息,请参阅:Creating or Updating a Web Distribution Using the CloudFront Console

答案 1 :(得分:0)

Vladimir Mukhin的回答很有帮助:他说我的发行ID不正确,我需要创建一个发行版。但是,我不知道如何获取我的分发ID。我通过查看awscli文档找到了它。答案不仅仅是RTFM,因为我需要的信息并不容易找到。这是最终帮助我的答案

aws cloudfront list-distributions

通过该信息,我能够在Python,Ruby和Perl(Paws)API中找到相似内容,以获得正确的分发ID,而无需向命令行进行外壳处理。希望这有助于某人。

答案 2 :(得分:0)

使用 boto3

def invalidate(distributionId:str, path:str='/*')->str:
  '''
    create a cloudfront invalidation
    parameters:
      distributionId:str: distribution id of the cf distribution
      path:str: path to invalidate, can use wildcard eg. "/*" means all path
    response:
      invalidationId:str: invalidation id
  '''
  cf = boto3.client('cloudfront')
  # Create CloudFront invalidation
  res = cf.create_invalidation(
      DistributionId=distributionId,
      InvalidationBatch={
          'Paths': {
              'Quantity': 1,
              'Items': [
                  path
              ]
          },
          'CallerReference': str(time.time()).replace(".", "")
      }
  )
  invalidation_id = res['Invalidation']['Id']
  return invalidation_id

使用 nicHelper

pip install nicHelper

from nicHelper.cloudfront import invalidate
# invalidate(<distributionId>, <path>)

invalidate("EIOJ239OIUOIU","/*")