スライド/Python LambdaのSnapStartとAWS Lambda Powertools version 21

2025/02/08 13:26 by sinofseven
  :追加された部分   :削除された部分
(差分が大きい場合、文字単位では表示しません)
スライド/Python LambdaのSnapStartとAWS Lambda Powertools
## 自己紹介
- 夏目 祐樹 (ナツメ ユウタ)
- クラスメソッド
  - 製造ビジネステクノロジー部
- 好きなAWS Service
  - Lambda, DynamoDB, SQS, S3
- 近況
  - FF7 Rebirthを100時間以上プレイするもクリアまで行かず

---

## Cold Start

---

## Cold Start

![[9005460307943389] perf-optimize-figure-1](https://mimemo.s3-ap-northeast-1.amazonaws.com/attachment/8c497cf2-dbeb-4943-9a69-3d9c33375fb9.png)

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html#cold-start-latency

- AWS公式の考え方ではMicro VMの作成までがコールドスタート
  - 再実行時はハンドラの実行から
  - 広義の考え方ではコードの初期化も含める

---

## Cold Start

- どうしてもコードの初期化で初回の実行は遅くなる
  - Pythonのboto3の読み込みでも1秒くらいかかる
    - Pandasとか重いライブラリを読めばもっとかかる
- GoやRustなどシングルバイナリを生成するような言語ではコールドスタートもウォームスタートも大した差にはならない

---

## ユーザーのくふう (1)

- 手動ウォームアップ
  - 何らかの手段でLambdaを実行させCold Startを回避する
  - ただし
    - 手動ウォームアップの実行中にリクエストが来たらCold Startが起きる
    - 事前に立ち上げた数よりも多いリクエストが来たらCold Startが起きる

---

## ユーザーのくふう (2)

- Lambdalith (Monolithic function)
  - 1つのLambdaで複数のイベントを処理する
  - 例えば、APIで複数のパスを一つのLambdaで処理する
  - ただし、Cold Startを多少抑制できる程度

---

## AWSのくふう (1)

- Provisioned Concurrency
  - AWSによる自動ウォームアップ
  - ただし
    - 設定した実行数よりも多いリクエストが来たらCold Startが起きる
    - ウォームアップしている期間についても課金される

---

## AWSのくふう (2)

- Snap Start (Java)
  - re:Invent 2022で発表された機能
  - Java 11以降で使用可能
  - コードの初期化済みの環境をキャッシュし、そこから実行することで広義のコールドスタートを高速化する

---

## Pythonと.NETでSnapStartのサポートを開始

---

## AWSのくふう (3)

- SnapStart (Python, .NET)
  - 2024/11/18から利用できるようになった
  - Python 3.12 以降と .NET 8以降で使用可能

---

## SnapStartの特徴

- 初期化された実行環境のメモリとディスク状態のFirecracker microVMのスナップショットを保存し、それを再利用することで初回実行を高速化する
- スナップショットの保存はLambda関数のバージョン発行時
- 使用できるリージョンは9つ
  - バージニア北部, オハイオ, オレゴン, シンガポール, シドニー, 東京, フランクフルト, アイルランド, ストックホルム

---

## SnapStartの課金体系

- Pythonと.NETでは使用に料金がかかる (Javaは無料)
- Lambda関数のバージョン毎に課金される
- 課金体系は二つ
  - キャッシュの保存期間
    - 最低3時間, 以後ミリ秒単位で課金
    - USD 0.0000015046/GB*秒
    - USD 3.9540888/GB*月 (730h/月)
  - キャッシュのレストア回数
    - USD 0.0001397998/GB*回
    - 7153.1回*GB/USD

---

## Python RuntimeのSnapStart (1)

- Handlerに設定しているPythonファイルをインポートしてから、キャッシュが作成される
- そのためグローバル領域での処理は行われる
  - そのためグローバル領域での処理は行われる

---

## Python RuntimeのSnapStart (2)

```python
import json
from datetime import datetime, timezone

dt_cache = datetime.now(timezone.utc)


def lambda_handler(event, context):
    # TODO implement
    data = {
        "cache": str(dt_cache),
        "now:": str(datetime.now(timezone.utc))
    }
    text = json.dumps(data)
    print(text)
    return data
```

---

## Python RuntimeのSnapStart (3)

```js
{
    "cache": "2025-02-07 18:19:44.945058+00:00",
    "now:": "2025-02-07 18:22:03.355189+00:00"
}
```

```js
{
    "cache": "2025-02-07 18:19:44.945058+00:00",
    "now:": "2025-02-07 18:22:13.156636+00:00"
}
```

---

## Python RuntimeのSnapStart (4)

- グローバル領域でデータを取得するように書けば、事前に大きなデータをダウンロードしておくこともできる
  - バージョン発行時に取得するので、動的に何かを取得するようなことでは注意が必要
- バージョン発行時なので環境変数も保持されている

---

## Python RuntimeのSnapStartの注意点

- SnapStartのキャッシュ課金はLambda関数のバージョン毎に行われる
  - バージョンを保存するか削除するかをきちんと管理しないと、アップデートのたびに料金が増えていく

---

## SAMで最新バージョンのみ残す書き方

```yaml
Transform: AWS::Serverless-2016-10-31

Resources:
  Function:
    Type: AWS::Serverless::Function
    DeletionPolicy: Delete
    Properties:
      AutoPublishAlias: prod
      ...
```      

自己紹介

  • 夏目 祐樹 (ナツメ ユウタ)
  • クラスメソッド
    • 製造ビジネステクノロジー部
  • 好きなAWS Service
    • Lambda, DynamoDB, SQS, S3
  • 近況
    • FF7 Rebirthを100時間以上プレイするもクリアまで行かず

Cold Start


Cold Start

[9005460307943389] perf-optimize-figure-1

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtime-environment.html#cold-start-latency

  • AWS公式の考え方ではMicro VMの作成までがコールドスタート
    • 再実行時はハンドラの実行から
    • 広義の考え方ではコードの初期化も含める

Cold Start

  • どうしてもコードの初期化で初回の実行は遅くなる
    • Pythonのboto3の読み込みでも1秒くらいかかる
      • Pandasとか重いライブラリを読めばもっとかかる
  • GoやRustなどシングルバイナリを生成するような言語ではコールドスタートもウォームスタートも大した差にはならない

ユーザーのくふう (1)

  • 手動ウォームアップ
    • 何らかの手段でLambdaを実行させCold Startを回避する
    • ただし
      • 手動ウォームアップの実行中にリクエストが来たらCold Startが起きる
      • 事前に立ち上げた数よりも多いリクエストが来たらCold Startが起きる

ユーザーのくふう (2)

  • Lambdalith (Monolithic function)
    • 1つのLambdaで複数のイベントを処理する
    • 例えば、APIで複数のパスを一つのLambdaで処理する
    • ただし、Cold Startを多少抑制できる程度

AWSのくふう (1)

  • Provisioned Concurrency
    • AWSによる自動ウォームアップ
    • ただし
      • 設定した実行数よりも多いリクエストが来たらCold Startが起きる
      • ウォームアップしている期間についても課金される

AWSのくふう (2)

  • Snap Start (Java)
    • re:Invent 2022で発表された機能
    • Java 11以降で使用可能
    • コードの初期化済みの環境をキャッシュし、そこから実行することで広義のコールドスタートを高速化する

Pythonと.NETでSnapStartのサポートを開始


AWSのくふう (3)

  • SnapStart (Python, .NET)
    • 2024/11/18から利用できるようになった
    • Python 3.12 以降と .NET 8以降で使用可能

SnapStartの特徴

  • 初期化された実行環境のメモリとディスク状態のFirecracker microVMのスナップショットを保存し、それを再利用することで初回実行を高速化する
  • スナップショットの保存はLambda関数のバージョン発行時
  • 使用できるリージョンは9つ
    • バージニア北部, オハイオ, オレゴン, シンガポール, シドニー, 東京, フランクフルト, アイルランド, ストックホルム

SnapStartの課金体系

  • Pythonと.NETでは使用に料金がかかる (Javaは無料)
  • Lambda関数のバージョン毎に課金される
  • 課金体系は二つ
    • キャッシュの保存期間
      • 最低3時間, 以後ミリ秒単位で課金
      • USD 0.0000015046/GB*秒
      • USD 3.9540888/GB*月 (730h/月)
    • キャッシュのレストア回数
      • USD 0.0001397998/GB*回
      • 7153.1回*GB/USD

Python RuntimeのSnapStart (1)

  • Handlerに設定しているPythonファイルをインポートしてから、キャッシュが作成される
    • そのためグローバル領域での処理は行われる

Python RuntimeのSnapStart (2)

import json
from datetime import datetime, timezone

dt_cache = datetime.now(timezone.utc)


def lambda_handler(event, context):
    data = {
        "cache": str(dt_cache),
        "now:": str(datetime.now(timezone.utc))
    }
    text = json.dumps(data)
    print(text)
    return data

Python RuntimeのSnapStart (3)

{
    "cache": "2025-02-07 18:19:44.945058+00:00",
    "now:": "2025-02-07 18:22:03.355189+00:00"
}
{
    "cache": "2025-02-07 18:19:44.945058+00:00",
    "now:": "2025-02-07 18:22:13.156636+00:00"
}

Python RuntimeのSnapStart (4)

  • グローバル領域でデータを取得するように書けば、事前に大きなデータをダウンロードしておくこともできる
    • バージョン発行時に取得するので、動的に何かを取得するようなことでは注意が必要
  • バージョン発行時なので環境変数も保持されている

Python RuntimeのSnapStartの注意点

  • SnapStartのキャッシュ課金はLambda関数のバージョン毎に行われる
    • バージョンを保存するか削除するかをきちんと管理しないと、アップデートのたびに料金が増えていく

SAMで最新バージョンのみ残す書き方

Transform: AWS::Serverless-2016-10-31

Resources:
  Function:
    Type: AWS::Serverless::Function
    DeletionPolicy: Delete
    Properties:
      AutoPublishAlias: prod
      ...