🙄
【Serverless Framework】Lambdaレイヤーで ImageMagick、Ghostscript を利用する
はじめに
実行に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レイヤーを設定する
- AWS サーバレスアプリケーション リポジトリから、以下のLambdaレイヤーを導入する。
- image-magick-lambda-layer - AWS Serverless Application Repository
- ghostscript-lambda-layer - AWS Serverless Application Repository
補足:導入したLambdaレイヤーはAWS Lambda > レイヤー
から確認できる
- Lambda関数のレイヤーに
ImageMagick
,Ghostscript
を設定する
Discussion