はじめに
こんにちは。ピーディーシー株式会社の宮原です。
この記事ではAWS Lambda作成時に使いまわせる自社ライブラリ作成のヒントをまとめたいと思います。
現状
弊社では100以上のLambdaを作成・運用しています。Lambdaの新規作成時には、最新のソースから必要な箇所や再利用可能な部分を抜き出して作業を開始しています。しかし、以下のような課題が見えてきました。
現在の課題
-
統一された自社用ライブラリの不足
- 全てのLambdaで再利用可能なライブラリがなく、毎回手動で調整が必要。
-
開発効率の低下
- 同じコードの重複記述が多く、可読性やメンテナンス性が低下。
-
ナレッジの分散
- Lambda作成は1人で担当することが多く、個人の経験や知見がチーム全体に共有されにくい。
改善の方向性
これらの課題を解決するため、以下の取り組みを進めています。
-
自社用ライブラリの作成
- チューニングされたコードを共通化し、すべてのLambdaで利用可能に。
-
Lambda Layerの活用
- 自社ライブラリをLambda Layerとして各Lambdaに組み込み、開発・運用コストを削減。
-
知見の蓄積と共有
- 個々の成果物を取りまとめ、チーム全体で再利用可能な形に整理。
以上の改善方針に基づき、自社ライブラリを作成することで工数削減や品質向上を目指します。
具体的には
全Lambdaで流用可能な初期化処理
-
context情報の保存
- Lambda起動時に受け取るcontext情報(function_nameやlog_stream_nameなど)をグローバル変数に保存
-
ロガーの初期化
- printでも構わないが会社固有のフォーマットを使用するなら関数化する
-
Lambda開始時間の保存
- Lambdaの制限時間が最長15分のため、起動時間を保存しておきたい
ロガーの初期化
-
ログフォーマットの定義
- Lambdaのログを以下のようなフォーマットとして出力する
[LogLevel] [FunctionName] Message.
- 構造化ログ(JSON形式)も検討し、クラウドログ解析ツールとの連携を容易にする
- Lambdaのログを以下のようなフォーマットとして出力する
Secret Managerから秘密情報取得
-
接続先などの情報を取得
- Lambdaの環境変数に使いたいSecret Managerの名前を書いて情報取得する
- boto3等のライブラリを使用する
RDS/Redshift/DynamoDBなどのコネクション初期化
-
Secret Managerから各種接続先の情報を取得
- 上記関数で情報を取得
-
コネクションを作成
- 作成したコネクションはグローバル変数に保存
- リトライ処理を実装(環境変数などでリトライ間隔/回数設定)
RDS/Redshift/DynamoDBなどのアクセス用関数
-
DBにアクセスする
- コネクション・SQLを引数とする
- 件数が多くなった時ようにログ出力を制限する(費用削減のため)
メール送信関数
-
メール送信する
- エラー検知などでメールを送信する
- AWS SNS TOPICなどを使用すると手軽
ユーティリティ関数の定義
-
よく使う関数の追加
- nullチェックや桁数チェックなど、プロジェクトでよく使うがデフォルトで定義されていない関数を追加
今後の展望
- ライブラリの自動テスト環境の整備
- ライブラリをアップデートする際の品質担保
- ドキュメント化の強化
- ライブラリの利用方法やベストプラクティスの共有
- オープンソース化の可能性
- 汎用的な部分を抽出し、外部に提供することで他社事例から学ぶ機会を得る
AWS Lambdaのライブラリ作成は、効率化と品質向上を目指すうえで重要な一歩となる可能性があります。
この記事が皆様の参考になれば幸いです。