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

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

ykarakita
December 15, 2017

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

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

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. 3 お話する内容(アジェンダ) n開発中のシステムについて n開発で得たナレッジ

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

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

    MD POS CRM ハンズ AWSチーム Alexa開発 サービス開発 社内インフラ統制・整備 クラウド移⾏⽀援
  6. Copyright © 2017 All rights reserved. 8 開発中のシステム nハンズ社内で使うための画像共有・コミュニケーショ ンサービス

    n8⽉からスタート nフロント(Angular)1名 l PCとスマホのブラウザから使⽤ nバックエンド(AWS・Python)1名
  7. Copyright © 2017 All rights reserved. 13 API or SDK?

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

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

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

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

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

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

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

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

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

    SNS API Gateway SQS 実⾏結果や処理済みのデータを⾒たいときは 別にインターフェイスを⽤意(Pull型) id success xxxxxxxxxx true 処理が終わったら Trueに
  17. Copyright © 2017 All rights reserved. 25 認証まわり nサーバレス開発では認証周りをいかに攻略するかが鍵! nWhy?

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

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

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

    の属性に持たせたい! n→custom属性としてshop_idを追加。 ncustom:shop_id == ”001”のユーザーを全件取得したい
  21. Copyright © 2017 All rights reserved. 32 ユーザー登録時に処理を挟む n登録時にCognito UserPoolのカスタムメッセージトリ

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

    l JSで書かれている l CFnをうまくラッピングしてくれる l それゆえ、かゆいところに⼿が届かないときもある
  23. Copyright © 2017 All rights reserved. 37 フレームワーク nServerless framework

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

    PythonのWebフレームワーク「flask」ベース l Djangoもいける l 既存のflaskやDjangoプロジェクトを移⾏したいとき には検討 l ベンダーロックインされづらいかも??
  26. Copyright © 2017 All rights reserved. 42 テスト/デプロイ nサーバーレスなAPI開発はテスト・デプロイを効率化し ないと死ぬ

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

    CodePipeline CodeBuild ②Push ③モジュールインストール ④ステージングへデプロイ ⑤インテグレーションテスト 承認リクエスト ⑦承認 ⑥ステージング環境で 画⾯を通して⼿動テスト 承認結果 ⑧本番へデプロイ
  28. 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 [email protected] - rm -rf vendored/botocore build: commands: - python36 tests/integration/test_xxx.py - serverless deploy -s stage
  29. 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 [email protected] - rm -rf vendored/botocore build: commands: - python36 tests/integration/test_xxx.py - serverless deploy -s stage
  30. 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 [email protected] - rm -rf vendored/botocore build: commands: - python36 tests/integration/test_xxx.py - serverless deploy -s stage
  31. Copyright © 2017 All rights reserved. 50 テスト/デプロイ n$ serverless

    deploy -stage prod と n$ serverless deploy -stage stage を間違えるだけで⼤変 nテスト・デプロイを少し⼯夫するだけで幸せになりま した。
  32. Copyright © 2017 All rights reserved. 52 まとめ n認証周りをいかに効率よく実装するかが鍵! nテスト・デプロイを⼯夫して⼩さくたくさんサイクルを回

    せるようにしておくと、ユーザーからの要望に耐えること ができる nサービスの制限や課⾦モデルを考慮するのはいつもと⼀緒