created: 2019-06-22T04:00:03.000Z
node-canvasをlambdaで動かす
node-canvasは内部でネイティブモジュールを使用しているため、macos上でコンパイルしたものをlambdaにアップロードしても動作しない。AmazonLinux上でコンパイルしたものをlambdaへアップロードすることになる。
手順
- Dockerfile作成
- docker run で yarn install を実行する
- AmazonLinuz上でコンパイルする
- ボリュームをマウントして macos で node_modules を受け取る
- zip して lambda にアップロード
Dockerfile作成
こちらから拝借
FROM amazonlinux:latest
RUN curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -
RUN yum install -y nodejs zip
RUN npm install -g yarn
RUN mkdir /build
COPY ./package.json /build/
COPY ./yarn.lock /build/
WORKDIR /build
ENTRYPOINT ["yarn"]
CMD ["install"]
なお、nodeのversionを10系にするとuuidがstatic linkされてないとのことで動かなかった
docker build
$ docker build -t lambda-build .
docker run -v
buildディレクトリを作成して、そこに作ってもらう
$ mkdir build
$ docker run -v $(pwd)/build/node_modules:/build/node_modules lambda-build
$ ll ./build/node_modules/ | head
total 32
drwxr-xr-x 75 sakamossan staff 2.3K 6 22 12:30 .
drwxr-xr-x 4 sakamossan staff 128B 6 22 12:31 ..
drwxr-xr-x 10 sakamossan staff 320B 6 22 12:30 .bin
-rw-r--r-- 1 sakamossan staff 15K 6 22 12:30 .yarn-integrity
drwxr-xr-x 6 sakamossan staff 192B 6 22 12:30 abbrev
drwxr-xr-x 6 sakamossan staff 192B 6 22 12:30 ansi-regex
drwxr-xr-x 6 sakamossan staff 192B 6 22 12:30 aproba
drwxr-xr-x 11 sakamossan staff 352B 6 22 12:30 are-we-there-yet
drwxr-xr-x 7 sakamossan staff 224B 6 22 12:30 balanced-match
zip して lambda にアップロード
$ cd ./build
$ cp ../handler.js .
$ zip ~/Desktop/function.zip -r *
$ aws lambda update-function-code \
--function-name chart-endpoint-dev-ChartEndpoint \
--zip-file fileb://~/Desktop/function.zip
アップロードの部分はawscliでなく、serverlessを使った方がよさそう serverless deploy には zipファイルを指定できるようだ
$ serverless deploy --help | grep package
--package / -p ..................... Path of the deployment package
動作確認
requireしたcanvasオブジェクトをJSONにしたものを返すとこんな感じ
$ serverless invoke --function ChartEndpoint | jq -r .body | jq .
{
"canvas": {
"backends": {},
"version": "2.5.0",
"cairoVersion": "1.16.0",
"jpegVersion": "6b",
"gifVersion": "5.1.4",
"freetypeVersion": "2.9.1"
},
"input": {}
}