えいのうにっき

誤字脱字・記述の誤りなどはこちら https://github.com/a-know/blog.a-know.me へお願いします

マネージド ImageMagick として Google App Engine を活用する

人類にとって必携の技術である ImageMagick 。その利用環境も、できるだけ人類にとって優しいものであってほしい。小ネタです。

最近の Google App Engine(GAE・Standard Environment)では第2世代のランタイム環境が使えるようになっており、そこではいくつかのシステムパッケージがサポートされている。利用可能なパッケージはここに記載されているのだけど、そのなかに imagemagick が含まれている。

cloud.google.com

ちなみにいきなり脱線するのだけど、上記リンクは Go 1.12 以降の場合に利用可能なパッケージ一覧。Go 1.11 については ここ に掲載されていて、それ以前の環境になると、第1世代ということでシステムパッケージは含まれていない。

なるほど、じゃあ Go の 1.11 からが第2世代なのね、というと、実はそうではなくApp Engine スタンダード環境のランタイム  |  App Engine ドキュメント  |  Google Cloud によると、Go だと 1.12 からが第2世代ということになっている。ここらへんの解説は GAE Go 1.11 ランタイムが公式には 2nd gen ではなくなった件について - Qiita が詳しいので、気になる方はこちらを読まれたし。

話は戻って、ではシステムパッケージが含まれる環境で ImageMagick を使うにはどうすればいいか、というと、シンプルに外部コマンド呼び出しをすることになる。

err := exec.Command("convert", "-geometry", size, srcFilePath, destFilePath).Run()

ちなみに、いつからなのかは知らないが(第2世代から?それとももっと前かな)、GAE では /tmp へのファイル書き出しもおこなえるようになっている。

cloud.google.com

なので、あなたの要件が許せば、ImageMagick に掛ける対象のファイルを /tmp に書き出し、それに対して convert をした結果も /tmp に出力する、ということも可能。そういったコードを Go で書くなら TempDirTempFile を使うとよさそう。ただし、上記ヘルプにも書いてあるとおり、 /tmp に書き出されたものの実体は全てその GAE インスタンスの RAM にある感じなので、メモリも消費するし揮発もする、他のインスタンスとの共有もできない、などのことは考慮にいれておく必要はあります。

話題としては以上ですが、これを愚直にやってみているコードへのリンクを置いておきます、誰かの参考になれば。内容は、他所からとってきたSVGPNGに変換して返す、というものになります。

grass-graph/convert.go at master · a-know/grass-graph · GitHub

なんかまずそうなところがあったら issue や Pull Request、その他なんでもいいので教えてくれると助かります。

ちなみに、Cloud Functions でも同様のことはできそうです。用途に合わせて使い分けられると良さそうですね。

cloud.google.com