ayumu_aoの日記

SIerから事業会社に転職したエンジニアが技術についてや組織論、本の話、今までの体験談などなどを個人的に垂れ流しています。

AWS Summitに行ってきた!レポート※セッションメモ (2017/06/02) [ワイヤ・アンド・ワイヤレス]AWS Lambdaを使ったモバイルバックエンドのサーバーレス開発事例

AWS Summitに行ってきた!レポート※セッションメモ (2017/06/02) [ワイヤ・アンド・ワイヤレス]AWS Lambdaを使ったモバイルバックエンドのサーバーレス開発事例

AWS Summit 2017/06/02 [ワイヤ・アンド・ワイヤレス]AWS Lambdaを使ったモバイルバックエンドのサーバーレス開発事例

自己紹介

  • 相馬 賢司

アジェンダ

  • TRAVEL JAPAN WiFi
  • サーバレス
  • APIGateWay/Lambda
  • テスト
  • デプロイ
  • ログ
  • まとめ

■TRAVEL JAPAN WiFi

  • 無料で訪日外国人向けにWiFiを提供できるサービス
  • 法人向けに胴体分野分析レポート、コンテンツ配信
  • MAU:約100,000

クラウドの恩恵を活かすためにAWSのサービスを多く利用することでスケーラビリティなどにも優れる作りに変更

※個人的な所感:一つの大きなサービス→マイクロサービス化なのかな?

■サーバレス

スケーリング、ロギングはクラウド側で管理

課金単位は実行時間

2層モデル

■APIGateWay/Lambda

Restで呼び出した処理を後ろに渡すために利用

シーケンス制御、DynamoDB・S3などへの書き込みイベントを景気にほかへのデータ転送にも利用

設計・実装方針

  • 検証、本番で分けている
  • そのため環境差分などは発生するがそれに対しては対策している
  • GateWayタイムアウト仕様は30秒から変更できないためLambdaのシーケンスなどに工夫が必要

Lambdaの苦労した点

  • ライブラリクラスが増えると起動に時間がかかる
  • VPCの場合、+ENIのアタッチ(10sec〜30sec) → CloudWatch Eventで定期的に起動、メモリを増やすことで対応している

APIGatewayからLambdaの呼び出し(レイテンシ):

  • 常に同期呼び出しとなる
  • 並列処理はI/O処理に効果がある
  • 非同期で処理したい場合は五段にLambdaを用意し、InvocatuionType=‘Event'でInvoke()

残課題 * エンドツーエンド試験環境、ログ・エラー箇所の特定

APIリソースとLambda関数の実装・デプロイ

  • APIGateway:Lambda=1:1で運用
  • SAMによる管理
  • 依存や結合をなくしデプロイをしやすくする
  • モバイルアプリ側とのインターフェース

【参考】Lambdaの言語別検証結果

前提:

  1. クライアントに含まれるキーをもとにDynamoDBからGEtItem
  2. 取得した値の一部をAESで暗号化

※あとでスライド確認

言語はC#Java、node.js、Python

結果

  • JAVA/C#は起動に時間が掛かるが、継続して動作すると早くなる
  • メモリに関してはライブラリに依存するがメモリ使用量が多め
  • ※CPUを使うような処理であればJAVA/C#のほうが早めだが転送処理程度であれば言語差異は少ない

■テスト

ユニットテストデバッグ

  1. テスト用event,contextを準備
  2. AWSサービスのモックを作成
  3. 各関数、リクエストハンドラのテスト

※後続のAWSサービスをどうするか

  • モック作成/Proxyを使う
  • AWS上に環境を準備

クラウドを使ってるんだから

  • モックを使わずに
  • SAMで必要なサービスをデプロイ
  • テストが終わったらdelete stack

参考情報として

  • LambdaのエミュレータやモックがGitHubに公開されているので更新状況などを確認のうえ使ってみるのもよいかも

SAM(Serverless Application Model)

  • YAMLで記述できる
  • サンプルがGitHubに公開されてる

■パッケージング/デプロイ

パッケージング

  • Python/Node.jsはCloudFormation packageコマンドを使うとテンプレートしていしたディレクトリ配下をパッケージしてS3にアップロード
  • C#/JAVAはビルド時にS3へアップロードしたパスをテンプレートのパラメータへ指定

※メモ漏れあとでスライドで復習

■ログ

ログは標準出力へ

トレースできるようにするコツ

  • context.requestIDを出力
  • ピタゴラスイッチをリンクできるようにキーを付与
  • デプロイした関数のバージョン

ログの調査方法例

  • AWS CLIで日付・文字列をフィルタリング(結果をjqでパース)

■まとめ

  • 学習コストはそれなりに掛かる
  • サーバレスでの実装は制約が多い
  • 制約はマイクロサービスやリアクティブなシステムへの移行に有効
  • アプリケーションの特性に応じたメトリクス監視
  • 管理はSAMなどのフレームワークを使って自動化
  • アプリケーションやサービスに応じてmBaasと比較選択
  • Lambdaを使わなくて住む実装パターンもある
  • 楽しむ(新しいことを楽しむ!)