Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
HIGOBASHI.AWS 第5回「AngularとAWS AppSyncで作るサーバーレスア...
Search
yuji nishimura
July 27, 2018
Technology
4.3k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HIGOBASHI.AWS 第5回「AngularとAWS AppSyncで作るサーバーレスアプリケーション」
HIGOBASHI.AWSで発表したスライドです。
yuji nishimura
July 27, 2018
More Decks by yuji nishimura
See All by yuji nishimura
Kinesis Video Streams 最新アップデートの紹介 #reinvent #cmregrowth
ynishimura
0
1.6k
HIGOBASHI.AWS 第12回「AWS CDKのConstruct Libraryを作って 公開してみよう」
ynishimura
0
720
Angularを使って爆速で管理画面を作る
ynishimura
0
3.1k
サーバーレスアーキテクチャで作ったIoTのバックエンドシステムで遭遇したエラーと対処法
ynishimura
0
2.3k
HIGOBASHI.AWS 第10回「サーバーレスとデータ分析 ~AWS Lambdaを活用して効率化しよう~」
ynishimura
0
1.5k
re:Invent2018 IoT系の新サービス・アップデート
ynishimura
0
1.4k
【Developers.IO 2018】IoTを実現するためのAWSのIoT系サービス:分析、セキュリティ管理、組み込み向けサービスもあるで!
ynishimura
2
1.2k
HIGOBASHI.AWS 第6回「Amazon Route53で ドメインを購入して、設定してみよう」
ynishimura
0
1.9k
higobashi.aws 第2回「IoTとサーバーレスとラズパイ」
ynishimura
1
1.7k
Other Decks in Technology
See All in Technology
「今盗んで、後で解く」に備える ― AWSのポスト量子暗号入門
yama3133
1
190
AIに書かせて、プラットフォームで縛る ― EKSプラットフォームで実践した責任境界と権限設計
elmodev09
0
210
ボードゲームの遊び相手をFoundation Modelsで作る / iOSDC Japan 2026
genda
0
140
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
AIエージェントを最高のパートナーに育てる方法|評価と判断軸を育てる5つのステップ
koichiaoki
1
160
負債のメタファと2026年 / Debt Metaphor in Agentic Engineering Age 202609 Edition
twada
PRO
11
6.6k
白金鉱業Meetup Vol.25 アウトカムが二値のデータに対するCausal Impact
brainpadpr
0
290
Antigravity SDK for the Java Developer
glaforge
0
190
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
490
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
280
AIで社員の自主発信に広報目線を組み込む
_mossann_t
0
140
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
4
3.2k
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
96
14k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
Everyday Curiosity
cassininazir
0
320
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.8k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
700
Building a Scalable Design System with Sketch
lauravandoore
464
34k
The untapped power of vector embeddings
frankvandijk
2
1.9k
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