Python Fabric で CloudFront の Invalidation

AWS の CloudFront を再構築するのに、 GUI で Invalidation を何度も操作するのは手間ですので、 re:Invent で聞いた Advanced AWS CLI (–query, wait) を参考にして、 Python Fabric で操作できるようにしました。

事前条件

AWS CLI と Fabric がインストール、設定済みであることが前提です。

もし、 AWS CLI で CloudFront が使えないようなら、先に使えるようにする必要があります。

$ aws configure set preview.cloudfront true

コード

fabfile.py のコードは次の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from fabric.api import local
from tempfile import NamedTemporaryFile
from datetime import datetime
import json

AWS = {
  'DistributionId': 'xxxxxxx' # <-- DistributionId を設定する
}

@task
def refresh(paths='/*'):
  items = paths.split(' ')
  inv = {
    'DistributionId': AWS['DistributionId'],
    'InvalidationBatch': {
      'Paths': {
        'Quantity': len(items),
        'Items': items
      },
      'CallerReference': '{0:%Y%m%d%H%M%S}'.format(datetime.now())
    }
  }
  with NamedTemporaryFile(delete=False) as tf:
    json.dump(inv, tf)

  local('aws cloudfront create-invalidation --cli-input-json file://{}'.format(tf.name))
  • テンポラリーの JSON を作って、 aws コマンドに渡すようにしてあります。
  • CallerReference は、年月日時分秒から生成しています。

使い方

デフォルトでは全て再構築します。

$ fab refresh

特定のディレクトリだけ再構築するには、引数にパスを渡します。スペース区切りで複数指定できます。

$ fab refresh:'/2016/07/* /2016/08/*'