こんにちは、ロジカル・アーツの井川です。
今回は Lambda レイヤーという機能を使ってみました。
これまで Lambda レイヤーという言葉は耳にしていましたが、実際に使ったことが無かったので試してみたいと思います。
Lambda レイヤーとは
Lambda レイヤーは、 使用するライブラリを Lambda で共有できる機能のことです。
ちなみにレイヤーを使わない場合、 Lambda でライブラリを使用するにはコードとライブラリをパッケージにしてデプロイします。
Lambda を複数使う場合、それぞれのパッケージを作成する必要があるため、 Lambda の数が増えるとパッケージの管理が大変です。
レイヤーを作成すると、 Lambda は作成したレイヤーから共通のライブラリを使用できるようになるので、パッケージを作る手間やライブラリの管理を簡単にできるようになります。
なお、Lambda レイヤーには制限事項があり、以下の点は注意が必要です。
- Lambda が一度に使用できるレイヤー数は5つまで
- Lambda とすべてのレイヤーの解凍後の合計サイズは 250 MB まで
Lambda レイヤーを作成する
今回は Python の dateutil というライブラリを Lambda レイヤーに登録して使ってみます。
レイヤーの作成は以下の順番で進めます。
- フォルダ構造の作成
- dateutilのインストール
- zipファイルの作成
- Lambda レイヤーの作成
1. フォルダ構造の作成
Lambda レイヤーを作成するには以下のディレクトリ構造の zip ファイルが必要になります。
適当な名前のディレクトリ ├ ライブラリ1 ├ ライブラリ2 (必要に応じて) ├ ....
レイヤーには複数のライブラリを含めることができますが、その場合はディレクトリを分けます。
今回レイヤーに登録するライブラリは dateutil のみなので、以下の構造のディレクトリを用意します。
sample-dateutil └ dateutil
2. dateutilのインストール
dateutil を pip でインストールします。
インストール先は作成した sample-dateutilh 配下の dateutil ディレクトリを指定します。
以下は実行コマンドです。
※Windows の環境で実行しています
>pip install python-dateutil -t C:\Users\igawa\Desktop\sample-dateutil\dateutil
インストールが成功すると、先ほど作成したディレクトリの構造は以下のようになりました。
sample-dateutil └ dateutil ├ __pycache__ # モジュールのキャッシュファイル ├ dateutil # dateutil モジュール ├ python_dateutil-2.8.1.dist-info # dateutil のメタデータ ├ six-1.14.0.dist-info # six のメタデータ └ six.py # Python 2 と 3 に互換性を持たせるライブラリ
3. zipファイルの作成
sample-dateutil ディレクトリをパスワード無しで圧縮し、 zip ファイルにします。
4. Lambda レイヤーの作成
いよいよ Lambda レイヤーを作成します。
AWSのマネジメントコンソールにログインし、 「Lambda」をクリックします。
サイドメニューの「レイヤー」をクリックします。
新たにレイヤーを作成するので、「レイヤーの作成」をクリックします。
必要な情報を入力して、作成した zip ファイルをアップロードします。
互換性のあるランタイムでは、どのランタイムがレイヤーを使用できるかを設定します。
dateutil は選択できる Python ランタイムにすべて対応していたのですべて選択しました。
作成をクリックします。
入力した内容でレイヤーを作成できました!
続いて、作成したレイヤーを Lambda で使ってみましょう。
Lambda の画面に移動し、「Layers」をクリックします。
レイヤーの追加画面が表示されました。
作成した sample-dateutil を選択して「追加」をクリックします。
レイヤーが Lambda に追加され、レイヤーを使う準備が整いました。
Lambda レイヤーを使う
Lambda で dateutil を呼び出せるかどうか確認したいと思います。
ソースコードは dateutil ドキュメントページの Quick example のものを引用します。
from dateutil.relativedelta import * from dateutil.easter import * from dateutil.rrule import * from dateutil.parser import * from datetime import * now = parse("Sat Oct 11 17:13:46 UTC 2003") # 文字列を datetime オブジェクトに変換しています today = now.date() # datetime オブジェクトを date オブジェクトに変換しています year = rrule(YEARLY,dtstart=now,bymonth=8,bymonthday=13,byweekday=FR)[0].year # 次の8月13日(金)の年を求めています rdelta = relativedelta(easter(year), today) # イースターまでの月日を求めています def lambda_handler(event, context): print("Today is: %s" % today) # 期待値 # Today is: 2003-10-11 print("Year with next Aug 13th on a Friday is: %s" % year) # 期待値 # Year with next Aug 13th on a Friday is: 2004 print("How far is the Easter of that year: %s" % rdelta) # 期待値 # How far is the Easter of that year: relativedelta(months=+6) print("And the Easter of that year is: %s" % (today+rdelta)) # 求めたイースターまでの月日を today に足して、2004年のイースターの日を求めています # 期待値 # And the Easter of that year is: 2004-04-11
テストイベントはデフォルトのままで大丈夫です。
テストを実行します。
START RequestId: e2bdfdc5-6530-4b8e-ac95-cbde958c394d Version: $LATEST Today is: 2003-10-11 Year with next Aug 13th on a Friday is: 2004 How far is the Easter of that year: relativedelta(months=+6) And the Easter of that year is: 2004-04-11 END RequestId: e2bdfdc5-6530-4b8e-ac95-cbde958c394d REPORT RequestId: e2bdfdc5-6530-4b8e-ac95-cbde958c394d Duration: 2.11 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 49 MB Init Duration: 141.71 ms
レイヤーの dateutil のライブラリを使った処理結果が確認できました!!
まとめ
いかがでしたでしょうか。
今回は dateutil というライブラリを Lambda レイヤーに追加しましたが、作成したモジュールなども追加することが可能です。
複数の Lambda で共有したいライブラリやモジュールがあれば管理の手間を軽減するためにも検討してみるのはいかがでしょうか。
本題ではありませんが dateutil の理解も深められて楽しく検証できました。(笑)
この記事がどなたかのお役に立てば幸いです。