はじめに
AWSの新しいアイコンに慣れるため小ネタを連発しております。
Lambdaで機密情報(鍵等)利用するなら、SSMパラメータストアを利用しましょう!
という事でKMS暗号化を施した文字列を利用する際は、結構パフォーマンスが落ちるので
キャッシング等を利用しましょうというネタです。
検証した構成は非常にシンプルな物です。
※ALBはRegional,SSMでは安全な文字列を指定のためKMSが利用される設定です。
目次
性能について
対して参考になるわけでもないですが一応...
if not self.機密情報_exists() or Lambda環境変数 SSM_CACHEがOFFならば: client = boto3.client('ssm') res = client.get_parameters( Names=パラメータキー, WithDecryption=True ) ... self.機密情報 = SSMより取得した秘密文字列
当然個体差・環境差がございますが256MBLambdaにて下記のような結果でした、
(他の処理も入っているため、このような結果になることを保証するわけではありません。)
SSM_CACHEをOFFとした場合
- 21req/s エラー率 13% レスポンスタイムは 3.6秒程
SSM_CACHEをONとした場合
- 100req/s以上 エラー率 0% レスポンスタイムは 1秒以内
まとめ
高頻度で呼び出されるLambda関数にてSSMより値を取得する場合にはキャッシング等を活用しないと難しい事が分かりました。
Lambdaの性質上新しいホストでの初回実行時にはある程度時間が掛かる事を見越しておく必要があります。
また、実運用でLambdaを常時Latestに向けているケースも少ないと思いますので、上記のような実装ですと
Lambdaが完全にアンロードされる or 再デプロイ等まで、キャッシングされた内容は更新されないため注意が必要です。