Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
HIGOBASHI.AWS 第5回「AngularとAWS AppSyncで作るサーバーレスア...
Search
yuji nishimura
July 27, 2018
Technology
0
4k
HIGOBASHI.AWS 第5回「AngularとAWS AppSyncで作るサーバーレスアプリケーション」
HIGOBASHI.AWSで発表したスライドです。
yuji nishimura
July 27, 2018
Tweet
Share
More Decks by yuji nishimura
See All by yuji nishimura
Kinesis Video Streams 最新アップデートの紹介 #reinvent #cmregrowth
ynishimura
0
1.5k
HIGOBASHI.AWS 第12回「AWS CDKのConstruct Libraryを作って 公開してみよう」
ynishimura
0
590
Angularを使って爆速で管理画面を作る
ynishimura
0
2.9k
サーバーレスアーキテクチャで作ったIoTのバックエンドシステムで遭遇したエラーと対処法
ynishimura
0
2.1k
HIGOBASHI.AWS 第10回「サーバーレスとデータ分析 ~AWS Lambdaを活用して効率化しよう~」
ynishimura
0
1.3k
re:Invent2018 IoT系の新サービス・アップデート
ynishimura
0
1.3k
【Developers.IO 2018】IoTを実現するためのAWSのIoT系サービス:分析、セキュリティ管理、組み込み向けサービスもあるで!
ynishimura
2
1.1k
HIGOBASHI.AWS 第6回「Amazon Route53で ドメインを購入して、設定してみよう」
ynishimura
0
1.8k
higobashi.aws 第2回「IoTとサーバーレスとラズパイ」
ynishimura
1
1.5k
Other Decks in Technology
See All in Technology
第4回 関東Kaggler会 [Training LLMs with Limited VRAM]
tascj
11
1.6k
Goss: New Production-Ready Go Binding for Faiss #coefl_go_jp
bengo4com
0
1.1k
ソフトウェア エンジニアとしての 姿勢と心構え
recruitengineers
PRO
1
120
Go で言うところのアレは TypeScript で言うとコレ / Kyoto.なんか #7
susisu
1
180
歴代のWeb Speed Hackathonの出題から考えるデグレしないパフォーマンス改善
shuta13
6
590
キャリアを支え組織力を高める「多層型ふりかえり」 / 20250821 Kazuki Mori
shift_evolve
PRO
2
290
イオン店舗一覧ページのパフォーマンスチューニング事例 / Performance tuning example for AEON store list page
aeonpeople
1
220
コミュニティと計画的偶発性理論 - 出会いが人生を変える / Life-Changing Encounters
soudai
PRO
7
1.3k
OpenAPIから画面生成に挑戦した話
koinunopochi
0
150
LLM時代の検索とコンテキストエンジニアリング
shibuiwilliam
2
1.1k
モダンな現場と従来型の組織——そこに生じる "不整合" を解消してこそチームがパフォーマンスを発揮できる / Team-oriented Organization Design 20250825
mtx2s
5
500
Gaze-LLE: Gaze Target Estimation via Large-Scale Learned Encoders
kzykmyzw
0
310
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
820
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
560
How to Think Like a Performance Engineer
csswizardry
25
1.8k
4 Signs Your Business is Dying
shpigford
184
22k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
1k
GitHub's CSS Performance
jonrohan
1031
460k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3k
The Invisible Side of Design
smashingmag
301
51k
Transcript
2018/7/27 西村祐二 AngularとAWS AppSyncで作る サーバーレスアプリケーション
♣自己紹介 • 西村祐二(27) • サーバーレス開発部所属 • 元情シス、インフラエンジニア •
入社1年2ヶ月 • AWS歴1年2ヶ月 • 東京から大阪にUターン転職 • 前職はISPの会社で顧客システムの運用・保守
Angular 使ったことある人✋
GraphQL 使ったことある人✋
AWS AppSync 使ったことある人✋
簡単なAWS AppSyncの説明 ✦GraphQLのマネージドサービス ✦GraphQLを通してAWSサービスを使える ✦複数人リアルタイム、オフライン対応アプリ作れる ✦コンフリクトもクラウドで解消できる ✦エンタープライズレベルのセキュリティ機能
簡単なAWS AppSyncの説明 ✦GraphQLのマネージドサービス ✦GraphQLを通してAWSサービスを使える ✦複数人リアルタイム、オフライン対応アプリ作れる ✦コンフリクトもクラウドで解消できる ✦エンタープライズレベルのセキュリティ機能
デモアプリ作ってきました!
作ったデモアプリ ✦リアルタイムいいね!アプリ ‣をタップすると「いいね!」が増えます ‣他の人がタップした値も反映されます
みんなも触ってみてね http://ux.nu/Y4Fic ✦数字が更新されないときはリロードしてね ✦発表で「いいね!」と思ったら都度タップしてね σϞΞϓϦൃද࣌ͷΈެ։ͱͳΓ·͢ɻ "OHVMBSͷιʔε(JUIVCʹެ։͍ͯ͠ΔͷͰ ͦͪΒΛ֬͝ೝ͍ͩ͘͞ɻ IUUQTHJUIVCDPNOJTIJNVSBZVKJ%FNP"QQ4ZOD"OHVMBS"QQ
‣シンプルな構成で実現 ‣API Gatewayの代わりにAppSync ‣クライアントはGraphQLでリクエスト 構成図 S3 Amazon DynamoDB
Amazon CloudFront AWS AppSync query subscription mutation
‣シンプルな構成で実現 ‣API Gatewayの代わりにAppSync ‣クライアントはGraphQLでリクエスト 構成図 S3 Amazon DynamoDB
Amazon CloudFront AWS AppSync query subscription mutation
GraphQLの概要 ‣API用のクエリ言語 ‣クライアントがサーバからデータを •Query(取得) •Mutation(追加、変更) •Subscription(購読) できるようになる ‣クライアント側がレスポンス形式指定
•必要データだけ取得(メモリ、帯域節約)
APIの形式 /blogs /commentsOnBlog /blogByAuthor /blogInfo 従来:サーバ主体 GraphQL:クライアント主体 やりたいこと
ほしい情報をリクエスト
リクエスト例 query { getBlog( id:”1” ){ title category
} } サーバ側 クライアント レスポンス type Query { getBlog(id:ID):[blog] } type blog { id: ID! author: String title: String category: String createdAt: Int! } } スキーマ、型定義 { “title”: “hoge”, “category”: “AWS” } 必要な情報だけ リクエスト リクエストした データのみ返却
‣ほぼリアルタイムでのデータ購読 ‣Mutationをトリガーに通知 Subscription mutation { addBlog( title:”test” author:”hoge”
category:”AWS” ){ title author category } } AWS AppSync push
実際の実装をみていこう AWS AppSync
作業内容 ✦AppSyncでやること ‣データソースの設定 ‣スキーマ設定 ‣リゾルバ設定
データソースの設定 ✦設定できるデータソース(現在時点) ‣DynamoDB、ES、Lambda、HTTP endpoint Amazon ES AWS Lambda
Amazon DynamoDB Amazon API Gateway
スキーマ設定 ‣サーバの機能を記述し、リクエストが有効か どうかを判断するために使用 ‣SDL(Schema Definition Language)で記述 •json形式 type
Query { getBlog(id:ID):[blog] } type blog { id: ID! author: String title: String category: String createdAt: Int! } }
スキーマの型定義 ✦型定義の書き方 ‣スカラー型、オブジェクト型、列挙型など利用可能 ‣Not Null制約は感嘆符「!」で表現 •ID! ‣リストは角括弧で表現 •[String]
type Todo { id:ID! name: String status: TodoStatus } enum TodoStatus { done pending } type Query { getTodos:[Todo] }
Subscriptionのスキーマ設定 ‣購読したいmutationを@aws_subscribe()で 囲むだけ type Subscription { addedPost:Post @aws_subscribe(mutations:[addPost])
} type Mutation { addPost(id:ID!): Post }
リゾルバ設定 ‣データソースとの接続可能にする設定 •GraphQLリクエストをデータソースの命令 に変換 •リゾルバマッピングテンプレートを記載 •Apache Velocoty Template
Lang(VTL) •2種類のテンプレートを設定 リクエストテンプレート レスポンステンプレート
例 ‣デモアプリのリゾルバ(リクエスト) ‣mutationがきたら、DynamoDBで UpdateItemするようにリゾルバ設定してい るだけ { "version" :
"2017-02-28", "operation" : "UpdateItem", "key" : { "id" : { "S" : "${context.arguments.id}" } }, "update" : { "expression" : "ADD #votefield :plusOne", "expressionNames" : { "#votefield" : "vote" }, "expressionValues" : { ":plusOne" : { "N" : 1 } } } }
動作確認 ✦マネージメントコンソールからテスト ‣subscriptionのテストもできる
クライアント側の実装
Angular ✦Angularの概要 ‣フルスタックフレームワーク ‣TypeScript標準 ‣RxJS標準 フルスタックだけど GraphQLのクライアントライブラリは デフォルトではない
GraphQLクライアントライブラリ
AWS Amplify ✦GraphQLのクライアントとして使用 ‣他にいろんな機能盛りだくさん •Analytics系 •API系 •Authentication系 •chatbot系
•PubSub、PushNotifications系 •strage系 •など
どう使うのか ‣基本の流れは同じ •environmentにAppSyncの情報 •Serviceでリクエストのロジック記載 •Componentでロジックを利用し、レスポン スを画面に表示
Service ‣AWS AmplifyのGraphQLリクエストの基本形 ‣API.graphql(graphqlOperation(リクエスト)) ‣基本これでGraphQLリクエストできる ‣リクエストもそのまま渡せばOK
Service ‣従来のAPIリクエストより簡単にかける
ちょっとした罠 ‣subscriptionときだけObservableでかえっ てくる ‣Angularで扱いやすいけどイレギュラー https://aws-amplify.github.io/amplify-js/api/classes/apiclass.html#graphql
AWS Amplifyの中身を調査 ‣どうやってsubscriptionを実現してるのか •ソースをみると •paho-mqtt、zen-observable •RxJSじゃなくzen-observableなので、pipe メソッドなど使えないので注意 https://github.com/aws-amplify/amplify-js/blob/400b1cb2f393d33efe5aa824f730b3155a2f9822/packages/
pubsub/src/Providers/AWSAppSyncProvider.ts
AppSyncを使ってアプリ 作ってみた所感
予想以上に簡単に実装できた
簡単なCRUD操作は API Gateway → AppSync に置き換えて良さそう
本番投入時に 気になること 使えそうなこと
AWS AppSyncの制限
AWS AppSyncの制限(2018/7/27時点) リソース デフォルト制限 リージョンあたりのAPIの最大数 アカウントあたり25 APIキーの最大数 APIあたり50
スキーマドキュメントの最大サイズ 1MB GraphQLクエリの最大実行時間 10秒(APG29秒) req/resのマッピングテンプレートの 最大サイズ 64KB サブスクリプションの 最大ペイロードサイズ 128KB マッピングテンプレートにおける foreach…endループの最大数 1,000
デプロイ
AWS CloudFormation
‣AWS CloudFormationテンプレートをサポート •スキーマ •データソース •リゾルバ 定義することができる
ϦιʔελΠϓ આ໌ "84"QQ4ZOD(SBQI2-"QJ σʔλιʔεͷ؍Ͱɺ"QQ4ZOD"1*Λఆٛ "84"QQ4ZOD"QJ,FZ σʔλιʔεʹΞΫηε͢ΔͨΊʹඞཁͳ ΞΫηεΩʔΛఆٛ "84"QQ4ZOD(SBQI2-4DIFNB
(SBQI2-εΩʔϚΛఆٛ "84"QQ4ZOD%BUB4PVSDF σʔλιʔεΛఆٛ "84"QQ4ZOD3FTPMWFS εΩʔϚͱσʔλιʔεΛࢀর͢Δ͜ͱʹ ΑΓϦκϧόΛఆٛ
‣テンプレートの中にスキーマが混在するので メンテナンス時のことを考慮する必要あり AppSyncSchema: Type: "AWS::AppSync::GraphQLSchema" DependsOn: - AppSyncGraphQLApi
Properties: ApiId: !GetAtt AppSyncGraphQLApi.ApiId Definition: | schema { query: Query mutation: Mutation } type Query { singlePost(id: ID!): Post allPosts: [Post] } type Mutation { putPost(id: ID!, title: String!): Post }
ログ・監視
Amazon CloudWatch
ログの設定 ‣マネージメントコンソールから簡単に設定で きる ‣ログレベルの設定も可能 •ALL、Error、Noneの3段階
ログの設定 ‣Cloudformationでも有効にできるので設定 にしておく ‣ログレベルも設定可能 Type: "AWS::AppSync::GraphQLApi" Properties: UserPoolConfig:
UserPoolConfig OpenIDConnectConfig : OpenIDConnectConfig Name: String AuthenticationType: String LogConfig: LogConfig CloudWatchLogsRoleArn: String FieldLogLevel: String
メトリック ✦サポート内容 ‣HTTPステータスコード •4XX:無効なリクエスト関係 •5XX:GraphQLクエリの実行中のエラー ‣レイテンシー •クライアントから要求を受信してからクライ アントに応答を返すまでの時間
認証
認証 ✦設定できる認証 ‣API_KEY ‣AWS_IAM ‣COGNITO_USER_POOL
API_KEY ‣認証設定せずにGraphQLを作成すると自動 的に設定される
AWS_IAM ‣Cognito Federated Identitiesの一時トーク ンを使用してアクセス。 ‣IAM Policyを使って認可 https://www.slideshare.net/AmazonWebServicesJapan/20180523-aws-black-belt-online-seminar-aws-appsync
COGUNITO_USER_POOL ‣ユーザグループで制御可能 ‣@aws_auth(cognito_group:[グループ名]) https://www.slideshare.net/AmazonWebServicesJapan/20180523-aws-black-belt-online-seminar-aws-appsync
APIドキュメントの管理
APIドキュメント ‣SchemaファイルからAPIドキュメント生成 できるソフトウェアがいくつかある ‣graphdocが良さそう https://github.com/2fd/graphdoc
AppSyncで大変だったこと
大変だったこと ‣AppSyncのリゾルバ設定 •リゾルバマッピングテンプレートをドキュメ ント参照しながら書く •でも、API Gatewayよりわかりやすい印象 ‣正直それぐらいです ‣デモアプリ1時間ぐらいで作れました
さいごに
AWS AppSync 新しいサービスどんどん使っていきましょう!
We Are Hiring !!! Ϋϥεϝιουͷձࣾઆ໌ձΓ·͢ʂ 2018.8.22(ਫ)
None