λ沢.dev

lambdasawa.dev


Project maintained by lambdasawa Hosted on GitHub Pages — Theme by mattgraham

以下のような感じで Lambda が実行される環境のバージョンの詳細を確認できるサイトを作りました。

screenshot

ホスティングは雑に S3 で行っていて、 http://aws-lambda-versions.s3-website-ap-northeast-1.amazonaws.com/ から閲覧できます。

リポジトリは https://github.com/lambdasawa/aws-lambda-versions で管理されています。

モチベーション

Lambda で動くアプリを作ろうと思った時に細かいバージョン違いによる不具合を防ぐ目的で Lambda とローカルの環境を出来るだけ同じ状態にしたかった。
しかしドキュメントを確認しても Ruby, Python に関してはマイナーバージョンまでしか記載されていないし、 Node.js に関してはメジャーバージョンまでしか記載されていない。

パッチバージョンの違いで問題が起こるとは考えにくいが、無用な心配をしなくて済むならしたくないので一応パッチバージョンまで合わせておきたい。

これを解決するために現在 Lambda で使われている環境のバージョン詳細を手軽に確認できる手段が欲しかった。

設計/実装

まず Lambda を各種ランタイム (Ruby, Python, NodeJS, Java, C#) ごとに作った。
この Lambda は CloudWatch Events で1時間毎に発火する。
各 Lambda 内では自身のランタイムのバージョン詳細を取得して、それをテキストファイルとして S3 に PutObject する。
Lambda 内ではそれ以外には何もしない。色んな言語で同じ実装をするのは面倒なのでここは死ぬほどシンプルになるようにした。

バージョンの保存先を S3 にした理由は static website hosting を有効にすれば簡単にデータを公開できるため。
例えば DynamoDB に保存すると手前に API サーバを置きたくなるが、それを用意するのは面倒なので避けたかった。

ここまでで HTTP でバージョン詳細を取れるようになったため、雑に XHR する JS を含めたペライチの HTML を用意して、それを同様の S3 バケットに配置して終わり。
同じバケットにおけば同じドメインになるので CORS の心配をしなくてもよい。

このサイトは 10 個以上の Lambda を作る必要があるため、 CDK を使った。
同じことを例えば SAM でやろうとすると YAML を生成するような仕組みを作りたくなると思うが、 CDK であれば単に forEach するだけで済むのでこの選択は適切だったと思う。

今後

バージョンが更新された時に何か通知される仕組みを作りたい。
何か楽な実装方法が思いついたら対応すると思います。