Slide 1

Slide 1 text

AppSync + Apollo Ͱ͸͡ΊΔGraphQL PRESENTATION BY Hiroyuki Nishi Jan 18 2019 ng-kyoto Angular Meetup #9

Slide 2

Slide 2 text

ࠓ೔͓࿩͢͠Δ͜ͱ • GraphQLʹ͍ͭͯͷ஌ࣝͷ੔ཧ • AWS AppSyncͱApolloͷ঺հ • DEMO: AWS AppSync + Apollo ஫ҙ • AWSͷαʔϏε༻ޠ͕ଟ͘Ͱ͖ͯ·͢ɻ

Slide 3

Slide 3 text

• ੢ ༔೭ @ʢ Nishi Hiroyuki ʣ • Angularͱͷ෇͖߹͍ʢ30 monthsʣ • MOTEX Inc. @ σβΠϯ՝ • AWS, Scala, DDDʹ΋खग़͢͠Δ Who am I ?

Slide 4

Slide 4 text

• FacebookʹΑΓ։ൃ͞ΕͨAPI༻ͷQueryݴޠ • σʔλऔಘܥͷ query ɺσʔλߋ৽ܥͷ mutation ɺΠϕϯτͷ ௨஌Ͱ͋Δ subscription ͷ3छྨ͕͋Δ GraphQLͱ͸ʁ

Slide 5

Slide 5 text

GraphQLͷొ৔ͨ͠എܠ • RESTͷ3ͭͷ՝୊ ϝϯςφϯε (API࢓༷ͷυΩϡϝ ϯτͱ࣮૷ͷζϨɺ υΩϡϝϯτ؅ཧ) ϥ΢ϯυτϦοϓ (1ϖʔδΛදࣔ͢Δ ͷʹෳ਺ͷAPIΛୟ͍ ͯ৘ใΛऔಘ͠ͳ͚ Ε͹ͳΒͳ͍) ΦʔόʔϑΣον (ඞཁͳ৘ใҎ֎ͷ σʔλ΋෇ਵͯ͠ฦ ͞ΕΔ) 01 02 03

Slide 6

Slide 6 text

• GraphQL ͳ API ͕ఏڙ͢ΔΤϯυϙΠϯτ͸ʮ/graphqlʯͷΈ • versionless APIʢAdd Only Approachʣ ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ GraphQLͷಛ௃ - REST ͱͷҧ͍-

Slide 7

Slide 7 text

Schema (GraphQL) • Schemaʹఆٛͨ͠ඞཁͳ৘ใ͚ͩऔಘ͞ΕΔ ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ query listApplications { listApplications { items { id company_id itunesstore_id updated } } } GraphQLͷಛ௃ - ΦʔόʔϑΣον - query listApplications { listApplications { items { id } } } શͯͷσʔλ͕ཉ͍͠৔߹ id͚ͩཉ͍͠৔߹

Slide 8

Slide 8 text

Schema (GraphQL) • ΫΤϦʹରͯ͠ͷܕϨϕϧͷݕূ͕Ͱ͖Δ ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ mutation createApplications($createapplicationsinput: CreateApplicationsInput!) { createApplications(input: $createapplicationsinput) { company_id id #aa itunesstore_id updated } } —————————————————————————————————————————— { "createapplicationsinput": { "company_id": ̍, "id": "Hello, world!", "itunesstore_id": "Hello, world!", "updated": "Hello, world!" } } GraphQLͷಛ௃ - ܕϨϕϧͷݕূ -

Slide 9

Slide 9 text

• C# / .NET - graphql-dotnet, graphql-net, Hot Chocolate • Clojure - alumbra, graphql-clj, lacinia • Elixir - absinthe, graphql-elixir • Erlang - graphql-erlang • Go - graphql-go graph-gophers/graphql-go, GQLGen… • Groovy - gorm-graphql, GQL • Java - graphql-java • JavaScript - express-graphql, GraphQL.js, apollo-server • PHP - graphql-php, Siler • Python - Graphene • Scala - Sangria • Ruby - graphql-ruby GraphQL Server Libraries • ෳ਺ͷݴޠͰαϙʔτ͞Ε͍ͯΔ

Slide 10

Slide 10 text

ྫ Sangria - Schemaఆٛ- ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ type Picture { width: Int! height: Int! url: String } interface Identifiable { id: String! } type Product implements Identifiable { id: String! name: String! description: String picture(size: Int!): Picture } type Query { product(id: Int!): Product products: [Product] }

Slide 11

Slide 11 text

ྫ Sangria - resolveͷઃఆ- ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ val Id = Argument("id", StringType) val QueryType = ObjectType("Query", fields[ProductRepo, Unit]( Field("product", OptionType(ProductType), description = Some("Return a product with specific `id`.”), arguments = Id :: Nil, resolve = c 㱺 c.ctx.product(c arg Id))), Field("products", ListType(ProductType), description = Some("Returns a list of all available products."), resolve = _.ctx.products)))

Slide 12

Slide 12 text

ྫ Sangria - αʔόʔͷىಈ-

Slide 13

Slide 13 text

GraphQLαʔό্ཱͪ͛Δͷ ͸ͦΕͳΓʹ͠ΜͲ͍… “

Slide 14

Slide 14 text

Slide 15

Slide 15 text

AWS AppSyncͱ͸ʁ • 2018೥ʹެ։͞ΕͨϑϧϚωʔδυͳGraphQLαʔϏε ඞཁͳσʔλͷΈ ͷऔಘ ෳ਺ͷσʔλιʔε ΁ͷΞΫηε ΞΫηε੍ޚ • DynamoDB • ElasticSearch • Lambda • 3rd Party API • Cognito • IAM Role • API Key

Slide 16

Slide 16 text

Client for GraphQL “

Slide 17

Slide 17 text

Apollo Client • GraphQLͷ ΫϥΠΞϯτϥΠϒϥϦ • ϑϨʔϜϫʔΫʹ߹Θ࣮ͤͨ૷ΛఏڙʢAngular, React, Vue.js…ʣ

Slide 18

Slide 18 text

ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ ᶃ Apollo Clientͷઃఆ - App Sync΁ͷ ઀ଓ - hydrated() { const appsyncClient = new AWSAppSyncClient({ disableOffline: true, url: '', region: 'ap-northeast-1', auth: { type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS, jwtToken: async () => (await Auth.currentSession()) .getIdToken() .getJwtToken() }, }); this.apollo.setClient(appsyncClient as any); return appsyncClient.hydrated(); } } ᶃ AppSyncͷURLΛࢦ ᶄ AppSyncͷϦʔδϣϯΛࢦఆ ᶅ ೝূํ๏Λࢦఆ

Slide 19

Slide 19 text

ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ ᶄ Service - queryఆٛ - @Injectable({ providedIn: "root" }) export class ListApplicationsGQL extends Apollo.Query< Listapplications.Query, Listapplications.Variables> { document: any = gql` query listApplications { listApplications { items { id company_id itunesstore_id updated } } } `; } ᶄ queryΛఆٛ ᶃ QueryΛܧঝ

Slide 20

Slide 20 text

ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ ᶅ Component constructor( private listApplicationsGQL: ListApplicationsGQL ) {} ngOnInit(): void { this.findApplications(); } private findApplications(): void { this.listApplicationsGQL.watch().valueChanges.pipe( map(x => x.data.listApplications.items) ).subscribe(res => this.dataSource = res); } ᶃ serviceΛੜ੒ ᶄ watch()Ͱݺͼग़͠

Slide 21

Slide 21 text

• GraphQLεΩʔϚ͔ΒఆٛϑΝΠϧΛੜ੒͢Δπʔϧ GraphQL Code Generator

Slide 22

Slide 22 text

• *.graphqlϑΝΠϧ͔ΒTypescriptͷίʔυΛࣗಈͰੜ੒ͯ͘͠ΕΔ Schema͔Βίʔυͷࣗಈੜ੒ ैདྷͷσʔλϑΣον GraphQL {ࡾ} GET /v1/persons GET /v2/accounts POST /application POST /application POST /graphql εΩʔϚఆٛ yarn run graphql *.graphql graphql.ts

Slide 23

Slide 23 text

Demo !! “

Slide 24

Slide 24 text

AWS AppSync Resolvers GraphQL Client Angular+AppSync POST /graphql

Slide 25

Slide 25 text

POST /graphql Client AppSync ⁵ Resolvers GraphQL AWS AppSync Resolvers

Slide 26

Slide 26 text

Resolvers Client ⁵ AppSync Client POST /graphql GraphQL AWS AppSync

Slide 27

Slide 27 text

·ͱΊ • AWS Ͱ GraphQL΍ΔͳΒAppSyncͳΒ؆୯ʹ࡞੒Ͱ͖Δ • Apollo Client + Code GeneratorΛ࢖͑͹ࣗಈͰService·Ͱੜ੒ ͯ͘͠Δ • ٻΊΒΕΔαʔϏεཁ݅ʹΑͬͯ༻๏༻ྔ͸ద੾ʹબ୒͠Α͏

Slide 28

Slide 28 text

ࠓ೥ͦ͜GraphQL͸͡ΊͯΈΑ͏ THANK YOU