今回紹介するのは、ピースオブケイクの福井 烈さんがJAWS-UG青森で行なったプレゼンテーションのお題は「とあるサービスにおける、とあるAPIの、サーバーレス化を目指した検証のアレコレ」というもの。実際にコードを書いて、動かしてみてわかったことを具体的に発表したプレゼンテーションだ。
サーバーレスとはマネージとサービスを組み合わせたサービスフルなアーキテクチャ
福井さんは青森県弘前市出身。今は都内に本社のあるピースオブケイクに勤めており、奥様のご実家がある青森県南津軽郡大鰐町に住み、リモートワークで働いている。
さて、今回の発表は新機能でサーバーレス技術を使えないかと、福井さんが技術的な検証を行なってきたという内容。サーバーレスはAWS界隈でホットワードになっているが、具体的にはどんな風に動くの? ってことがよくわかっていない読者も多いのではないだろうか。そういう方にとっては、このプレゼンテーションは「これから自分もサーバーレス技術に手を出してみよう」と思える内容になっているので、ぜひ参考にしていただきたい。
まず福井さんは、そもそもサーバーレスとは何かという話から始めた。Googleトレンドで調べたところ、2014年頃から浸透してきたキーワードのようだ。
「キーワードとしては浸透してきたけれど、そもそも何ができるんですか?ってことがまだ浸透していない気がします。サーバーレスという単語から、サーバーなしで運用から何から全てを丸投げできるようなイメージを抱いている人もいるようですが、残念ながら、そんな美味しい話ではありません」(福井さん)
福井さんはサーバーレスアーキテクチャについて「一言で言えば、サーバーを自前で用意せずマネージドサービスに頼るアーキテクチャ」と表現した。「サーバーレスというよりも、サービスフルと呼んだ方がしっくりくる」とも。ちなみに、「サーバーレスではなくサービスフルというのは、他の人が言っていた言葉の受け売り」だそうだが、なかなか的を得た表現ではなかろうか。
そしてここで、今回のお題が再び示された。ただし、表現はより具体的になっている。noteのいちユーザとしても、気になるお題となった。
noteの検索機能をサーバーレス化して保守性向上とコスト削減を目指す
福井さんがサーバーレスアーキテクチャを取り入れようとしているのは、noteにおける検索機能。キーワードやハッシュタグからユーザ名をサジェストするもので、現在は下図のような構成になっている。
「検索機能に白羽の矢を立てたのは、マネジメントサービスを取り入れることによってエンジニアの人的リソースのコストダウンが見込めること、アプリケーションサーバから機能を独立させることで負荷を軽減し、可用性や保守性の向上が見込めることなどが大きな理由です」(福井さん)
既存の環境から、まずは検索機能だけをLambdaとAPI GatewayとElasticsearch Serviceを使って再構築しようというのが福井さんの目論見だ。目指すゴールは、次の図のようになる。
LambdaとAPI GatewayとElasticsearch Serviceについて簡単に説明したのちに福井さんは、「習うより慣れろということで、LambdaとAPI GatewayとElasticsearch Serviceを絡めた簡単なWebアプリを使って理解を深めることにした」と語り、実践編へと進んだ。
まずは開発環境をインストールし、コンソール上で動作をチェック
LambdaもAPI GatewayもElasticsearch Serviceも使ったことがなかったという福井さんは、まずこれらを取り巻くエコシステムを調べ、開発環境を選ぶところからスタート。先人の知恵を検索してピックアップされたのは、ServerlessとAPEXの2つ。どちらも、Lambdaを簡単にプログラミングするためのフレームワークを提供してくれる。
「Serverlessの特徴的な点は、ローカルでLambdaを動かす仕組みを提供していること。一方APEXの特徴は、サポート言語にGoが含まれているところです。Lambdaは公式にはNode.jsとJavaとPythonしかサポートしていないのに、Goを使えるという点に惹かれて、今回はAPEXを使って進めることにしました。Goで書いてみたかったんです」(福井さん)
Goとは、Googleによって開発されたプログラミング言語。クロスコンパイルが簡単で1つのバイナリファイルでさまざまな環境で動作させることができる。この特徴を活かして、APEXではNode.jsからGoを実行して標準入出力でやりとりすることで、Lambdaに対応させているようだ。
開発環境が決まれば、次はインストール。curlコマンドを使ってインストールし、APEXの初期化とプロジェクトの作成を行なう。
$ curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh
curlコマンドを使ってインストール
$ mkdir apex-sample $ cd apex-sample
$ apex init
Enter the name of your project. It should be machine-friendly, as this is used to prefix your functions in Lambda.
Project name: apex-sample
Enter an optional description of your project.
Project description: apex-sample
プロジェクトの作成は対話式
開発環境の用意ができたら、次は実際にインストールしてコードを書いてみるステップだ。サンプルとして作成するのはもちろん、「Hello World」。まずは、function.jsonを次のように修正して、Goを呼び出せるようにする。その後、Lambdaで実行するGOのプログラム本体を作成、さらにLambdaをテスト的に動かすための引数を指定するため、event.jsonを用意して、デプロイ。実行した結果がこちら。
$ apex invoke hello < event.json
{"hello":"world"}
おなじみ、hello worldがGo on APEXで表示された
この連載の記事
-
第8回
デジタル
青森観光アプリ開発コンテスト、緊迫の選定結果をこの目で見た -
第7回
デジタル
ギーク達がリゾート地で火花を散らす青森観光アプリ開発コンテスト -
第6回
デジタル
実践している先達に学び、山形で新しい働き方について考えた -
第5回
デジタル
寒さに負けず、11月11日のJAWS-UG山形を目指そうぞ! -
第3回
デジタル
6月25日はJAWS-UG青森第5回勉強会に行くぞ! -
第2回
デジタル
初登壇からICDP、アドテクまでバラエティ豊かなJAWS-UG青森 -
第1回
デジタル
東北のITの息吹を感じるJAWS FESTA Tohoku 2014開催中 -
デジタル
JAWS-UG東北勉強会レポート - この連載の一覧へ