Lambda@Edge のデプロイについて
serverless framework や Apex では Lambda@Edge のデプロイが可能です。
しかし、serverless framework では記述内容も機能も多すぎるため1ファンクションだけ Lambda@Edge を使いたい場合には少し重すぎるため Apex + シェルスクリプトで Lambda のデプロイから、CloudFront への反映、キャッシュ削除の一連を CircleCI でやってみようと思います。
Apex + シェルスクリプトを使うのは IaC ではなく、Toil の撲滅です。
Lambda 自体はシンプルで大したことをやっていませんが、GUI を開いて画面ポチポチもまぁまぁ面倒です。
Apex
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
べた書きだけど許してほしい