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

Access to multiple microservices on AWS

k1nakayama
July 15, 2020
1.2k

Access to multiple microservices on AWS

Serverless Meetup Japan Virtual #2
#serverless #AWS #AppSync #serverlessjp

k1nakayama

July 15, 2020
Tweet

Transcript

  1. Serverless Meetup Japan Virtual #2 自己紹介 • 中山 桂一 (

    @k1nakayama ) • 株式会社キャラウェブ クラウドパートナーグループ 副部長 • クラウドパートナー事業をリード • 2020 APN AWS Top Engineers
  2. Serverless Meetup Japan Virtual #2 会社概要 会社名:株式会社キャラウェブ 所在地:東京都台東区東上野4−12−1 資本金:7,161万円 主な事業内容:

    コンテンツ事業 電子書籍のライセンスおよび管理,電子書籍販売 クラウドパートナー事業 サーバーレスアプリケーション構築にフォーカスした アジャイルチーム提供サービス 他 ISO/IEC 27001:2013 & JIS Q 27001:2014 クラウドに関するコンサルティング、設計、 構築、運用、管理 における認証 当社は AWSパートナーネットワーク の コンサルティングパートナー です
  3. Serverless Meetup Japan Virtual #2 マイクロサービスの特徴 Ø 小さく分かれていて、それぞれが自立しているサービス Ø 他のサービスと連携するためのインタフェースを持つ

    • 他のサービスとのコミュニケーションはAPI等のインタフェースを通して 行われる Ø デプロイが独立している • データストア等を共有していない Ø 回復性が高い(他のサービスに影響を与えにくい)
  4. Serverless Meetup Japan Virtual #2 マイクロサービスの課題 主にフロントエンドから見た、マイクロサービスの課題 u 多くのAPI仕様を把握しなければならない u

    結果を得るために、多くのAPIへのリクエストが発生する u 分散処理のため非同期的になりやすい u 認証・認可が複雑になりがち u モニタリングの複雑化
  5. Serverless Meetup Japan Virtual #2 AWS AppSync Ø マネージドなGraphQLサービス Ø

    リアルタイムなデータアクセス Ø 様々なデータソースを利用可能 Ø きめ細やかなアクセスコントロール
  6. Serverless Meetup Japan Virtual #2 GraphQL Ø エンドポイントは1つだけ Ø Query、Mutation、Subscription

    の3つのオペレーションが行える Ø 1回のクエリに複数のリクエストを含めることができる Ø レスポンスに必要な要素を、クライアントが指定可能 Ø フィールド毎にクエリを入れ子にできる
  7. Serverless Meetup Japan Virtual #2 クエリの例 とあるECサイトのユーザープロフィールページに、下記の情報を表示する • ユーザーのプロフィール情報 •

    直近3件の購入履歴(購入した日付と配送ステータス) このサイトはマイクロサービスで構築されていて、それぞれ下記のAPIから情 報を取得可能 • User Service: ユーザーのプロフィール情報を管理 • Order Service:ユーザーの購入情報を管理 • Delivery Service:各注文の配送を管理
  8. Serverless Meetup Japan Virtual #2 REST APIの場合 GET https://user.api/user/12345 {

    “id”: ”12345”, “username”: “hogetarou”, “name”: “ホゲ太郎”, ・・・・ } GET https://order.api/user/12345/orders?limit=3 { “orders”: [ “id”: ”xxxxxxxxxx”, “ordered_at”: 1594482902, “status”: ”delivery_requested”, “details”: [ ・・・・ }
  9. Serverless Meetup Japan Virtual #2 REST APIの場合 GET https://delivery.api/order/xxxxxxxxxx {

    “id”: ” xxxxxxxxxx”, “status”: “Preparing_for_delivery”, “provider”: “ホゲホゲ運輸”, ・・・・ } GET https://delivery.api/order/xzxzxzxzxzx { “id”: ” xzxzxzxzxzx”, “status”: “delivered”, “provider”: “エクスプレス配送”, ・・・・ } 合計5回のリクエストを行い、不要なデータも大量に受け取る
  10. Serverless Meetup Japan Virtual #2 GraphQLの場合 POST https://graphql-server/graphql query getProfilePageData

    { getUserProfile(user_id: “12345”) { name email registration_at } getUserOrderHistory(user_id: “12345”, limit: 3) { ordered_at delivery_info { status } } } ※上記は説明のため簡略化してあります
  11. Serverless Meetup Japan Virtual #2 GraphQLの場合 { “data”: { “getUserProfile”:

    { “name”: “ホゲ太郎”, “email”: “[email protected]”, “registration_at”: 1578727153 }, ”getUserOrderHistory”: { “orders”: [{ “ordered_at”: 1594482902, “delivery_info”: { “status”: “Preparing_for_delivery” } }, ・・・・・ } } } 1回のみリクエストを行い、必要なデータのみ受け取る
  12. Serverless Meetup Japan Virtual #2 AppSyncで利用可能なデータソース Ø AWS Lambda •

    この時点でほぼ全てのデータソースに対応可能 Ø Amazon DynamoDB • トランザクションにも対応 Ø Amazon Elasticsearch Service Ø Amazon Aurora Serverless Ø HTTP Endpoint • SignatureV4を使用可能なため、各種AWSサービスのAPIを使用可能
  13. Serverless Meetup Japan Virtual #2 リゾルバーのデバッグ 1. AppSyncの設定から「ログを有効化」を有効にする 2. CloudWatch

    Logs Insightsで設定したAppSyncのAPI IDを持つロググループ を選択 3. クエリに下記を設定してクエリを実行 fields ispresent(graphQLAPIId) as isApi, @message | filter isApi | filter logType = "ResponseMapping" | sort @timestamp desc | limit 20 | display @message
  14. Serverless Meetup Japan Virtual #2 AppSync + API Gatewayの認証 AppSync

    API Gateway(REST) API Key認証 ◯(最大365日間有効) △ IAM認証 ◯ ◯ Cognito認証 ◯ ◯ OIDC認証 ◯ ☓(カスタム認証で対応) カスタム認証 ☓ ◯ AppSyncのバックエンド(データソース)にAPI Gatewayを置いた場合、それぞ れ使える認証方法が異なるため注意が必要
  15. Cognito認証 1. AppSyncへのリクエスト時に、AuthorizationヘッダーにCognitoのAccessToken、id-token ヘッダーにCognitoのID Tokenをセットしてリクエスト 2. HTTPリゾルバーにてAPI Gatewayのリクエスト時のAuthorizationヘッダーにid-tokenヘ ッダーの値をセット {

    "version": "2018-05-29", "method": "GET", "params": { "headers":{ "Content-Type":"application/json", "Authorization": "${context.request.headers.id-token}" }, ・・・・ AppSyncのCognitoのグループ等を使用した認証が使える上、セッション持続 時間などに制限があるアプリケーションなどのコントロールがしやすい
  16. IAM認証 1. 両方の認証をIAM認証にし、Cognitoの認証済みRoleに“appsync:GraphQL”のポリシー を付与する 2. データソースの設定で下記のようにSigV4の設定を入れておく { "endpoint": " https://abcdefghij.execute-api.ap-northeast-1.amazonaws.com/prod",

    "authorizationConfig": { "authorizationType": "AWS_IAM", "awsIamConfig": { "signingRegion": ”ap-northeast-1", "signingServiceName": ”execute-api” } } } 面倒なヘッダー付与等を行わずにリクエストが行える上、Lambdaからのリク エストなどを統一してIAM認証で制御できる
  17. Serverless Meetup Japan Virtual #2 まとめ Ø AWS AppSyncはフロントエンドの処理をシンプルにしやすい Ø

    各マイクロサービスAPIの手前にAppSyncを置くことで、マイクロサービスに おけるいくつかの課題を解消しやすい Ø Cognitoとの組み合わせで、細かな認証やAPI Gatewayの認証にも使える Ø CloudWatch Logs InsightsやX-Rayなどのサービスも使ってみると捗る