🙄

【Serverless Framework】Lambdaレイヤーで ImageMagick、Ghostscript を利用する

2023/08/12に公開

thumbnail

はじめに

実行にImageMagick, Ghostscriptが必要なLambda関数をServerlessFrameworkを利用してデプロイする方法を備忘録として投稿させていただきます。

環境

  • ServerlessFramework
  • NodeJS:18

やりたかったこと

S3にPDFファイルがアップロードされたら、サムネイル用にPDFの1ページ目のJPEGファイルを作成する。

困ったこと

ローカルではスクリプトが想定通りに動作したが、Lambdaでは動作しなかった。



原因

Lambdaの実行環境にImageMagick, Ghostscriptがインストールされてない。

解決方法

LambdaレイヤーでLambda関数にImageMagick, Ghostscriptを導入する。

serverless.ymlでLambdaレイヤーを設定する

serverless.yml
functions:
  xxxxx:
    runtime: nodejs18.x
    handler: app/xxxxx.handler
    # Lambdaレイヤーを指定
    layers:
      - !GetAtt ImageMagick.Outputs.LayerVersion
      - !GetAtt Ghostscript.Outputs.LayerVersion
    timeout: 15
    # 128MBではメモリ不足だったので少し大き目のメモリサイズを指定
    memorySize: 512
    # S3の指定バケットにPDFファイルがアップされたら実行されるように設定
    events:
      - s3:
          bucket: xxxxx
          existing: true
          event: s3:ObjectCreated:*
          rules:
            - prefix: input/
            - suffix: .pdf

# リソースで「AWS サーバレスアプリケーション」を指定する
# (`Type: AWS::Serverless::Application`をserverless frameworkから
# デプロイするためには、`Transform: AWS::Serverless-2016-10-31`の記述が必要)
resources:
  Transform: AWS::Serverless-2016-10-31
  Resources:
    ImageMagick:
      Type: AWS::Serverless::Application
      Properties:
        Location:
          ApplicationId: arn:aws:serverlessrepo:us-east-1:145266761615:applications/image-magick-lambda-layer
          SemanticVersion: 1.0.0
    Ghostscript:
      Type: AWS::Serverless::Application
      Properties:
        Location:
          ApplicationId: arn:aws:serverlessrepo:us-east-1:154387959412:applications/ghostscript-lambda-layer
          SemanticVersion: 9.27.0



おまけ

手動でLambdaレイヤーを設定する

  1. AWS サーバレスアプリケーション リポジトリから、以下のLambdaレイヤーを導入する。

補足:導入したLambdaレイヤーはAWS Lambda > レイヤーから確認できる

  1. Lambda関数のレイヤーにImageMagick, Ghostscriptを設定する

Discussion