AWS Lambdaで
pythonを実行するときのチュー
ニング案を試してみた!
2020/07/03
深澤 俊
3自己紹介
深澤 俊(Fukazawa Shun)
クラスメソッド株式会社
SA(ソリューションアーキテクト)
AWSの導入支援や
ブログでのアウトプットに励んでいる。 @shun_quartet
4アジェンダ
• AWS Lambdaについて
• 実行コンテキストを活用した初期化処理の再利
用
• boto3の軽量化
• スケールアップ
5AWS Lambdaについて
まずは簡単におさらい
6AWS Lambda について
• AWS Lambda
• ジャンルとしてはFaaS
• サーバを意識せずコードを実行
• デプロイはZipをアップロード
• バッチ処理からサーバレスバックエンドまで
幅広く活用
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
7
簡単にPythonが実行できる!
8
ここから本題
9実行コンテキストを活用した初期化処理の再利用
実行コンテキスト?
10実行コンテキストを活用した初期化処理の再利用
• まずはLambdaのライフサイクルを整理
lambda実行
一定時間経過
停止
実行命令
デプロイパッケージのダウンロード
解凍
lambdaの起動
lambda実行
11実行コンテキストを活用した初期化処理の再利用
• まずはLambdaのライフサイクルを整理
コールドスタート
lambda実行
一定時間経過
停止
実行命令
デプロイパッケージのダウンロード
解凍
lambdaの起動
lambda実行
12実行コンテキストを活用した初期化処理の再利用
• まずはLambdaのライフサイクルを整理
コールドスタート
によって作られるのが
実行コンテキスト
lambda実行
一定時間経過
停止
実行命令
デプロイパッケージのダウンロード
解凍
lambdaの起動
lambda実行
13実行コンテキストを活用した初期化処理の再利用
14実行コンテキストを活用した初期化処理の再利用
Lambdaから
都度実行
15実行コンテキストを活用した初期化処理の再利用
コールドスタート
の一回のみ実行
Lambdaから
都度実行
16実行コンテキストを活用した初期化処理の再利用
インスタンス化をハンドラー外へ
17実行コンテキストを活用した初期化処理の再利用
コールドスタート
の一回のみ実行
Lambdaから
都度実行
18実行コンテキストを活用した初期化処理の再利用
ロードにかかる2秒を
最初だけにすることができる
19実行コンテキストを活用した初期化処理の再利用
• 活用案について
• ロードに時間のかかるクラスのインスタンス化
• 使い回し可能なクラスのインスタンス化
• 例:DBへの接続キャッシュ(コネクションプール?)
• RDS ProxyなるものがGAされました
• https://dev.classmethod.jp/articles/rds-proxy-ga/
20boto3の軽量化
boto3?
21boto3の軽量化
• boto3について
• Python版AWS SDK
• PythonのコードからAWSのAPIを叩く
• https://aws.amazon.com/jp/sdk-for-python/
22boto3の軽量化
• Lambdaからはimportするだけで利用可能
• 最新のAWSリソースを使いたい場合には最新版の
boto3をダウンロードし自力でデプロイパッケージ
に含める
• https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-package.html
23
しかしboto3はサイズが大きく
デプロイパッケージに含めると
コールドスタートが重たくなる
24boto3の軽量化
• boto3やbotocoreの構造
boto3
├── __init__.py
├── data
│ ├── cloudformation
〜〜〜
│ ├── cloudwatch
〜〜〜
│ ├── dynamodb
〜〜〜
│ ├── ec2
〜〜〜
Dataディレクトリ配下に各AWSサービスの
定義が格納されている
• リクエストエンドポイント
• パラメータなど
25
消してデプロイしてみた
26boto3の軽量化
• Lambdaコード
27boto3の軽量化
• 結果
ケース 起動にかかった時間(ms)
デプロイパッケージに何も含
めない(初期)
1547.16
軽量化しないboto3を
パッケージin
4000.09
軽量化したboto3を
パッケージin
3806.98
• 軽量化した方が起動スピードは上がった
• Lambdaに同梱されているboto3を使うのがコールドス
タートの観点だとベスト
28スケールアップ
スケールアップ?
29スケールアップ
• Lambdaで設定可能なリソースについて
• メモリのみ
• メモリの大きさによって割り当てられるCPUの性能
がアップ
30
実験
31スケールアップ
• 次のようなCPUバウンドな処理
32スケールアップ
1792MB辺りから頭打ち
1792MB
33スケールアップ
Lambdaでは1792MBが
1つのフルvCPUに相当する
34
マルチプロセスは?
35スケールアップ
• 確かに以下のように改善可能
36
Lambdaでは権限上の
問題でマルチプロセスが行えない
37スケールアップ
• CPUバウンドになりそうな処理
• Lambdaを分割、複数関数で行う
• 別サービス(EC2等)を検討
• Sleep処理が入るようなCPUバウンドであれば割り当
てられたメモリ値に応じて処理スピードが加速する
可能性も考えられる
38まとめ
• 実行コンテキストを活用した初期化処理の再利用
• ハンドラー関数外に初期化処理を置くことで実行
時間の短縮ができる
• boto3の軽量化
• boto3をパッケージに同梱した場合は、不要なデー
タを消すことで軽量化可能
39まとめ
• スケールアップ
• 割り当てられたメモリに応じてCPU性能も上がるが
CPUバウンドな処理は1vCPUの限界から頭打ちにな
る可能性がある
40告知
クラスメソッドでは
Developers.IO 2020 〜Connect〜
を開催中!!
https://classmethod.jp/m/devio_2020_connect/
aws lambdaでpythonを実行するときのチューニング案を試してみた!

aws lambdaでpythonを実行するときのチューニング案を試してみた!