はじめに
AWS lambda上でiconv(node-iconv)を使うには、少しテクニックが必要です。
AWS Lambda内で文字コードを変換する方法
なるほど、lambdaの実行環境にiconvコマンドがあるから、それを叩けば良いのか。
いやしかし、別のモジュールが内部的にiconvを使っている場合はどうするんだろう。
色々と調べた結果(その過程は果てしないので割愛w)、iconvのように実行環境に依存するようなモジュールをlambda上で扱う場合は、ターゲット環境を用意してビルドする必要があるようです。
Using Packages and Native nodejs Modules in AWS Lambda
ではやってみます。
準備
まずはEC2(Linux)を一台用意して、nodeをインストールします。
※上記リンクの記事では、nodeのバージョンを0.10.33にしていますが、現在のlambdaのNodeは0.10.36ですので、今回は0.10.36を用意します。
$ sudo yum update
$ sudo yum install gcc44 gcc-c++ libgcc44 cmake –y
$ wget http://nodejs.org/dist/v0.10.36/node-v0.10.36.tar.gz
$ tar -zxvf node-v0.10.36.tar.gz
$ cd node-v0.10.36 && ./configure && make
$ sudo make install
$ node -v
v0.10.36
となればOKです。
makeには結構時間がかかりますので、のんびりコーヒーでもどうぞ。
2015-12-31 追記
コンパイルしなくても n を使えば node のバージョン管理は簡単にできますし、複数のバージョンで環境を作りたい方にはおすすめです。
$ sudo npm install -g n
$ sudo n 0.10.36
lambda用のiconvを生成
Nodeの環境ができたので、いよいよiconvを準備します。
$ mkdir iconv && cd iconv
$ npm install iconv@1.2.3
現在のiconvの最新バージョンは、2.1.11なのですが、これだとNodeの0.10.36で動きません(少なくともこちらの環境ではダメでした)。なので、あえて1.2.3をインストールしました。
さらに念の為に、iconvをビルドしておきます。
$ cd node_modules/iconv/
$ node-gyp configure
$ node-gyp rebuild
warningが結構でますが、最後に
gyp info ok
と出れば成功です。
$ cd ../
$ ls -l
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 26 14:34 .
drwxrwxr-x 3 ec2-user ec2-user 4096 12月 26 14:34 ..
drwxrwxr-x 5 ec2-user ec2-user 4096 12月 26 14:36 iconv
このiconvというフォルダを、実際にlambdaにデプロイするパッケージのnode_modules内のiconvと差し替えてデプロイすればOKなはずです。
差し替えることによって、ローカルで実行時にはエラーが出るようになってしまうので、lambdaにデプロイする時に、その都度差し替えるのがよいかも知れません。ちなみに僕は、gulpを使って、lambda用のビルド環境を生成する際に、iconvフォルダだけを差し替えるようにしています。
忙しいあなたに
上記手順で作成したiconvを用意しておきました。
※zipファイルなので、解凍して使ってください。なお、動かなくて責任は持ちませんのであしからず。
iconv.zip