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
3.7k
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.4k
HIGOBASHI.AWS 第12回「AWS CDKのConstruct Libraryを作って 公開してみよう」
ynishimura
0
530
Angularを使って爆速で管理画面を作る
ynishimura
0
2.6k
サーバーレスアーキテクチャで作ったIoTのバックエンドシステムで遭遇したエラーと対処法
ynishimura
0
2k
HIGOBASHI.AWS 第10回「サーバーレスとデータ分析 ~AWS Lambdaを活用して効率化しよう~」
ynishimura
0
1.2k
re:Invent2018 IoT系の新サービス・アップデート
ynishimura
0
1.2k
【Developers.IO 2018】IoTを実現するためのAWSのIoT系サービス:分析、セキュリティ管理、組み込み向けサービスもあるで!
ynishimura
2
1k
HIGOBASHI.AWS 第6回「Amazon Route53で ドメインを購入して、設定してみよう」
ynishimura
0
1.6k
higobashi.aws 第2回「IoTとサーバーレスとラズパイ」
ynishimura
1
1.4k
Other Decks in Technology
See All in Technology
Team Dynamicsを目指すウイングアーク1stのQAチーム
sadonosake
1
210
透過型SMTPプロキシによる送信メールの可観測性向上: Update Edition / Improved observability of outgoing emails with transparent smtp proxy: Update edition
linyows
2
190
OCI Data Integration技術情報 / ocidi_technical_jp
oracle4engineer
PRO
1
2.6k
エンジニア候補者向け資料2024.11.07.pdf
macloud
0
4.5k
いろんなものと両立する Kaggleの向き合い方
go5paopao
2
970
LINEヤフー株式会社における音声言語情報処理AI研究開発@SP/SLP研究会 2024.10.22
lycorptech_jp
PRO
2
280
RAGのためのビジネス文書解析技術
eida
3
660
3次元点群データ「VIRTUAL SHIZUOKA』のオープンデータ化による恩恵と協働の未来/FOSS4G Japan 2024
kazz24s
0
130
フルカイテン株式会社 採用資料
fullkaiten
0
40k
AI長期記憶システム構築のための LLMマルチエージェントの取り組み / Awarefy-LLM-Multi-Agent
iktakahiro
2
340
dev 補講: プロダクトセキュリティ / Product security overview
wa6sn
0
1.6k
TinyGoを使ったVSCode拡張機能実装
askua
2
200
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Measuring & Analyzing Core Web Vitals
bluesmoon
2
75
It's Worth the Effort
3n
183
27k
Designing for Performance
lara
604
68k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
42
2.2k
Become a Pro
speakerdeck
PRO
25
5k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.1k
[RailsConf 2023] Rails as a piece of cake
palkan
51
4.9k
Writing Fast Ruby
sferik
627
61k
Happy Clients
brianwarren
97
6.7k
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