Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ユーザー企業における サーバーレスな Web APIバックエンド開発 / Developping serverless Web API Backend

C04919d0b55a6a78a68b8ae72658bfbc?s=47 ykarakita
December 15, 2017

ユーザー企業における サーバーレスな Web APIバックエンド開発 / Developping serverless Web API Backend

2017/12/14 API Meetup Tokyo #23 〜サーバレススペシャル〜 @DEJIMA

C04919d0b55a6a78a68b8ae72658bfbc?s=128

ykarakita

December 15, 2017
Tweet

More Decks by ykarakita

Other Decks in Technology

Transcript

  1. Copyright © 2016. All rights reserved. Copyright © 2017 All

    rights reserved. 2017/12/14 API Meetup Tokyo #23 〜サーバレススペシャル〜 @ DEJIMA Ϣʔβʔاۀʹ͓͚Δ αʔόʔϨεͳ 8FC"1*όοΫΤϯυ։ൃ
  2. Copyright © 2017 All rights reserved. 1 ⾃⼰紹介 n名 前:

    百⽊⽥ 雄亮(からきたゆうすけ) n所 属: ハンズラボ株式会社(17年2⽉〜) nチーム: AWSチーム n気になっているサービス:AppSync・CodeStar @ykarakita
  3. Copyright © 2017 All rights reserved. 2 お話する内容 nサーバーレスで開発したシステムがほぼ完成したので、 開発中にぶつかった問題や検討したこと、⼯夫した点

    などについてのナレッジを共有したいと思います。
  4. Copyright © 2017 All rights reserved. 3 お話する内容(アジェンダ) n開発中のシステムについて n開発で得たナレッジ

    l API or SDK l 同期 or ⾮同期 l フレームワーク l 認証まわり l テスト/デプロイ n今後やりたいこと nまとめ
  5. Copyright © 2017 All rights reserved. 4 業務について 内製 外販

    MD POS CRM ハンズ
  6. Copyright © 2017 All rights reserved. 5 業務について 内製 外販

    MD POS CRM ハンズ AWSチーム Alexa開発 サービス開発 社内インフラ統制・整備 クラウド移⾏⽀援
  7. Copyright © 2017 All rights reserved. 6 業務について 内製 外販

    MD POS CRM ハンズ AWSチーム Alexa開発 サービス開発 社内インフラ統制・整備 クラウド移⾏⽀援
  8. Copyright © 2017 All rights reserved. 7 開発中のシステム

  9. Copyright © 2017 All rights reserved. 8 開発中のシステム nハンズ社内で使うための画像共有・コミュニケーショ ンサービス

    n8⽉からスタート nフロント(Angular)1名 l PCとスマホのブラウザから使⽤ nバックエンド(AWS・Python)1名
  10. Copyright © 2017 All rights reserved. 9 開発中のシステム

  11. Copyright © 2017 All rights reserved. 10 サーバレスにした理由 n社内の技術基盤チームとして、新しい技術を積極的に 取り⼊れて、社内に共有する役割

    n短期間でプロトタイプを作成して従業員からフィード バックを得たかった
  12. Copyright © 2017 All rights reserved. 11 ここからは 開発してみてのこと

  13. Copyright © 2017 All rights reserved. 12 API or SDK?

  14. Copyright © 2017 All rights reserved. 13 API or SDK?

    クライアント SDK クラウドリソース API Gateway
  15. Copyright © 2017 All rights reserved. 14 API or SDK?

    nSDKでクライアントから直接リソースを参照・書き込 みを⾏うのか、APIを⽤意するのか nマルチクライアントに対応 nマルチクラウド nシングルクライアント nシングルクラウド SDKも使って クラウドネイティブな アプリに APIを提供したほうが クライアントは 作りやすいし統制できる もちろんケースによって選択は変わる
  16. Copyright © 2017 All rights reserved. 15 API or SDK?

    クライアント 役割分担 サーバーサイド
  17. Copyright © 2017 All rights reserved. 16 API or SDK?

    クライアント シングルクライアントの場合の役割分担 サーバーサイド 現状 API SDK
  18. Copyright © 2017 All rights reserved. 17 API or SDK?

    クライアント サーバーサイド こうのほうが効率よいかも? シングルクライアントの場合の役割分担 SDK API
  19. Copyright © 2017 All rights reserved. 18 API or SDK?

    クライアント マルチクライアントの場合 サーバーサイド API SDK クライアント SDK
  20. Copyright © 2017 All rights reserved. 19 同期 or ⾮同期

  21. Copyright © 2017 All rights reserved. 20 同期 or ⾮同期

    n同期処理 l リクエストに対して結果をレスポンスで返す n⾮同期処理 l 結果はもらわない or 後で取得する l Push型 - サーバーサイドから通知する l Pull型 - クライアントが結果を取得しに⾏く
  22. Copyright © 2017 All rights reserved. 21 同期 or ⾮同期

    n処理に時間がかかる場合 nクライアント側に即時レスポンスが必要な場合 n処理のエラーを許容できる場合 ⾮同期処理でパフォーマンス向上を検討 開発したシステムでは「いいね」機能などを⾮同期に。 →処理に失敗していても許容できる 補⾜: 処理がエラーでも裏側で再度実⾏ するような仕組みは必要に応じてあった ほうがいいです。
  23. Copyright © 2017 All rights reserved. 22 同期 or ⾮同期

    202 Accepted レスポンス メインの処理 API Gateway SNS SQS
  24. Copyright © 2017 All rights reserved. 23 同期 or ⾮同期

    SNS API Gateway SQS 実⾏結果や処理済みのデータを⾒たいときは 別にインターフェイスを⽤意(Pull型) id success xxxxxxxxxx true 処理が終わったら Trueに
  25. Copyright © 2017 All rights reserved. 24 認証まわり

  26. Copyright © 2017 All rights reserved. 25 認証まわり nサーバレス開発では認証周りをいかに攻略するかが鍵! nWhy?

    l ビジネスロジックな部分ではないので⾯倒くさい l 次からも同じ仕組み、テンプレートを使いまわせる
  27. Copyright © 2017 All rights reserved. 26 認証まわり nAPI Gatewayの認証⽅法は3種類

    l User Pools Authorizers - Cognito UserPoolsで認証 l AWS IAM authorization - 認証・IAMロールベースの認可 l Custom Authorizers - 何かしらの認証サービスを使⽤。独⾃のロジックで 認証・認可を実装
  28. Copyright © 2017 All rights reserved. 27 認証まわり l Cognito

    User Poolsのグループ機能で叩けるAPIとか アクセスできるリソースを制御したい場合はIAM authorizationを使⽤ l →sigv4を使う必要がある - →フロントで実装がめんどくさいらしい - →AWS Amplifyが登場! - javascriptクライアントでのsigv4⽂字列⽣成など の実装が容易に!
  29. Copyright © 2017 All rights reserved. 28 認証まわり(ぶつかったこと) nユーザーが所属する店舗をDBではなくCognito UserPool

    の属性に持たせたい! n→custom属性としてshop_idを追加。 ncustom:shop_id == ”001”のユーザーを全件取得したい
  30. Copyright © 2017 All rights reserved. 29 カスタム属性、 検索できない問題

  31. Copyright © 2017 All rights reserved. 30 カスタム属性検索できない問題

  32. Copyright © 2017 All rights reserved. 31 カスタム属性検索できない問題 n→結局、ユーザーID(sub)とshop_idをキーバリューと したDBを持つことに。。

  33. Copyright © 2017 All rights reserved. 32 ユーザー登録時に処理を挟む n登録時にCognito UserPoolのカスタムメッセージトリ

    ガーでLambdaを起動 nカスタムメッセージで⼀時ログインパスワードを含ん だ案内メールを送信。 nそれと合わせて、ユーザーIDと店舗IDをDynamoDBに 追加。
  34. Copyright © 2017 All rights reserved. 33 フレームワーク

  35. Copyright © 2017 All rights reserved. 34 フレームワーク

  36. Copyright © 2017 All rights reserved. 35 フレームワーク nServerless framework

    l JSで書かれている l CFnをうまくラッピングしてくれる l それゆえ、かゆいところに⼿が届かないときもある
  37. Copyright © 2017 All rights reserved. 36 結局CFnムキムキ問題

  38. Copyright © 2017 All rights reserved. 37 フレームワーク nServerless framework

    l JSで書かれている l CFnをうまくラッピングしてくれる l それゆえ、かゆいところに⼿が届かないときもある l 結局CFnムキムキ問題 l 細かいことをやろうとすると結局CFnでOverwriteが 必要になり、ムキムキのテンプレートができあがる l ⼩規模・シンプルなWeb APIの構築にはいいと思う
  39. Copyright © 2017 All rights reserved. 38 フレームワーク nAWS SAM

    l CFnの拡張 l どんどん使いやすくなっている印象 l SAM local(2017-08-11) - CodeStarインテグレーション - AWS Serverless Application Repository (Re:Inventで発表。Preview) l AWSが出しているのでサポートにも聞きやすい n次はこれ使いたい!
  40. Copyright © 2017 All rights reserved. 39 フレームワーク nZappa l

    PythonのWebフレームワーク「flask」ベース l Djangoもいける l 既存のflaskやDjangoプロジェクトを移⾏したいとき には検討 l ベンダーロックインされづらいかも??
  41. Copyright © 2017 All rights reserved. 40 フレームワーク n個⼈的にはSAMが⼀歩抜けてる印象 nこれも使い所

  42. Copyright © 2017 All rights reserved. 41 テスト/デプロイ

  43. Copyright © 2017 All rights reserved. 42 テスト/デプロイ nサーバーレスなAPI開発はテスト・デプロイを効率化し ないと死ぬ

    l ローカルでインテグレーションテストを完結させるの は難しい nデプロイに5分とか10分とか平気でかかる
  44. Copyright © 2017 All rights reserved. 43 テスト/デプロイ CodePipeline CodeBuild

  45. Copyright © 2017 All rights reserved. 44 テスト/デプロイ Developer ①ユニットテスト

    CodePipeline CodeBuild ②Push ③モジュールインストール ④ステージングへデプロイ ⑤インテグレーションテスト 承認リクエスト ⑦承認 ⑥ステージング環境で 画⾯を通して⼿動テスト 承認結果 ⑧本番へデプロイ
  46. Copyright © 2017 All rights reserved. 45 テスト/デプロイ nBuildspec.yml version:

    0.2 phases: install: commands: - yum update -y - yum install -y python36 python36-devel.x86_64 gcc libffi-devel openssl-devel - pip-3.6 install -r requirements.txt -t vendored - pip-3.6 install pyyaml warrant - npm install -g serverless@1.22.0 - rm -rf vendored/botocore build: commands: - python36 tests/integration/test_xxx.py - serverless deploy -s stage
  47. Copyright © 2017 All rights reserved. 46 テスト/デプロイ nBuildspec.yml version:

    0.2 phases: install: commands: - yum update -y - yum install -y python36 python36-devel.x86_64 gcc libffi-devel openssl-devel - pip-3.6 install -r requirements.txt -t vendored - pip-3.6 install pyyaml warrant - npm install -g serverless@1.22.0 - rm -rf vendored/botocore build: commands: - python36 tests/integration/test_xxx.py - serverless deploy -s stage
  48. Copyright © 2017 All rights reserved. 47 テスト/デプロイ nBuildspec.yml version:

    0.2 phases: install: commands: - yum update -y - yum install -y python36 python36-devel.x86_64 gcc libffi-devel openssl-devel - pip-3.6 install -r requirements.txt -t vendored - pip-3.6 install pyyaml warrant - npm install -g serverless@1.22.0 - rm -rf vendored/botocore build: commands: - python36 tests/integration/test_xxx.py - serverless deploy -s stage
  49. Copyright © 2017 All rights reserved. 48 テスト/デプロイ

  50. Copyright © 2017 All rights reserved. 49 テスト/デプロイ

  51. Copyright © 2017 All rights reserved. 50 テスト/デプロイ n$ serverless

    deploy -stage prod と n$ serverless deploy -stage stage を間違えるだけで⼤変 nテスト・デプロイを少し⼯夫するだけで幸せになりま した。
  52. Copyright © 2017 All rights reserved. 51 まとめ

  53. Copyright © 2017 All rights reserved. 52 まとめ n認証周りをいかに効率よく実装するかが鍵! nテスト・デプロイを⼯夫して⼩さくたくさんサイクルを回

    せるようにしておくと、ユーザーからの要望に耐えること ができる nサービスの制限や課⾦モデルを考慮するのはいつもと⼀緒
  54. Copyright © 2017 All rights reserved. 53 今後やっていきたいこと

  55. Copyright © 2017 All rights reserved. 54 今後やっていきたいこと n今のやつ全部ぶっ壊してAppSyncにします!!!!

  56. Copyright © 2017 All rights reserved. 55 今後やっていきたいこと n今のやつ全部ぶっ壊してAppSyncにします!!!! っていうのは冗談で・・

  57. Copyright © 2017 All rights reserved. 56 今後やっていきたいこと nできるところからAppSync導⼊ nSwaggerテンプレート化

    nエンプラなのでAD連携必須? n画像解析関連 n動画対応
  58. Copyright © 2017 All rights reserved. 57 Thank you nこのあと懇親会で意⾒交換させてください!!!