Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Copyright © 2017 All rights reserved. 1 ⾃⼰紹介 n名 前: 百⽊⽥ 雄亮(からきたゆうすけ) n所 属: ハンズラボ株式会社(17年2⽉〜) nチーム: AWSチーム n気になっているサービス:AppSync・CodeStar @ykarakita

Slide 3

Slide 3 text

Copyright © 2017 All rights reserved. 2 お話する内容 nサーバーレスで開発したシステムがほぼ完成したので、 開発中にぶつかった問題や検討したこと、⼯夫した点 などについてのナレッジを共有したいと思います。

Slide 4

Slide 4 text

Copyright © 2017 All rights reserved. 3 お話する内容(アジェンダ) n開発中のシステムについて n開発で得たナレッジ l API or SDK l 同期 or ⾮同期 l フレームワーク l 認証まわり l テスト/デプロイ n今後やりたいこと nまとめ

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

Copyright © 2017 All rights reserved. 7 開発中のシステム

Slide 9

Slide 9 text

Copyright © 2017 All rights reserved. 8 開発中のシステム nハンズ社内で使うための画像共有・コミュニケーショ ンサービス n8⽉からスタート nフロント(Angular)1名 l PCとスマホのブラウザから使⽤ nバックエンド(AWS・Python)1名

Slide 10

Slide 10 text

Copyright © 2017 All rights reserved. 9 開発中のシステム

Slide 11

Slide 11 text

Copyright © 2017 All rights reserved. 10 サーバレスにした理由 n社内の技術基盤チームとして、新しい技術を積極的に 取り⼊れて、社内に共有する役割 n短期間でプロトタイプを作成して従業員からフィード バックを得たかった

Slide 12

Slide 12 text

Copyright © 2017 All rights reserved. 11 ここからは 開発してみてのこと

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Copyright © 2017 All rights reserved. 18 API or SDK? クライアント マルチクライアントの場合 サーバーサイド API SDK クライアント SDK

Slide 20

Slide 20 text

Copyright © 2017 All rights reserved. 19 同期 or ⾮同期

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Copyright © 2017 All rights reserved. 24 認証まわり

Slide 26

Slide 26 text

Copyright © 2017 All rights reserved. 25 認証まわり nサーバレス開発では認証周りをいかに攻略するかが鍵! nWhy? l ビジネスロジックな部分ではないので⾯倒くさい l 次からも同じ仕組み、テンプレートを使いまわせる

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Copyright © 2017 All rights reserved. 28 認証まわり(ぶつかったこと) nユーザーが所属する店舗をDBではなくCognito UserPool の属性に持たせたい! n→custom属性としてshop_idを追加。 ncustom:shop_id == ”001”のユーザーを全件取得したい

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Copyright © 2017 All rights reserved. 32 ユーザー登録時に処理を挟む n登録時にCognito UserPoolのカスタムメッセージトリ ガーでLambdaを起動 nカスタムメッセージで⼀時ログインパスワードを含ん だ案内メールを送信。 nそれと合わせて、ユーザーIDと店舗IDをDynamoDBに 追加。

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

Copyright © 2017 All rights reserved. 36 結局CFnムキムキ問題

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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次はこれ使いたい!

Slide 40

Slide 40 text

Copyright © 2017 All rights reserved. 39 フレームワーク nZappa l PythonのWebフレームワーク「flask」ベース l Djangoもいける l 既存のflaskやDjangoプロジェクトを移⾏したいとき には検討 l ベンダーロックインされづらいかも??

Slide 41

Slide 41 text

Copyright © 2017 All rights reserved. 40 フレームワーク n個⼈的にはSAMが⼀歩抜けてる印象 nこれも使い所

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

Copyright © 2017 All rights reserved. 42 テスト/デプロイ nサーバーレスなAPI開発はテスト・デプロイを効率化し ないと死ぬ l ローカルでインテグレーションテストを完結させるの は難しい nデプロイに5分とか10分とか平気でかかる

Slide 44

Slide 44 text

Copyright © 2017 All rights reserved. 43 テスト/デプロイ CodePipeline CodeBuild

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Copyright © 2017 All rights reserved. 51 まとめ

Slide 53

Slide 53 text

Copyright © 2017 All rights reserved. 52 まとめ n認証周りをいかに効率よく実装するかが鍵! nテスト・デプロイを⼯夫して⼩さくたくさんサイクルを回 せるようにしておくと、ユーザーからの要望に耐えること ができる nサービスの制限や課⾦モデルを考慮するのはいつもと⼀緒

Slide 54

Slide 54 text

Copyright © 2017 All rights reserved. 53 今後やっていきたいこと

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Copyright © 2017 All rights reserved. 56 今後やっていきたいこと nできるところからAppSync導⼊ nSwaggerテンプレート化 nエンプラなのでAD連携必須? n画像解析関連 n動画対応

Slide 58

Slide 58 text

Copyright © 2017 All rights reserved. 57 Thank you nこのあと懇親会で意⾒交換させてください!!!