[AWS Summit Tokyo Day3] AWS Lambdaを使ったモバイルバックエンドのサーバーレス開発事例
「株式会社ワイヤアンドワイヤレス」さんでのモバイルアプリのバックエンドのサーバーレス化の事例をお聞きしてきました。
ロギングやデプロイフローなど、みんなどうしてるんだろー?って思ってところが概観できたと思います。
ビジネス
- 公衆WIFI事業者
- TRABEL_JAPAN WIFI
- 外国人旅行者向け。国内にはユーザー動向や広告配信を提供
システム構成
- v1
- ELB,EC2等を利用した一般的な構成
- ロジックがクライアントに集中してしまっていいた
- v2
- ELBをもうひとつ前に
- v3
- API GatewayとLambdaを全面に出した
サーバーレス?
- 用意するものはコードと構成パラメータ
- API Gateway通った上でEC2で
- 基本はAPI Gatewayを前に置くベース
- Dynamo,S3への書き込み
API Gareway / Lambdaの実装方針
- Lambdaファンクション自体は同じものを使って、ビルドスクリプト側で環境を分ける
苦労した点
- Lambdaの起動時間 (Java)
- VPC内の運用、ENIをアタッチする時間が膨大
- CloudwatchのイベントでVPCないのLambdaを定期的に起動してあっためる
- 起動時間が短縮される
- Gatewayのレイテンシ
- 常に同期処理になるのでAPI Gatewayとの相性は良い
- なのでLambdaを非同期でつなぐことで処理が一定になる
- E2Eテスト問題
- ログ/エラー箇所の問題
APIのリソースとLambdaのデプロイ
- API GatewayはSwaggerで管理できる
- APIリソースとlambdaを1対1にした
- 負荷が高い時は例外的に別の関数
- SAMを使っている
Lambda関数の言語間検証
- JVM系はまあ遅い
- CPUがっつり使う処理があればJavaとかのが早いかも
Lambdaのテスト
- ユニットテスト
- AWSサービスのモックを内製
- pythonのMagic Mock
- あるいはAWS上に環境を準備
- クラウド使ってるんだから
- モック使わずに
- SAMでサービスをデプロイ
- テスト終わってから殺す
パッケージング/デプロイ
- プレフィックスをつけて試験/本番をデプロイ
- SAM => GitLab => Jenkins
ロギング
- aws-cli/jqでパースする
- アプリケーションログにはrequestIdを出力
- X-Rayでトランザクション数/Durationが確認可能
- agentが入れられない代わりにx-rayがある
まとめ
- 導入に関しては開発のシステム構成の概念が違うためそれなりの学習は必要になる