Lambda@Edge のデプロイについて

serverless framework や Apex では Lambda@Edge のデプロイが可能です。
しかし、serverless framework では記述内容も機能も多すぎるため1ファンクションだけ Lambda@Edge を使いたい場合には少し重すぎるため Apex + シェルスクリプトで Lambda のデプロイから、CloudFront への反映、キャッシュ削除の一連を CircleCI でやってみようと思います。

Apex + シェルスクリプトを使うのは IaC ではなく、Toil の撲滅です。
Lambda 自体はシンプルで大したことをやっていませんが、GUI を開いて画面ポチポチもまぁまぁ面倒です。

Apex

github.com

Lambda をデプロイできます。
Lambda@Edge を使うときの “edge”: true があります。

Apex ではデフォルトで Lambda の環境変数に2つ挿入されますが Lambda@Edge では環境変数があると設定できないため、このオプションではそれらの環境変数が挿入されなくなり、リージョンも us-east-1 に固定されます。

README.md にあるインストール方法では古いバージョンがインストールされるためソースから引っ張ってくる必要があります。

$ git clone [email protected]:apex/apex.git
$ cd apex && go install ./...
$ apex version

このとき、表示されるバージョンは古いですが最新のものなのでご安心を。
どうやら GO111MODULE によるリリースに手こずってるっぽい。

デプロイする

Lambda: noindex

$ ~/hasegawa-test » tree .
.
├── functions
│   └── noindex
│       ├── function.json
│       └── index.js
├── project.json
└── update_cf.sh

project.json

{
"name": "apex",
"memory": 128,
"timeout": 5
}

function.json

{
"name": "noindex",
"description": "deploy by apex",
"region": "us-east-1",
"runtime": "nodejs8.10",
"edge": true,
"memory": 128,
"timeout": 5,
"role": "arn:aws:iam::1111111111111:role/service-role/noindex-role-3upu771y"
}

index.js

exports.handler = async (event, context, callback) => {
const request = event.Records[0].cf.request;
if (request.uri.lastIndexOf('index.html') === -1) {
request.uri = request.uri + '/index.html';
}
callback(null, request);
};

デプロイ

$ apex deploy noindex

バージニア北部に Lambda が作られたら成功

CloudFront と紐付けるシェルスクリプト

CircleCI

べた書きだけど許してほしい

まとめ

CircleCI + Apex + シェルスクリプト
Lambda を GitHub で管理することができて、プッシュすると
Lambda@Edge の更新、CloudFront のキャッシュの削除ができるようになった。

紐付ける部分はシェルスクリプトじゃなくても良いけどね👳