AWS Lambda
Lambdaレイヤー
カスタムレイヤーを使用すると、pandasやnumpyなど通常は使用できないライブラリをPythonのLambdaで使用することが可能になる。
Lambdaを用いたアプリケーションのDBデータ暗号化
以下の実装で作成することで問題ない。
データを保存するとき
Lambdaが平文のデータを受け取る
LambdaがKMSを使ってデータを暗号化する
Lambdaが暗号文をRDSに書き込む
データを取得するとき
Lambdaが暗号文のデータをRDSから取得する
LambdaがKMSを使ってデータを複合する
Lambdaが平文のデータを返す
大量に動く可能性がある場合、KMSのAPI課金、スロットル対策のため、Lambda側でKMSの鍵情報、一次キャッシュする仕組みが必要となる場合がある。 実現する場合は、AWS Encryption SDKなどが使用可能。
ただし、RDBMSが備えるインデックスなどの利用も制限される事になるため、認識しておく必要がある。
逆にキャッシュしない方が良い場合は、ローテーションを必要とする場合など、古いキャッシュ利用が問題となったりするケース。 実装ミスなどあれば、間接的に秘匿情報の漏洩リスクなども高まるため、API課金、スロットルの心配が無い箇所で使うなら、キャッシュさせないほうがいい場合もある。
Lambda Extensions
Lambdaに対する様々な拡張機能が付与可能。
リリース時はモニタリング用途、ツールのインストール、セキュリティ用途、シークレットの取得などに対応していた模様。
Paramter StoreやSSMからSDKを使わずに直接値を取得可能に (2022-10-20)
Lambda Extensionsを仕組みとして使用している。
キャッシュが働くため、コスト削減にもつながる様子。
実装自体は、Lambdaの実行環境内でHTTPサーバーのプロセスを起動し、このサーバーに対してリクエストすることで値を取得している。 (Lambda実行環境内でリバースプロキシをデプロイするExtensionのようなイメージ)
なので高速なのは自前実装でメモリ内でキャッシュを実現する方法のようだ。
さらに細かく調べた記事によれば、実装はGoでなされており、POSTやQuery-Stringが不正などの場合は400番台のエラーを返すようです。
Lambda ENI Finder
ENIが削除できず、どのLambdaに紐づけられているか分からない場合にLambda ENI Finderが使えるらしい。
LambdaのContextの中身
以下のような感じらしい。aws_request_idは識別子として使えるのかも。
function_name: hoge-dev-InvokeStateMachine
function_version: $LATEST
invoked_function_arn: arn:aws:lambda:ap-northeast-1:123456789012:function:hoge-dev-InvokeStateMachine
memory_limit_in_mb: 128
aws_request_id: 4c8443bd-f044-4c06-8ad1-7d8c351fb57f
log_group_name: /aws/lambda/hoge-dev-InvokeStateMachine
log_stream_name: 2022/08/22/[$LATEST]7dc42810d4254fc1a5bd0d5f28750f32
VPC Lambda
通常はLambdaはVPC外に配置するが、プライベートなVPCで使用したい場合にはVPC Lambdaを使用する。
ちなみにVPC LambdaをpublicなVPC(IGWあり)に配置する場合、public IPをもつENIをVPC LambdaにアタッチしないとIGWと接続できないらしい。
Lambdaのリトライ
リトライのRequest Idは同じになるらしい。
なのでリトライ回数に応じて処理を帰るなどの事例もある。
Articles
2019-03-03 今度こそ理解する!俺式Lambda入門
最初に読むのはすごく良い気がする
Update
2023-01-17 SQSをイベントソースとして利用する際に同時実行数が設定できるように
これまでSQSをイベントソースとする際の同時実行数は、Lambda関数の「同時実行の予約」で行っていたが、直感的に設定が可能になった。
2023-01-24 Lambdaで新しい「ランタイム管理設定」が追加されました
ランタイムそのもののバージョン制御ではない(3.8 -> 3.9ではない)ので注意が必要。
関数の更新にアップデートするなどが選択できるが、自動が推奨。関数を更新する予定が無い場合は自動にすべきとのこと。
2023-04-07 レスポンスをストリーミングで返せるように
APIGWでは使えないので、Lambda関数URLなどを使用する必要がある。
2023-04-18 Python 3.10のruntimeに対応
そもそもPython 3.10の新機能にもフィーチャーして紹介されている。
Structural pattern matching (PEP 634):
構造的パターンマッチ(match-case文)の導入
Parenthesized context managers (BPO-12782):
複数contextmanagerを使う場合に、withのネストする必要がないという理解
Writing union types as X | Y (PEP 604):
Union[X,Y]
と書いていたものが、X | Y
で良くなるということらしい
User-defined type guards (PEP 647):
型チェックツールをより正確に動かすことができるということみたい
Improved error messages:
2023-07-13 AWS LambdaがLambda関数内の再帰ループを検出して停止するように
Amazon SQS、AWS Lambda、Amazon SNS間の再帰的な呼び出しを16回行った時点で停止する
関数が Amazon SQS または Amazon SNS にイベントを送信すると、Lambda はそのイベントに基づいて関数が呼び出された回数を追跡
同じトリガーイベントによって関数が16回以上起動された場合、Lambdaは次の起動を停止し、設定されていればデッドレターキューまたは障害発生時にイベントを送信
2023-07-17 AWS LambdaとAmazon EventBridge Pipesがフィルタリング機能を強化
以下のフィルタリング機能などをサポート
値の末尾の文字に対するマッチング (サフィックスフィルタリング)
大文字小文字の区別を無視する (equals-ignore-case)
複数のフィールドにまたがる条件が真である場合に単一のルールでマッチングする (OR マッチング)
また数値の境界を従来の-1e9~1e9から-5e9~5e9に増加
2023-07-27 AWS LambdaがPython 3.11をサポート
個人的に注目は以下
PEP 657: Fine-grained error locations in tracebacks
エラーメッセージがより分かりやすく
PEP 646: Variadic generics
型指定の改善
PEP 655: Marking individual TypedDict items as required or not-required
型指定の改善
PEP 673: Self type
型指定の改善
PEP 675: Arbitrary literal string type
インジェクションからの保護
PEP 681: Data class transforms
Last updated