「AWS無料相談会」をオンラインで開催中

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コンテナに力を入れています。ぜひ以下のページをご覧ください。

サーバーレスアーキテクチャ(AWS Lambda)

Dockerコンテナ基盤(AWS Fargate/Amazon ECS)