2
1

More than 1 year has passed since last update.

AWS LambdaのLayerを利用する3つの種類

Last updated at Posted at 2022-07-18

AWS LambdaのLayerの作り方、使い方をよく忘れるので、備忘録として残しておきます。
以下の3つのことができるLayerを作ります。3つを選択的またはすべて含めたLayerにもできますので、必要なものをLayerに選択して含めてください。
対象言語はNode.jsの場合です。

① 自作のクラスを含める
② Npmモジュールを含める
③ 実行ファイルを含める

準備

まず適当なフォルダを作成します。例えば、layer_testというフォルダを作ります。以降、ここをルートフォルダとみなします。

> mkdir layer_test
> cd layer_test

作業環境に、Node.jsがセットアップされている前提です。
バージョンは、Lambdaで指定予定のバージョンに合わせます。今回は、v14系にしました。

①自作のクラスを含める

自作のクラスを含めます。
先ほど作成したルートフォルダに作成します。

> vi hello.js

中身はこんな感じです。

hello.js
class Hello{
    constructor(message){
    	this.message = message;
    }

    say(){
        return this.message;
    }
}
module.exports = Hello;

AWS Lambdaへのアップロードは後でまとめて説明します。

②Npmモジュールを含める

次は、npmモジュールを含めてみます。
もちろん、Layerとしなくてもよいですが、大きなnpmモジュールの場合は、AWS管理コンソール上でソースコード編集できなくなる場合があるので、大きなファイルはLayerに追いやるのも一つの手です。
さきほどのルートフォルダで、nodejsフォルダを作成します。

> mkdir nodejs
> cd nodejs
> npm init -y

そして、含めたいnpmモジュールをインストールします。今回は、例としてuuidを含めます。

> npm install uuid

そうすると、nodejsフォルダに、node_modules フォルダが出来上がっているかと思います。
npmモジュールによっては、ネイティブコンパイルが行われる場合があります。その場合は、AWS LambdaはLinux環境なので、Windowsではなく、たとえばUbuntuなどのLinux環境で実施してください。

③実行ファイルを含める

child_processのexecSyncやexecなどで、ネイティブの実行ファイルを実行したい場合があります。
まずは、さきほどのルートフォルダで、binフォルダを作成します。

> mkdir bin
> cd bin

今回は、例として、「ffmpeg」を含めてみます。

以下のサイトから、ffmpeg-release-amd64-static.tar.xz をダウンロードしてきましょう。このとき、ダウンロードするのは、Linuxの実行ファイルです。Windows用ではないことに注意してください。

tar.xzで圧縮されていますので、以下のように展開します。

> xz -dc ffmpeg-release-amd64-static.tar.xz | tar xfv –

そうすると、展開されたフォルダの中に、ffmpegとffprobeの2つの実行ファイルがあります。
これをルートフォルダのbinフォルダにコピーします。

> cp XXXX/{ffmpeg,ffprobe} .

Layerにアップロードする

アップロードするには、まずはアップロードしたいファイル群をZIP化する必要があります。

結局こんなフォルダになっているかと思います。

***.js
bin\***
nodejs\node_modules\***

さきほどのルートフォルダで以下を実行します。

> zip -r index.zip .

これで、ZIPファイル「index.zip」が出来上がります。
それでは、AWS管理コンソールからZIPファイルをLayerとしてアップロードします。

image.png

「レイヤーの作成」ボタンを押下します。

image.png

名前は適当に、「layer_test」にしました。
ZIPファイルのアップロードは、直接このページからアップロードするか、S3にいったんアップロードしてからLayerにアップロードするやり方があります。ZIPファイルが10メガバイトを超える場合は、S3経由でアップロードする必要があります。

互換性のあるアーキテクチャ-オプションは、x86_64を選択します。互換性のあるランタイム-オプションは、今回は「Node.js 14.x」を選択しました。

Lambda関数から利用する

それでは、さっそくLambda関数から利用してみます。
ランタイムには、さきほどのLayerのランタイムに指定したNode.js 14.xを選択します。

image.png

Lambda関数を作成したら、下の方のレイヤーにある「レイヤーの追加」ボタンを押下します。

image.png

カスタムレイヤを選択し、先ほど作成した「layer_test」を選択します。
バージョンは、Layerの更新のたびに1インクリメントされてます。

image.png

最後に、「追加」ボタンを押下します。

利用するときのソースコードは以下になります。
1点補足ですが、自作クラスは、フォルダ /opt 配下に展開されるようです。

index.js
const Hello = require('/opt/hello');
const { v4: uuidv4 } = require('uuid');
const execSync = require('child_process').execSync;

exports.handler = async (event) => {
    var hello = new Hello("Hello World");
    console.log(hello.say());
    
    var uuid = uuidv4();
    console.log(uuid);

    var message = execSync('ffmpeg -version');
    console.log(message.toString());

    
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

以上

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1