SlideShare a Scribd company logo
Amazon Web Services Japan
Tsukagoshi Keisuke
REST API
GraphQL
JJUG CCC 2018 Spring #ccc_e6
Who am I ?
e gd B A @
Mobile / DevOps / Serverless
W
SJ ba
W
J
c S=
Overview
c G
E E R Q Aa A G
I G I
G
S T Q LPR I We G
GraphQL
GraphQL ?
• GraphQL API TypeSystem
• GraphQL
GraphQL -REST API -
• REST API
• API
• API
• API
•
• API
•
Request / Response
GraphQL
• ,
•
• API
• API
GraphQL – GraphQL -
•
P )
A
• A )
B A C
• A I B A P
)
GraphQL – GraphQL -
•
P )
A
• A )
B A C
• A I B A P
)
!
type Todo {
id: ID!
name: String
description: String
status: TodoStatus
}
type Query {
getTodos: [Todo]
}
enum TodoStatus {
done
pending
}
A
N I
S
D
)
)
)
) )
PL
• La G p - G
PL G P hp r
I C P P
• I C P P G
B -
P G QI
• I A QG P I -I
G
)
{
"id": "1",
"name": "Get Milk",
“priority": "1"
},
{
"id": “2",
"name": “Go to gym",
“priority": “5"
},…
type Query {
getTodos: [Todo]
}
type Todo {
id: ID!
name: String
description: String
priority: Int
duedate: String
}
query {
getTodos {
id
name
priority
}
}
)
!= Graph database
NoSQL, Relational, HTTP, etc.
GraphQL
/posts
/postInfo
/postJustTitle
/postsByAuthor
/postNameStartsWithX
/commentsOnPost
) )
PL
• La G p - G
PL G P hp r
I C P P
• I C P P G
B -
P G QI
• I A QG P I -I
G
)
Mutation
-
mutation addPost( id:123
title:”New post!”
author:”Nadia”){
id
title
author
}
data: [{
id:123,
title:”New Post!”
author:”Nadia”
}]
type Subscription {
addedPost: Post
@aws_subscribe(mutations: ["addPost"])
deletedPost: Post
@aws_subscribe(mutations: ["deletePost"])
}
type Mutation {
addPost(id: ID! author: String! title:
String content: String): Post!
deletePost(id: ID!): Post!
}
subscription NewPostSub {
addedPost {
__typename
version
title
content
author
url
}
}
) )
Subscription NewPostSub {
addedPost{…}
}
WebSocket URL and Connection Payload
Secure Websocket Connection (wss://)
const AllPostsWithData = compose(
graphql(AllPostsQuery, { options: { fetchPolicy: 'cache-and-network‘ },
props: (props) => ({
posts: props.data.posts,
subscribeToNewPosts: params => {
props.data.subscribeToMore({
document: NewPostsSubscription,
updateQuery: (prev, { subscriptionData: { newPost } }) => ({
...prev,
posts: [newPost, ...prev.posts.filter(post => post.id !== newPost.id)]
})
});
});
…//more code
)
Demo:
AppSync
AWS AppSync
GraphQL
GraphQL
•
•
•
•
•
•
•
•
•
•
Sync
AppSync
•
•
•
•
•
•
•
AppSync Overview
AWS AppSync
Amazon
DynamoDB
AWS
Lambda
ElasticSearch
dynamoDB AmazonES
Amazon
DynamoDB
ElasticSearch
e.t.c
Lambda 3rdPartyAPI
Lambda DataSource
WebAPI
REST API に疲れたあなたへ贈る GraphQL 入門
REST API に疲れたあなたへ贈る GraphQL 入門
REST API に疲れたあなたへ贈る GraphQL 入門
AWS AppSync
Amazon
DynamoDB
AWS
Lambda
ElasticSearch
•
• GraphQL API 1 GraphQL
SDL(Schema Definition Language)
schema {
query:Query
mutation: Mutation
subscription: Subscription
}
Query :
Mutation :
Subscription :
type Query {
getTodos: [Todo]
}
type Todo {
id: ID!
name: String
description: String
status: TodoStatus
}
enum TodoStatus {
done
pending
}
Not Null
ID!
[String!]
Resolver Mapping Template
AppSync Overview
AWS AppSync
Amazon
DynamoDB
AWS
Lambda
ElasticSearch
• GraphQL
GraphQL
• Apache Velocity Template Language VTL
•
• https://docs.aws.amazon.com/appsync/latest/devguide/resolver-
mapping-template-reference-programming-guide.html
•
•
•
•
•
• ID /
•
•
•
:
{
"version" : "2017-02-28",
"operation" : "GetItem",
"key" : {
"id" : { "S" : "${context.arguments.id}" }
}
}
:
$utils.toJson($context.result)
{
"id" : ${context.data.id},
"title" : "${context.data.theTitle}",
"content" : "${context.data.body1} ${context.data.body2}"
}
REST API に疲れたあなたへ贈る GraphQL 入門
DynamoDB
REST API に疲れたあなたへ贈る GraphQL 入門
AppSync Overview
AWS AppSync
Amazon
DynamoDB
AWS
Lambda
ElasticSearch
GraphQL Endpoint
export default {
"graphqlEndpoint": "https://**.appsync-api.**.amazonaws.com/graphql",
"region": "us-east-1",
"authenticationType": "API_KEY",
"apiKey": ”***"
}
Client
const client = new AWSAppSyncClient({
url: awsconfig.ENDPOINT,
region: AWS.config.region,
auth: { type: AUTH_TYPE.AWS_IAM, credentials: Auth.currentCredentials() }
});
const WithProvider = () => (
<ApolloProvider client={client}>
<Rehydrated>
<AppWithData />
</Rehydrated>
</ApolloProvider>
);
https://aws.github.io/aws-amplify/
Client
//API Key
const client = new AWSAppSyncClient({
url: awsconfig.ENDPOINT,
region: awsconfig.REGION,
auth: { type: AUTH_TYPE.API_KEY,
apiKey: awsconfig.apiKey}
});
Client
//IAM
auth: { type: AUTH_TYPE.AWS_IAM,
credentials: Auth.currentCredentials()
}
//Cognito User Pool
auth: { type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
jwtToken: Auth.currentSession().accessToke.jwtToken
}
Demo: GraphQL
• AWS AppSync GraphQL Photo Sample
• https://github.com/aws-samples/aws-amplify-graphql
• GraphQL starter application
• https://github.com/aws-samples/aws-mobile-appsync-
events-starter-react
AWS AppSync GraphQL Photo Sample
B
• B
B )
C
• C )
A I I
P C
• C P C P
P )
Happy coding with AppSync!
AWS AppSync
Amazon
DynamoDB
AWS
Lambda
ElasticSearch
AWS AppSync
GraphQL API

More Related Content

REST API に疲れたあなたへ贈る GraphQL 入門