yumで入れた依存モジュールをAWS Lambdaで使う方法
エンジニアの内山です。最近は趣味の関係で、車で遠出することが多くなり、半年ほどで走行距離が10000kmを突破しました。
概要
本記事は、以下のような内容となっています。
- Dockerとyumdaを利用して、依存モジュールをビルド
- Serverless Frameworkでデプロイ
- 依存モジュールはLambda Layerに配置され、複数のLambda関数で利用できるようになる
DockerとServerless Frameworkをインストールしていることが前提です。
Docker
https://www.docker.com/
Serverless Framework
https://serverless.com/
Dockerとyumdaを利用して、依存モジュールをビルド
依存モジュールのビルドは、Dockerを利用します。また、Dockerのビルド作業を楽にしてくれるyumdaというツールを使います。
yumda
https://github.com/lambci/yumda
以下のように簡単にyumコマンドをDockerコンテナ上で実行することができます。
$ docker run lambci/yumda:<version> yum <yum-args>
<version>
は、Amazon Linuxのバージョンです。
例えば、Amazon Linux 2で、Ghostscriptをインストールする場合は、以下のようなコマンドになります。
$ mkdir -p dependencies
$ docker run --rm -v "$PWD"/dependencies:/lambda/opt lambci/yumda:2 yum install -y ghostscript
コマンドを実行すると dependencies ディレクトリに、Ghostscriptのモジュールがインストールされます。
Serverless Frameworkでデプロイする
インストールしたモジュールは、ディレクトリごとzipで固めます。
$ cd dependencies
$ zip -yr ../dependencies.zip .
$ cd ..
また、hello-world/app.js
という名前で、スクリプトを作成します。
Serverless Framework の設定は、以下のようになります。
service: yumda-example
provider:
name: aws
runtime: nodejs10.x
package:
individually: true
exclude:
- ./**
functions:
hello-world:
handler: hello-world/app.lambdaHandler
package:
include:
- hello-world/**
layers:
- {Ref: DependenciesLambdaLayer}
layers:
dependencies:
path: dependencies
package:
artifact: dependencies.zip
layers項目でLambda Layerの設定をしています。この設定により、dependencies.zipはLambda Layerに配置されます。
Lambda Layerというのは、複数のLambda関数でライブラリを共有する仕組みです。この仕組みにより、今回ではGhostscriptを複数のLambda関数から呼び出せる形となります。
デプロイコマンドは以下のようになります。
$ sls deploy
まとめ
yumコマンドでインストールした依存モジュールをLambda関数で利用する方法をご紹介しました。
yumのリポジトリは、yumdaライブラリで管理しているリポジトリを参照しているので、以下のファイルにリストされているモジュール以外は利用できません。
https://github.com/lambci/yumda/blob/master/amazon-linux-2/packages.txt
含まれていないモジュールを利用したい場合は、Issuesでリクエストを出すと良いようです。
MMMは、AWS LambdaとDockerコンテナに力を入れています。ぜひ以下のページをご覧ください。
・Dockerコンテナ基盤(AWS Fargate/Amazon ECS)