AWS Lambdaはnode.jsを使います。最近Javaも使えるようになりましたが。
マニュアルによると投稿した時点ではAmazonLinux 2014.9版で動いている様です。
node.jsのバージョンは0.10.33となっています。
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html

node.jsのモジュールはJSだけで書かれたモジュールとC/C++でかかれたネイティブモジュール(アドオン)があります。
node.jsのモジュールはnpmで簡単にインストール出来ます。
JSだけで書かれたモジュールは例えばそのままコピーしても動きますが、ネイティブモジュールはそのモジュールが使っているライブラリが無ければ使えませんし、モジュール本体もインストールした環境でしか動きません。

今回使いたいnode-canvasはサーバーサイドでHTML5のCanvasを実現してしまおうというモジュールです。
https://github.com/Automattic/node-canvas
このnode-canvasはcairoというCで書かれたライブラリを使います。
http://cairographics.org/
このライブラリはWikipediaによると

cairo(カイロ)は、デバイスに依存しないベクトルベースの描画APIを提供する、フリーの2Dグラフィックスライブラリである。アンチエイリアスがかかった綺麗な表示が特徴である。直線、矩形、円弧の他、ベジェ曲線や文字の描画も可能である。半透明描画、マスクやグラデーション機能がある。ソフトウェアによるテセレーションが基本だが、可能な場合にはハードウェアアクセラレーションを利用するよう設計されている。
https://ja.wikipedia.org/wiki/Cairo

とのことです。つまり、cairoのAPIをcanvasと同じAPIで動かすためのラッパーみたいな感じでしょうか。

目次

node-canvasのインストールと動作確認

Lambda上で動かす前にnode-canvasを動かしてみます。OS毎のインストール方法は下記URLに書かれています。
https://github.com/Automattic/node-canvas/wiki/_pages
基本的に面倒なのと、今回Lambdaで動かすのが目的なので下記の手順でAmazon Linux上で動かしてみます。

1. インスタンスの作成

Amazon Linux 2015.03でインスタンスを作ります。

2. node.jsのインストール

Lambdaで動いているバージョンがv0.10.33なので同じバージョンを持ってきてインストール

yum install gcc44 gcc-c++ libgcc44 cmake
wget http://nodejs.org/dist/v0.10.33/node-v0.10.33.tar.gz
tar -zxf node-v0.10.33.tar.gz
cd node-v0.10.33 && ./configure && make
make install

3. cairoのインストール

yum install cairo cairo-devel cairomm-devel libjpeg-turbo-devel pango pango-devel pangomm pangomm-devel giflib-devel

4. node-canvasのインストール

cd ~/
mkdir example
cd example
npm install canvas

5. サンプルの動作確認

公式ページのサンプルスクリプトを動かしてみます。

test.js
[javascript]
var Canvas = require(‘canvas’)
, Image = Canvas.Image
, canvas = new Canvas(200, 200)
, ctx = canvas.getContext(‘2d’);

ctx.font = ’30px Impact’;
ctx.rotate(.1);
ctx.fillText(“Awesome!”, 50, 100);

var te = ctx.measureText(‘Awesome!’);
ctx.strokeStyle = ‘rgba(0,0,0,0.5)’;
ctx.beginPath();
ctx.lineTo(50, 102);
ctx.lineTo(50 + te.width, 102);
ctx.stroke();

var fs = require(‘fs’)
, out = fs.createWriteStream(__dirname + ‘/test.png’)
, stream = canvas.pngStream();

stream.on(‘data’, function(chunk){
out.write(chunk);
});
[/javascript]

そして下記コマンドで実行するとtest.png ファイルが出来ているはずです。

node test.js

次回はLambdaで使えるようにしてみます。

※作成から2年前(820日経過)の記事です。内容が古い可能性があります。
東京都東日本橋の株式会社プレスマンPRESSMAN*Tech