🐷

AWS Lambda 上でらく〜に canvas を動かす

2024/09/05に公開

はじめに

目標は canvas を AWS Lambda 上で動かすことです

この記事の内容は本質的には下の記事に全部書いてあります

https://www.mizdra.net/entry/2023/01/22/232956

canvas について

https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API

を実装したものはおそらく全部 canvas です。以下のような実装があります

  • 各種ブラウザ上での実装
  • node-canvas (npm package 名は canvas)
  • @napi-rs/canvas (今回の推し)

node-canvas はしんどい時がある

下の記事のような方針もありますが、node-canvas にはネイティブなライブラリへの依存があるので、変わった環境に入れようとすると、ちょっと大変 (だと思います)

また、環境を移行したりするときなども大変そうです

https://zenn.dev/enish/scraps/b048f5cd52895f

そこで @napi-rs/canvas

https://github.com/Brooooooklyn/canvas

ネイティブなライブラリへの依存がゼロなので、とてもらく〜です。AWS Lambda 上で動かすには

https://github.com/Brooooooklyn/canvas?tab=readme-ov-file#aws-lambda-usage

のようなものも提供されているようですが、使わなくてもいけそうなので、使わないで続行してみます

linux, x64 用のパッケージが欲しいです。docker などを立ち上げるのは面倒です。下のようにすると linux, x64 以外の環境でも linux, x64 用のパッケージを簡単にインストールできます

# canvas の名称で @napi-rs/canvas を入れる
npm install canvas@npm:@napi-rs/canvas

# node_modules/@napi-rs 配下を
# node_modules/@napi-rs/canvas-linux-x64-gnu に強制的に差し替える
rm -rf node_modules/@napi-rs
npm install --force @napi-rs/canvas-linux-x64-gnu

npm install に --force がついているのは、「linux, x64 以外の環境でも linux, x64 用のパッケージを簡単にインストール」という非合法行為をしているからです。npm install --platform=linux --arch=x64 とかだとうまくいきませんでした

これを AWS Lambda Layers に上げれば完了です。

最後に Serevrlesss Framework での構築例を載せます

https://www.serverless.com/framework/docs/providers/aws/guide/functions

service: canvasService

plugins:
  - serverless-layers

package:
  # 適当な設定

provider:
  runtime: nodejs18.x
  # 適当な設定

functions:
  funcUsingCanvas:
    handler: # 適当に指定

custom:
  serverless-layers:
    # canvas 用のレイヤー
    - canvas-layer:
        functions:
          - funcUsingCanvas
        customInstallationCommand: |
          npm install --production --only=prod
          
          # node_modules/@napi-rs 配下を
          # node_modules/@napi-rs/canvas-linux-x64-gnu に強制的に差し替える
          rm -rf node_modules/@napi-rs
          npm install --force @napi-rs/canvas-linux-x64-gnu # 実際には version 指定した方がよさそう

Discussion