ちょっと話題の記事

AWS LambdaにLayerなるものが追加されたのでPythonで簡単に使ってみる #reinvent

re:Inventで発表された新機能、複数のLambda Functionでコードを共有するLayerをPythonで簡単に試してみました
2018.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーバーレス開発部の夏目です。

ラスベガスには行っていませんが、数多くの発表があり情報を追いかけるだけでも大変です。 AWS LambdaにFunctionでコードを共有することができる "Layer"なる機能が追加されたので、 簡単に使ってみようと思います。

【速報】【アップデート】Lambdaが複数のファンクションで共有するコードを持てるようになりました(Lambda Layer) #reinvent

注意

  • どういう風にすれば使えるのかを確認したいだけです
  • 簡単に使ってみるつもりなので、管理とか特に考えてないです
  • なのでAWSの操作はコンソールでぽちぽちします

Layer用のコードを作成する

共有したいコードを書いていきます。
Layer用のコードはzipで直接アップロードするかS3経由にするかでしか対応していないようなので、デプロイ用のzipファイルを作成します。

$ mkdir python
$ vi python/test_layer.py
$ zip -r layer.zip python/

3行目で作成した"layer.zip"がデプロイするzipファイルです。
2行目の"test_layer.py"が今回共有したいコードです。
中身は以下の通りです。

def call():
    return 'LambdaのRuby対応やったー!'

とりあえずどう動かすか確認するだけなので、一言返すだけで他意はないです。
(多少心の叫びが漏れてますが)

Layerを作成する

ここからはAWSのWebコンソールをぽちぽちしながら、Layerを作成していきます。

まずは左のメニューから"Layers"を開きます。

Layer一覧の画面が表示されるので、"レイヤーの作成"をクリックして作成していきます。

Layerの名前や説明などを入力していきます。

  • 名前: Layerの名前。プレースホルダーが頭小文字のキャメルケースだったので、自分もそうした。
  • 説明: Layerの説明。なくても作れる。
  • コードエントリタイプ: ファイルのアップロード方法を選択する。今回はzipファイルをアップロードする。
  • 互換性のあるランタイム: どのランタイムで動かすことを想定しているのか選択する(複数選択できる)。適当にPythonのランタイム3つを選択。
  • ライセンス: ヘルプには"レイヤーのソフトウェアパッケージのライセンス情報への URL リンクを提供できます。"とある。なくても作れる。

コードをアップロードして、右下の作成からLayerを作成します。

これで"testLayer"のバージョン1が作成されました。

Layerを使用するLambda Functionを作成する

Lambda Functionの作成を行っていきます。

Lambda FunctionのDesignerに"Layers (0)"と表示されるものが追加されているので、そこをクリックしてFunctionにLayerを追加していきます。

参照されるレイヤーの"レイヤーの追加"を開きます。

Layerの選択をします。
今回は"ランタイムと互換性のあるレイヤーのリストから選択"を使用し、先程作成した"testLayer"のバージョン1を接続します。

接続すると、Designerの画面で"Layers"の数字が0から1に変わり、保存されていない変更があると表示されます。
右上の"保存"をクリックして保存しておきます。

Layerのコードを呼び出すようコードを修正し、先程と同じく右上の"保存"で保存します。

import test_layer

def lambda_handler(event, context):
    return test_layer.call()

あとは、"テストイベントの選択"から"テストイベントの設定"を開き、適当な名前でテストイベントを作成し、

作成したテストイベントを選択して"テスト"をクリックすると、Lambda Functionが実行されます。

Layer用のコードに記載した、心の叫びが表示されたのでちゃんと動いたようです。

Layerについての詳細

ここでは簡単に、コードを動かすことだけを考えて作ってきたので詳しい説明はしていません。
(Layerのコードがどこに展開されているとか)

実際に使う際には、AWSのドキュメントを確認してから使ってください。

AWS Lambda Layers - AWS Lambda
Lambda Execution Environment and Available Libraries - AWS Lambda

まとめ

Lambdaでコードの共有が簡単にできるようになったので、同じ処理を複数のLambda Functionに書いたり、デプロイ前に各Lambda Functionにコピーしたりとかしなくてよくなるので非常に便利です。
とりあえず、今案件で使っているPythonで試してみましたが他の言語、特にRubyとかでも試してみたいと思います。