AWSのLambdaのレイヤーアップロードのコツ



最近AWSのLambda & API GateWay の組み合わせでサクッとWebAPIを作るのが楽しいです。

で、Lambdaというと、ちょっとメンドクサイのが外部のライブラリ(Pythonではモジュール)を使いたい場合、関数毎に使いたいライブライファイルをバンドリングしてアップロードする必要があること。

が、あんまり気にしていなかったのですが、レイヤーという、一回アップロードしたモジュールは使いまわせるという便利な機能があることにやっと気づいて少し調べながら使ってみました。

一応この記事はPython3系のモジュールを、レイヤーで使うことを目的にしています。他のパターンの方は適宜読み替えてください。

Lambdaの組み立てはCloud9経由が楽

Lambda編集画面

画像のようにLambdaのコンソールから直接コードを作っていっても問題ないのですが、Cloud9から直接Lambda関数を編集してデプロイできるので普段はそちらを使っています。

環境変数などをいじる必要があるときだけLambdaのコンソールに戻ってくる感じですね。

Cloud9側からLambdaをいじる

Cloud9からLambdaを編集

画像のようにコンソール右端にLambdaと連携するためのタブがあって、

「Lambda」にある関数を「Cloud9」にインポートすることも、
「 Cloud9 」で作ったソースを「 Lambda 」にアップロードすることも、
このタブから可能です。

本題のLambda「レイヤー」の作り方

「レイヤー」機能を簡単に説明すると、これまでLambda関数毎にモジュールをまとめて配置していたのが、レイヤーを使えば一度アップロードしたモジュール環境を複数のLambda関数に適用させることができるようになります。

普通に適当にアップロードしてLambda関数側の環境変数に「PYTHONPAT」「UPLOAD先のPATH」を指定するという方法でも問題なく使えるのですが、少しコツを覚えておくと、環境変数の設定なしでレイヤーが使えるようになります。

まずは適用させたいモジュールをバンドリング

Cloud9を使います。

Cloud9のenvironment直下に「python」という名前のフォルダを作成

cloud9のenvironment直下にpythonというフォルダを作成

次にbashを開いて今作ったばっかりの「python」フォルダに移動します。

pythonフォルダに移動

さらに続けて、レイヤーで使いたいPythonのモジュールをpipで「python」フォルダ直下にインストールしていきます。

今回は例として「requests」「bs4」「lxml」の3つのスクレイピング用モジュールをインストールしてみることにします。

コマンドは以下の通り。

-t [ディレクトリ] は「指定ディレクトリにモジュールをインストールする」というコマンドです。

この時注意点として、cloud9では特に何も設定せずにbashからpipを使おうとするとpython2系のpipが発動してしまうことに注意です。

ですのでちょっと面倒ですが、かならず「python3 -m」に続けてコマンドを入れるようにすると間違いが起きないです。

モジュールをインストールしたらローカルにダウンロード

バンドリングしたモジュールをダウンロード

pythonフォルダ直下に各モジュールがインストールされた状態で「python」フォルダを右クリックして「Download」を選択します。

python.zip

ダウウンロード先のローカルフォルダに同名のファイルがなければ、「python.zip」としてダウウンロードが開始されます。

ダウンロードしたzipファイルをそのままレイヤーにアップロード

Lambdaのコンソールに移動します。

左側のタブから「Layers」を選択。

Layersタブを選択

さらに「レイヤーの作成」をクリック。

レイヤーの作成

適当な名前と、必要であれば説明、適当なランタイムを選択して、さっきダウンロードした「python.zip」を何も考えずアップロードすればレイヤーの作成完了です。

レイヤーアップロード

コツとは何だったのか?

コツと言っていたのは「python」というフォルダ名をつけてその中にモジュールをインストールした部分です。

こうすることによって、LambdaのディフォルトのPathが通っているディレクトリ「/opt/python」を狙い撃ちでモジュールをアップロードすることができます。

ですので、Lambda側で特に環境変数などの設定なしにレイヤーを適用させることが可能になります。