Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
詳解 AWS Lambdaコールドスタート
Search
TomoyaIwata
July 31, 2024
Programming
3.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
詳解 AWS Lambdaコールドスタート
2024/7/29のClassmethod ODYSSEY Onlineで発表した際の資料です
TomoyaIwata
July 31, 2024
More Decks by TomoyaIwata
See All by TomoyaIwata
CIで使うClaude
iwatatomoya
0
260
Lambdaの常識はどう変わる?!re:Invent 2025 before after
iwatatomoya
1
1.3k
Aurora DSQLはサーバーレスアーキテクチャの常識を変えるのか
iwatatomoya
1
2.4k
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
6.6k
Qdrantでベクトルデータベースに入門してみよう
iwatatomoya
0
2.8k
真のサーバーレスへ向けたAuroraの進化Aurora Limitless Database
iwatatomoya
1
5.1k
AWS SDKのClientはFactory経由で作ろう
iwatatomoya
1
1.1k
OpentelemetryでアプリケーションのObservabilityを強化しよう
iwatatomoya
0
1.3k
AWS Lambdaは俺が作った
iwatatomoya
2
3.4k
Other Decks in Programming
See All in Programming
act1-costs.pdf
sumedhbala
0
210
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
110
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
510
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
410
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.3k
そのテスト、説明できますか?~LWテスト戦略FW~のご紹介
nakahara
0
200
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.7k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
260
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
120
OSINT for SRE: 学術論文とポストモーテムから探る システム障害の共通パターン / SRE NEXT 2026
tomoyk
1
3.5k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
200
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Become a Pro
speakerdeck
PRO
31
6k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Technical Leadership for Architectural Decision Making
baasie
3
440
Marketing to machines
jonoalderson
1
5.6k
The Curious Case for Waylosing
cassininazir
1
430
Everyday Curiosity
cassininazir
0
250
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Designing for Performance
lara
611
70k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Transcript
詳解 AWS Lambda コールドスタート 2024.7.29 リテールアプリ共創部 岩⽥ 智哉
このセッションで扱うこと 2 コールドスタート関連の⾖知識 ...70%ぐらい 実務に役⽴つ話 ...30%ぐらい
⾃⼰紹介 3 岩⽥ 智哉 産業⽀援グループ リテールアプリ共創部 マッハチーム 普段は開発やってます TypeScript and
(ECS or Lambda) が多め ⼤阪オフィス所属 好きなAWSサービスはAWS Lambda
コールドスタートのライフサイクル 4 AWS Lambda Under the Hood より引⽤ https://serverlessland.s3.amazonaws.com/pdf/mike_danilov_qcon_23_final.pdf
コールドスタートを改善するには 5 AWSが最適化する領域について 最適化の恩恵を受けやすくする ユーザー側で最適化すべき領域を 最適化する
ここから コールドスタートについて 深堀りしていきます 6
Lambdaの実⾏環境について 7 ↓まずはココの話から
Lambdaの舞台裏 8 Lambda executions - Security Overview of AWS Lambdaより引⽤
https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda/lambda-executions.html Worker
MicroManager 9 Firecracker: Lightweight Virtualization for Serverless Applications より引⽤ https://assets.amazon.science/96/c6/302e527240a3b1f86c86c3e8fc3d/firecracker-lightweight-virtualization-
for-serverless-applications.pdf
Full cold StartとPartial cold Start 10 AWS re:Invent 2020: AWS
Lambda – Part 2: Optimizing your Lambda function performance より引⽤ https://www.youtube.com/watch?v=rrK7PA8ZK7M
LambdaのコードDL 11 ↓続いてココの話
コンテナイメージ 形式のLambda 12
コンテナイメージ形式のLambda 13 re:invent2020で発表 最⼤10Gのコンテナイメージがデプロイ可能 10Gのイメージが数百msで起動可能
なぜコールドスタートが早いのか︖ 14 コンテナイメージを⼩さなチャンクに分割 チャンクは重複排除して保存 オンデマンドでチャンクをロード
コンテナイメージの保存⽅法 15 Deep dive into AWS Lambda security: Function isolation
より引⽤ https://d1.awsstatic.com/events/reinvent/2020/Deep_dive_into_AWS_Lambda_security_Function_isolation_SVS404.pdf Worker
キャッシュヒット率を上げるには 16 AWS が提供するベースイメージは、Lambda サービスによってプロ アクティブにキャッシュされます。つまり、ベースイメージは近く の別のアップストリームキャッシュにあるか、ワーカーインスタン スキャッシュにすでに存在しています。 コンテナイメージとしてパッケージ化された Lambda
関数の最適化 より引⽤ https://aws.amazon.com/jp/blogs/news/optimizing-lambda-functions-packaged-as-container-images/
キャッシュの考え⽅は ZIP形式のパッケージにも 共通しているのか︖︖ 17
その昔…findmntの実⾏結果 18 TARGET SOURCE …略 ├─/var/task /dev/vdb[/opt/amazon/asc/worker/tasks/<AWSアカウン トID>/<Lambda関数名>/<UUIDらしきランダムな⽂字列>] …略 ├─/var/runtime
/dev/root[/opt/amazon/asc/worker/runtime/nodejs-8.x] ├─/var/lang /dev/root[/opt/amazon/asc/worker/lang/node-v8.10.x] …略
聞いてみた 19 サーバーレスアンチパターン今昔物語 第五夜- 解体新書 - https://www.youtube.com/live/rlYurgnHyFY?si=82MI1poDhq34jGcp ⽬の付け所が良いで すね〜 …
これはですね、 回答できません ので、察して下さい
LambdaのInit処理 20 最後にココ↓
LambdaのInitフェーズ 21 コールドスタート時のみ実⾏されるフェーズ DBとの接続などを管理するためのグローバル変数を宣⾔ するプラクティスが知られている 画像は Comparing the effect of
global scope より引⽤ https://docs.aws.amazon.com/ja_jp/lambda/latest/operatorguide/global-scope.html
遅延実⾏について 掘り下げて考える 22
遅延実⾏ 23 import boto3 client = None def handler(event, context):
global client if client is None: client = boto3.client(‘s3’) # ...略 import boto3 client = boto3.client(‘s3') def handler(event, context): # ...略 遅延実⾏なし 遅延実⾏あり
遅延実⾏に効果はあるのか︖ 24 Init Invoke Init Invoke t1 t2 Initフェーズの処理をInvokeフェーズに移動することで Initフェーズを⾼速化
Lambda利⽤者から⾒るとコールドスタート時の処理時間 はInitフェーズ + Invokeフェーズ
遅延実⾏が効果を発揮するケース 25 def handler(event, context): global client # ...略 if
hoge == ‘fuga’ : if client is None: client = boto3.client(‘s3’) Invokeフェーズに移動した処理が呼び出される頻度 次第で全体最適化が図れるかも︖︖
遅延実⾏しない⽅が速い︖︖ 26 遅延実⾏あり 遅延実⾏なし
boost host CPU 27 InitフェーズではCPU割当が最⼤10秒間までブーストする AWS re:Invent 2019: [REPEAT 1]
Best practices for AWS Lambda and Java (SVS403-R1) より引⽤ https://d1.awsstatic.com/events/reinvent/2019/REPEAT_1_Best_practices_for_AWS_Lambda_and_Java_SVS403-R1.pdf
遅延実⾏なしの場合 28 import boto3 client = boto3.client(‘s3') def handler(event, context):
# ...略 (メモリ割当によらず) ブーストしたCPUパワーで処理
遅延実⾏ありの場合 29 import boto3 client = None def handler(event, context):
global client if client is None: client = boto3.client(‘s3’) # ...略 メモリ割当に応じたCPUパワーで処理
boost host CPUの検証 30 boost host CPU 実行 箇所 メモリ
所要時間 有 INIT 128M 約6.02秒 無 INIT 128M 約84.34秒 無 INV OKE 128M 約85.31秒 無 INV OKE 1769M 約6.08秒 メモリ割り当ての追加は Initフェーズの⾼速化につながらない
ここからは⾔語別に コールドスタート改善の TIPSを紹介 31
.NET(C#)の場合 32 Native AOT(Ahead-Of-Time) 実⾏時に中間⾔語からコンパイルするのではなく実⾏ 前に事前にコンパイルする⽅式 .NET 8のランタイムからNative AOTに対応
Node.jsの場合 33 https://dev.classmethod.jp/articles/node-extra-ca-certs-influence-cold-start/ ~Node.js18x: AmazonのRoot CA証明書を読み込む Node.js20x: 追加のRoot CA証明書は読み込まない /var/runtime/ca-cert.pemに全てのAmazonのRoot
CA証明書を含むファイルが配置されている 環境変数NODE_EXTRA_CA_CERTSで指定されたファ イルを追加で読み込む
CA証明書読み込みの影響 34 https://dev.classmethod.jp/articles/node-extra-ca-certs-influence-cold-start/ NODE_EXTRA_CA_CERTS min max avg median 95%tile 設定無し
128.56 201.57 139.8471 137.37 168.3 /var/task/ap-northeast-1-bundle.pem 141.45 216.89 155.3957 153.45 170.87 /var/runtime/ca-cert.pem 156.23 220.24 171.9132 171.59 181.15 追加のCA証明書を読み込まない場合は全部⼊りのCA証明書 を読み込む場合と⽐較して平均30ms程度⾼速に
不要ファイルはデプロイしない 35 REDME.md *.d.ts 単にnpm installしただけだとnode_modulesの中は 不要ファイルでいっぱい
CDKでのNode.js向けレイヤー作成例 36 bundling: { …略 [ …略, 'find node_modules -type
l | xargs rm -f’, 'find node_modules -type f -name *.d.ts | xargs rm -f’, 'modclean -r’, 'node-prune’, 'mv node_modules /asset-output/nodejs/', ].join(' && '),
レイヤーを使うよりバンドルを 37 ESBuild等でバンドルすることで未使⽤のライブラリはデ プロイパッケージに含めない ライブラリのドキュメントなども⾃動的にデプロイ対象外 になる 最近はJSではなくTSを使うケースが多いので、⾃動的に 恩恵を受けているケースも多いはず
今後はLLRTに注⽬ 38 Lambda向けの軽量JavaScriptランタイム JITコンパイラを搭載しない 画像は Lambda Cold Starts analysis より引⽤
https://maxday.github.io/lambda-perf/
Javaの場合 39 Java のようなコンパイル済み⾔語の関数でレイヤーを使⽤しても、Python のようなインタープリター⾔語と同じメリットが得られない場合がありま す。Java はコンパイル済み⾔語なので、関数は初期化フェーズで共有アセ ンブリを⼿動でメモリに読み込む必要があり、コールドスタート時間が⻑ くなる可能性があります。代わりに、コンパイル時にすべての共有コード を含めて、組み込みコンパイラ最適化機能を活⽤することをお勧めします。
.zip または JAR ファイルアーカイブで Java Lambda 関数をデプロイする より引⽤ https://docs.aws.amazon.com/lambda/latest/dg/java-package.html
依存するjarファイルは/libに 40 Java で記述されたデプロイパッケージを Lambda で解凍する所 要時間を短縮します。そのために、依存する .jar ファイルを別個 の
/lib ディレクトリにファイルします。これで関数のすべてのコ ードを多数の .class ファイルと⼀緒に単⼀の Jar に収納するより も⾼速化されます。 AWS Lambda 関数を使⽤するためのベストプラクティス より引⽤ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html
パッケージング⽅法の⽐較 41 AWS re:Invent 2020: Ahead of time: Optimize your
Java application on AWS Lambda より引⽤ https://d1.awsstatic.com/events/reinvent/2020/Ahead_of_time_Optimize_your_Java_application_on_AWS_Lambda_SVS408.pdf
SnapStartを使う 42 re:invent 2022で発表された新機能 Initフェーズ完了後にMicroVMのスナップショットを取得 コールドスタート時にスナップショットからMicroVMをリ ストアして利⽤
スナップショットの構成要素 43 メモリ Lambdaのメモリ割り当てに⽐例して⼤きくなる︖ VMの状態 Disk /tmp領域のサイズに⽐例して⼤きくなる︖ ※SnapStartは512MB以上の/tmp領域と併⽤不可
SnapStartとメモリの関係 44 AWS Lambda Under the Hood より引⽤ https://serverlessland.s3.amazonaws.com/pdf/mike_danilov_qcon_23_final.pdf
リストア時間はメモリに⽐例しない 45 メモリ10GでもRestore Durationは⼗分に短い
Pythonの場合 46 du -d 1 -h lib/python3.12/site-packages/botocore/data/ …略 1.6M lib/python3.12/site-packages/botocore/data//ec2
32K lib/python3.12/site-packages/botocore/data//apprunner 28K lib/python3.12/site-packages/botocore/data//lookoutmetrics 28K lib/python3.12/site-packages/botocore/data//redshift-serverless 18M lib/python3.12/site-packages/botocore/data/ コールドスタート⾼速化のためにboto3をスリム化して改善効果を測定してみた https://dev.classmethod.jp/articles/coldstart-with-minified-boto3/ botocoreから不要サービスのJSONを削除すればスリム化が図れる
botocoreのjsonを事前解凍 47 endpoint-rule-set-1.json.gz examples-1.json paginators-1.json service-2.json.gz waiters-2.json 必要なAWSサービスの定義を事前に解凍 endpoint-rule-set-1.json examples-1.json
paginators-1.json service-2.json waiters-2.json
Client⽣成の所要時間を⽐較 48 def handler(event, context): client = boto3.client(‘dynamodb’) client =
boto3.client(‘iot’) client = boto3.client(‘iot-data’) client = boto3.client(‘s3’) client = boto3.client(‘sns’) client = boto3.client(‘sqs’) client = boto3.client(‘ssm’) メモリ128MBでコールドスタート時のdurationを⽐較
事前解凍で微妙に⾼速化 49 GZIP解凍 件数 最小値 最大値 平均 中央値 95%タイル 無し
99 4317.58 5012.98 4762.81 4772.86 4976.62 有り 99 3254.42 4836.53 4599.8 4610.88 4800.26 filter @type = "REPORT" and ispresent(@initDuration)| stats count(@duration) , min(@duration), max(@duration), avg(@duration), median(@duration) , pct(@duration, 95)
⿊魔術的なテクニックの 利⽤にはご注意ください 50
最後にまとめ 51
まとめ 52 Lambdaを使う以上はコールドスタートは避け られない コールドスタートについて深く理解すること でパフォーマンスが最適化できる このセッションで紹介した知識やTIPSがヒン トになれば
良いLambdaライフを︕ 53
ありがとうございました 54