ゴーリスト開発のモリツグです。EC2インスタンス100台で毎日クローリングしてたら請求額が洒落にならなくなったので必要にせまられてLambdaでクローラを作ることにしました。できるかと思ったのですが、思いのほか手こずったので同じ経験をする人が居なくなることを願ってブログに残しておこうと思います。前半とりあえずリクルートさんのブログが参考になります。LinuxのPhantomJSはfontconfigに依存しています。Lambdaにはデフォルトでfontconfigは入ってないので日本語などは文字化けします。Lambdaでユーザが一時的に自由に扱える領域は/tmpだけです。/tmp以下にfontconfigをぶち込めば動くのですが、/tmp以下に同じ名前のディレクトリを作ると衝突することがあるので乱数をつけたり衝突を回避する手段が必要です。ここで制限つきですが、もう1ヶ所それなりに好き放題できる場所があります。それが/var/task以下です。Lambdaでとりあえずpwdすると/var/taskが返ってきます。jarやzipが展開されるディレクトリもここになります。書き込みはできません。(これが制限になります)したがってここにfontconfigをつっこみます。私の環境はWindows7だったので、とりあえずVagrantでVirtualBoxにCentOSをインストールしました。https://github.com/2creatives/vagrant-centos/releases/tag/v6.4.2せっかくminimalなのに無理やりGUIを入れたせいでちょっと大変でしたが、みなさんはminimalのままで良いと思います。先ほどのブログを丸ぱくり参考にして設定をしていきます。#無心で以下のコマンドを打ちます。引き続き、最初に紹介したブログを丸パクリ参考に設定を進めていきます。/var/task/fontconfig/etc/fonts/local.confというファイルを以下の内容で作成します。IPAフォントとかを突っ込んでおきます。/var/task/fontconfig/usr/share/fonts/ここまででPhantomJSで無事に日本語が表示できるかを確認します。以下のようなファイルを作成しcap.jsという名前で保存してください。して出てきたなかで一番それっぽいフォントを入れます。色々なフォントを入れるとLambdaのデプロイ上限の250Mを超えます。installすると/usr/share/fonts/にインストールされるので/var/task/fontconfig/usr/share/fontsにコピーしましょう。removeし、消えないことがあるので/usr/share/fonts/以下の該当フォントをrmで削除しました。以下は今回入れたフォント一覧です。WebDriverを使ってJavaから操作する以下は主にJava向けの内容になります。どの言語にも共通する重要なポイントは「/var/task/libはデフォルトでLD_LIBRARY_PATHに含まれる」という所だと思います。AWSの中のイケメンがやってくれたようです。今回はeclipseにawsのプラグインを入れてLambdaプロジェクトを作りました。このあたりは詳しくは説明しませんが、S3とかを扱う目的でaws-java-sdkを入れるとそれだけでLambdaに乗らなくなる可能性があるので、aws-java-sdk-coreとaws-java-sdk-s3だけ入れるみたいな努力が必要です。Seleniumライブラリ、fontconfigと各言語のフォント、PhantomJSのバイナリを入れるので結構カツカツになります。適当なフォルダ(今回はdriverという名前)を作ってビルドパスのソースに含めます。画像のようにdriverには以下の3つを配置します。・/var/taskにあるfontconfigディレクトリ・PhantomJSバイナリ・LD_LIBRARY_PATHで指定していた/var/task/fontconfig/usr/lib/をlibとして配置/var/task/libがLD_LIBRARY_PATHにデフォルトで含まれることを利用して/var/task/fontconfig/usr/lib/以下のファイルをそこに配置する目的で置いています。/var/task/fontconfig/usr/lib/pkgconfig/fontconfig.pcの中とかを見ると絶対パスで色々書かれてるので大丈夫ぽいです。あとはeclipseの機能でエクスポートから実行可能JARファイルを作成すればいいのですが、ライブラリ形式は一番上の「生成されるJARに必須ライブラリーを抽出」を選んでください。あとはこれをLambdaにデプロイすればすべて上手く。以下の2つの問題をクリアしないといけません。1.PhantomJSや/var/task/fontconfig/usr/bin/fc-cacheに実行権限が無いため怒られる、さらにJARにした段階(antによるjar作成)でパーミッションが引き継がれず事前に実行権限を付与していても実行権限が無くなってしまう。2.デフォルトでphantomjsdriver.logがカレントディレクトリに作成されるが/var/taskには書き込めないので怒られる。1については私の環境がWindowsでそもそも実行権限を付与できなかったため、VirtualBoxにCentOSとeclipseをいれました。KDEデスクトップとの相性が悪いせいかJAR作成画面が固まって作れなかったため、Windowsで実行可能JARをつくるときにantファイルを保存してそれを利用するというちょっと特殊なことを行ったので、もしかしたら不正確かもしれません。Windowsユーザは事前に実行権限を付与する術がないためLinux環境は必須です。以下のようなスクリプトを作成し、antファイルを一部書き換えることで無理やり実行権限を引継げるようにしました。肝はfilesetは実行権限を設定できないけれど、zipfilesetはfilemodeで設定できる所だとおもいます。期待通りに固められているかは拡張子をzipとかにして中身を見れば良いと思います。</target></project>2については–webdriver-logfileパラメータがどうやってもPhantomJSに渡らない(実行時にコンソールでパラメータを確認できる)ので以下のような方法しかなさそうです。capabilities);やっとLambda上で快適にクローリングできます!まとめJavaじゃなかったら最後の方の問題は関係ないと思います。この作業中に仮想環境が2回ぐらい壊れて再インストールしたので物凄く疲れました。Lambdaは夢が広がるので面白いなぁと思います。»プロフィールゴーリストのエンジニア達のブログです。月別アーカイブリンクセールスブログデザインブログゴーリストブログスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。