このページの本文へ

JAWS-UG中部・北陸勉強会レポート 第10回

JAWS-UG 東海道 in 浜松 2016でアームズの小林氏が語る

しずおかランチ開発で得たLambdaとElasticsearch連携時の認証テク

2016年09月30日 07時00分更新

文● 重森大 編集●大谷イビサ

  • この記事をはてなブックマークに追加
  • 本文印刷

アームズは、静岡イチオシのランチ情報を投稿して共有する「しずおかランチ」というWebアプリを提供している。JAWS-UG東海道 in 浜松では同社の小林 秀和さんが、アプリで使われているLambdaやElasticsearch Serviceなどの実装で工夫したポイントについて語ってくれた。

シズオカアプリコンテストでAWS賞を受賞した「しずおかランチ」

 しずおかランチを紹介してくれたアームズの小林秀和さんは、前職が総務・経理という異色の経歴を持つエンジニア。30歳を契機にプログラミングを個人的に学び始め、5年後には現在の会社を設立したという。当初はPHPを使っていたが、最近はRuby on Railsに浮気中だとのこと。しずおかランチも、Ruby on Railsで組まれている。

「グルメアプリは数多くありますが、ほとんどはお店にフォーカスしています。しずおかランチはお店ではなく、メニューに注目したアプリです。このお店のこれを食べて欲しい、このメニューが美味しいお店を知りたい、そんな要望に応えるアプリです」(小林さん)

しずおかランチ(PC版サイト)

 アプリの完成度は高く、シズオカアプリコンテストではAWS賞を受賞。小林さんも見事、AWS re:Invent 2016の招待券を手にしている。「イベント招待券はいただけたのですが、交通費は自腹だそうです」と語り、会場の笑いを誘っていた。

「実はシズオカアプリコンテストでは初めからAWS賞を狙っていました。そのために、AWSで使えるサービスをできるだけたくさん使うというコンセプトで作られています。今日はその中でもLambdaとElasticsearch Serviceを中心に話をしたいと思っています」(小林さん)

アームズの小林秀和さん

 Elasticsearch ServiceはREST APIを使って呼び出せる全文検索エンジンで、AWSでは現在バージョン1.5とバージョン2.3が提供されている。しずおかランチ開発時にはバージョン1.5しか提供されていなかったため、現在もバージョン1.5で運用されている。いずれバージョン2.3での動作チェックを行ない、移行する予定だ。

IAMロールの認証情報を使ってElasticsearch Serviceへの不正アクセスを防止

 しずおかランチではランチやお店の情報をEC2からDynamoDBとElasticsearch Serviceに同時にデータを保存している。この操作自体はRubyのGemを使っており、簡単に実装できるとのこと。各種ログを検索する際はFluentdを経由してS3を参照し、S3に保存されているCSV形式のデータを読み出し、Lambdaを使ってElasticsearch Serviceを呼び出している。

「Lambdaが話題に上ることが増えたので、これは使ってみなければと思い、あえてEC2ではなくLambdaからElasticsearch Serviceを呼び出す仕様にしました。Elasticsearch Serviceへのデータの受け渡しはGemで簡単にできたので、呼び出すのも簡単だろうと思ったのですが、アクセス制御で悩むことになりました」(小林さん)

 Elasticsearch ServiceはREST APIで呼び出すので、アクセス先さえわかれば誰でも好きに呼び出せる。DoS攻撃も思いのままだ。当初はEC2からElasticsearch Serviceを呼び出すつもりだったため、IPアドレス制限でセキュリティを担保する予定だった。しかしLambdaは起動するたびにIPアドレスが変化するので同じ手が使えない。

「LambdaからElasticsearch Serviceを呼び出す際に使えるアクセス制限について調べたところ、IAMを使った手法にがあることがわかりました。AWSがGitHubでサンプルコードも公開していたので、それを参考に実装できました」(小林さん)

Elasticsearch Serviceの制限はIAMもしくはIPで行なう

 Lambdaの認証にはIAMロールの認証情報が使われるため、Elasticsearch Service側でロールに対してアクセスポリシーを設定し、不正アクセスを防ぐことに成功している。データ分析のためにKibanaも使っているが、こちらはIPアドレスが変わらないので、IPアドレス制限で対策できているとのこと。

Elasticsearch ServiceとKibanaでやってしまった失敗談とその対策

 Elasticsearch Serviceはデータを格納する際、デフォルトで文字列の要素解析を行なう。これは部分一致検索を高速に行なうための処理だが、文字列が単語ごとに区切られてしまうため完全一致検索が難しくなるというデメリットがある。小林さんがそれに気づいたのは運用を始めてみてからのことだった。

「デフォルトのanalyzedでフィールドを定義してしまったため、格納した情報が単語ごとに分解されてしまい、Kibanaによる分析結果が想定したものになりませんでした。しかしすでに運用がスタートし、データが格納されているフィールドの定義を変えることはできません」(小林さん)

「定食」「オムライス」「の」「を」など単語単位で集計されてしまった

 解決策を模索する小林氏が見つけたのは、Multi Fieldを使う方法だ。Multi Filedを使うと、1つのフィールドから定義の異なる複数のフィールドを生成できる。この機能を使って、analyzedに設定されたフィールドと同時にnot_analyzedに設定したフィールドも用意したことで、希望通りの検索結果を得られるようになった。

not_analyzedのフィールドを指定することで想定通りの分析結果を得られるようになった

CloudWatchで障害を検知して電話がで通知する仕組みも装備

 しずおかランチには、システム障害を検知して電話で知らせる仕組みも備わっている。CloudWatchがサービスダウンを検知するとSNSを使ってLambdaをキックし、LambdaからTwilioを呼び出すことで小林氏に電話がかかってくるという仕掛けだ。

CloudWatchでサーバーの死活監視を行ない、異常時にはTwilioと連携して電話をかける仕組みに

「TwilioはIP電話やSMSをAPIから操作できるサービスで、比較的安価に利用できるのが魅力です。男声、女声を選べるようになっているのですが、どちらも非常に無機質な話し方なのがちょっと残念なところです(笑)」(小林さん)

 Twilioの設定自体は簡単で、読み上げてもらいたい文章をXMLファイルで指定すればいいだけだ。一点注意しなければならないのは、このXMLファイルを監視対象のサーバーとは別のサーバーに設置しておくということだ。サーバーに障害が発生した際に使うファイルを同じサーバーに置いてあっては、必要なときに読み出せない訳だから、当然といえば当然なのだが、うっかりやってしまいそうなので気をつけたい。

10月22日(土)、「JAWS Festa 東海道 2016」が開催!

 

10月22日、AWSのユーザーグループであるJAWS-UGが主催する大型コミュニティイベントであるJAWS Festaが今年は名古屋工業大学で開催される。今年のテーマは「クラウド・IoTの最前線、みんなで学べば怖くない!〜一緒に熱くなれる仲間を見つけよう〜」ということで、学ぶだけのセミナー形式勉強会にならない多彩な企画が用意されているという。

詳細はこちら


カテゴリートップへ

この連載の記事