Lambda@Edge の関数をアップデートしたときに CloudFront に指定されている関数のバージョンを自動更新する

CloudFront では、ビューワーリクエストなどのイベントが発火したときに Lambda 関数を実行する機能 “Lambda@Edge” があります。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-edge.html

ところがこれ意外とめんどくさくて、Lambda 関数を CloudFront で設定するときに、どのバージョンの関数を使用するかを数字で指定する必要があります。

The function ARN must reference a specific function version. (The ARN must end with the version number.)

なので、Lambda 関数の新バージョンをリリースするたびにぽちぽちバージョン番号を変えないといけないんですよね。め、めんどくさい。。。w

バージョン番号を自動的にアップデートするシェルスクリプトを作った

そんなわけで、AWS CLI を連打して Lambda の最新バージョンを取得して、CloudFront の設定を更新するシェルスクリプトをつくりました。

#!/usr/bin/env bash

# set -ex

CF_DIST=E20XXXXXXXXX
LAMBDA_EDGE_FUNCTION="arn:aws:lambda:us-east-1:xxxx:function:xxxx"

CONFIG=`aws cloudfront get-distribution-config --id $CF_DIST | jq '.DistributionConfig'`

ETAG=`aws cloudfront get-distribution-config --id $CF_DIST | jq -r '.ETag'`
VERSION=`aws lambda list-versions-by-function --function-name $LAMBDA_EDGE_FUNCTION --region us-east-1 | jq -r '.Versions[-1].Version'`

echo $CONFIG | jq ".DefaultCacheBehavior.LambdaFunctionAssociations.Items[0].LambdaFunctionARN = \"$LAMBDA_EDGE_FUNCTION:$VERSION\"" > update.json

aws cloudfront update-distribution --id $CF_DIST --distribution-config file://update.json --if-match $ETAG

aws cloudfront create-invalidation --distribution-id $CF_DIST --paths "/*"

`CF_DIST` に CloudFront のディストリビューション ID を、`LAMBDA_EDGE_FUNCTION` に Lambda の ARN を指定してコマンドを実行すると、最新版のバージョンを取得して自動的にセットします。