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 のコードは次の通りです。

# python2 & fabric1
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))
# python3 & fabric2
import json
from datetime import datetime
from tempfile import NamedTemporaryFile
from invoke import task, run

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

@task
def refresh(c, 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(mode='w+t', encoding='utf-8', delete=False) as tf:
    json.dump(inv, tf)

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

使い方

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

$ fab refresh

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

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

links

social