るいすときのこの物語

オタクエンジニアの雑記

Lambda@EdgeをCircleCI(Apex+シェルスクリプト)でデプロイする


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 git@github.com: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 のキャッシュの削除ができるようになった。

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