Utilizzo di risolutori di pipeline in AWS AppSync - AWS AppSync

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Utilizzo di risolutori di pipeline in AWS AppSync

Nota

Ora supportiamo principalmente il runtime APPSYNC _JS e la relativa documentazione. Valuta la possibilità di utilizzare il runtime APPSYNC _JS e le relative guide qui.

AWS AppSync fornisce un modo semplice per collegare un campo GraphQL a una singola fonte di dati tramite resolver di unità. Tuttavia, un'unica operazione potrebbe non essere sufficiente. I resolver della pipeline offrono la possibilità di eseguire operazioni seriali sulle origini dati. Crea funzioni nel tuo API e collegale a un resolver di pipeline. Il risultato di ogni funzione eseguita viene reindirizzato alla funzione successiva finché non rimangono altre funzioni da eseguire. Con i resolver per pipeline ora puoi creare flussi di lavoro più complessi direttamente in. AWS AppSync In questo tutorial, verrà creata una semplice applicazione per la visualizzazione di immagini, in cui gli utenti possono pubblicare immagini e visualizzare quelle pubblicate dai loro amici.

Impostazione One-Click

Se desideri configurare automaticamente l'endpoint GraphQL AWS AppSync con tutti i resolver configurati e le AWS risorse necessarie, puoi utilizzare il seguente modello: AWS CloudFormation

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

Con questo stack. nell'account vengono create le seguenti risorse:

  • IAMRuolo per accedere AWS AppSync alle risorse del tuo account

  • 2 tabelle DynamoDB

  • 1 pool di utenti di Amazon Cognito

  • 2 gruppi di pool di utenti di Amazon Cognito

  • 3 utenti di pool di utenti di Amazon Cognito

  • 1 AWS AppSync API

Al termine del processo di creazione dello AWS CloudFormation stack, riceverai un'e-mail per ciascuno dei tre utenti Amazon Cognito che sono stati creati. Ogni e-mail contiene una password temporanea che usi per accedere come utente Amazon Cognito alla AWS AppSync console. Salvare le password per la parte restante del tutorial.

Configurazione manuale

Se preferisci eseguire manualmente una step-by-step procedura tramite la AWS AppSync console, segui la procedura di configurazione riportata di seguito.

Configurazione AWS AppSync delle risorse non aziendali

APIComunica con due tabelle DynamoDB: una tabella di immagini che memorizza le immagini e una tabella di amici che memorizza le relazioni tra gli utenti. APIè configurato per utilizzare il pool di utenti Amazon Cognito come tipo di autenticazione. Lo AWS CloudFormation stack seguente configura queste risorse nell'account.

Blue button labeled "Launch Stack" with an arrow icon indicating an action to start.

Al termine del processo di creazione dello AWS CloudFormation stack, riceverai un'e-mail per ciascuno dei tre utenti Amazon Cognito che sono stati creati. Ogni e-mail contiene una password temporanea che usi per accedere come utente Amazon Cognito alla AWS AppSync console. Salvare le password per la parte restante del tutorial.

Creare il tuo GraphQL API

Per creare il GraphQL API in: AWS AppSync

  1. Apri la AWS AppSync console e scegli Build From Scratch e scegli Start.

  2. Imposta il nome API diAppSyncTutorial-PicturesViewer.

  3. Scegli Create (Crea) .

La AWS AppSync console crea un nuovo GraphQL API per te utilizzando la modalità di autenticazione con API chiave. Puoi usare la console per configurare il resto di GraphQL API ed eseguire query su di esso per il resto di questo tutorial.

Configurazione di GraphQL API

Devi configurarlo AWS AppSync API con il pool di utenti di Amazon Cognito che hai appena creato.

  1. Seleziona la scheda Impostazioni.

  2. Nella sezione Authorization Type (Tipo di autorizzazione), scegliere Amazon Cognito User Pool (Pool di utenti di Amazon Cognito).

  3. In Configurazione del pool di utenti, scegli WESTUS-2 per la AWS regione.

  4. Scegli il pool di UserPool utenti AppSyncTutorial-.

  5. Scegli DENYcome azione predefinita.

  6. Lascia vuoto il campo regex del AppId client.

  7. Seleziona Salva.

Ora API è configurato per utilizzare il pool di utenti Amazon Cognito come tipo di autorizzazione.

Configurazione delle sorgenti dati per le tabelle DynamoDB

Dopo aver creato le tabelle DynamoDB, accedi a AWS AppSync GraphQL nella console e API scegli la scheda Data Sources. Ora creerai un'origine dati AWS AppSync per ciascuna delle tabelle DynamoDB che hai appena creato.

  1. Passa alla scheda Data source (Origine dati).

  2. Scegli New (Nuovo) per creare una nuova origine dati.

  3. Per il nome dell'origine dati, immetti PicturesDynamoDBTable.

  4. Scegli Amazon DynamoDB table (Tabella Amazon DynamoDB) come tipo di origine dati.

  5. Per la regione, scegli US-2. WEST

  6. Dall'elenco delle tabelle, scegli la tabella AppSyncTutorial-Pictures DynamoDB.

  7. Scegliere Existing role (Ruolo esistente) nella sezione Create or use an existing role (Crea o usa un ruolo esistente).

  8. Scegli il ruolo appena creato dal modello. CloudFormation Se non hai modificato il ResourceNamePrefix, il nome del ruolo dovrebbe essere AppSyncTutorial-D. ynamoDBRole

  9. Scegli Create (Crea) .

Ripeti la stessa procedura per la tabella degli amici, il nome della tabella DynamoDB dovrebbe AppSyncTutorialessere -Friends se non hai modificato ResourceNamePrefixil parametro al momento della creazione dello stack. CloudFormation

Creazione dello schema GraphQL

Ora che le sorgenti dati sono collegate alle tabelle DynamoDB, creiamo uno schema GraphQL. Dall'editor di schemi nella AWS AppSync console, assicurati che lo schema corrisponda al seguente schema:

schema { query: Query mutation: Mutation } type Mutation { createPicture(input: CreatePictureInput!): Picture! @aws_auth(cognito_groups: ["Admins"]) createFriendship(id: ID!, target: ID!): Boolean @aws_auth(cognito_groups: ["Admins"]) } type Query { getPicturesByOwner(id: ID!): [Picture] @aws_auth(cognito_groups: ["Admins", "Viewers"]) } type Picture { id: ID! owner: ID! src: String } input CreatePictureInput { owner: ID! src: String! }

Scegliere Save Schema (Salva schema) per salvare lo schema.

Alcuni campi dello schema sono stati annotati con la direttiva @aws_auth. Poiché la configurazione delle azioni API predefinita è impostata su DENY, API rifiuta tutti gli utenti che non sono membri dei gruppi menzionati nella direttiva @aws_auth. Per ulteriori informazioni su come proteggere il tuoAPI, puoi leggere la pagina Sicurezza. In questo caso, solo gli utenti amministratori hanno accesso alla mutazione. createPicturee Mutation. createFriendshipcampi, mentre gli utenti che sono membri dei gruppi Admins o Viewers possono accedere alla Query. getPicturesByCampo Proprietario. Tutti gli altri utenti non hanno accesso.

Configurazione dei resolver

Ora che si dispone di un valido schema GraphQL e di due origini dati, è possibile collegare i resolver ai campi GraphQL dello schema. APIOffre le seguenti funzionalità:

  • Crea un'immagine tramite la mutazione. createPicturecampo

  • Crea amicizia tramite la mutazione. createFriendshipcampo

  • Recupera un'immagine tramite la Query. getPicturecampo

Mutazione. createPicture

Dall'editor dello schema nella AWS AppSync console, sul lato destro scegli Attach Resolver for. createPicture(input: CreatePictureInput!): Picture! Scegli l'origine dati PicturesDynamoDBTableDynamoDB. Aggiungere il modello seguente nella sezione request mapping template (modello di mappatura della richiesta):

#set($id = $util.autoId()) { "version" : "2018-05-29", "operation" : "PutItem", "key" : { "id" : $util.dynamodb.toDynamoDBJson($id), "owner": $util.dynamodb.toDynamoDBJson($ctx.args.input.owner) }, "attributeValues" : $util.dynamodb.toMapValuesJson($ctx.args.input) }

Aggiungere il modello seguente nella sezione response mapping template (modello di mappatura della risposta):

#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end $util.toJson($ctx.result)

La funzionalità per la creazione di immagini è stata creata. Stai salvando un'immagine nella tabella Immagini, utilizzando un ID dell'immagine generato UUID casualmente e utilizzando il nome utente Cognito come proprietario dell'immagine.

Mutazione. createFriendship

Dall'editor dello schema nella AWS AppSync console, sul lato destro scegli Attach Resolver for. createFriendship(id: ID!, target: ID!): Boolean Scegli l'origine dati FriendsDynamoDBTableDynamoDB. Aggiungere il modello seguente nella sezione request mapping template (modello di mappatura della richiesta):

#set($userToFriendFriendship = { "userId" : "$ctx.args.id", "friendId": "$ctx.args.target" }) #set($friendToUserFriendship = { "userId" : "$ctx.args.target", "friendId": "$ctx.args.id" }) #set($friendsItems = [$util.dynamodb.toMapValues($userToFriendFriendship), $util.dynamodb.toMapValues($friendToUserFriendship)]) { "version" : "2018-05-29", "operation" : "BatchPutItem", "tables" : { ## Replace 'AppSyncTutorial-' default below with the ResourceNamePrefix you provided in the CloudFormation template "AppSyncTutorial-Friends": $util.toJson($friendsItems) } }

Importante: nel modello di BatchPutItemrichiesta, deve essere presente il nome esatto della tabella DynamoDB. Il nome di tabella predefinito è AppSyncTutorial -Friends. Se si utilizza il nome di tabella sbagliato, viene visualizzato un errore quando si AppSync tenta di assumere il ruolo fornito.

Per semplicità, in questo tutorial, procedi come se la richiesta di amicizia fosse stata approvata e salva la voce della relazione direttamente nella AppSyncTutorialFriendstabella.

Di fatto, si stanno memorizzando due voci per ogni richiesta di amicizia dato che la relazione è bidirezionale. Per ulteriori dettagli sulle best practice di Amazon DynamoDB per many-to-many rappresentare le relazioni, consulta DynamoDB Best Practices.

Aggiungere il modello seguente nella sezione response mapping template (modello di mappatura della risposta):

#if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end true

Nota: verificare che il proprio modello di richiesta contenga il nome corretto della tabella. Il nome predefinito è AppSyncTutorial-Friends, ma il nome della tabella potrebbe essere diverso se modifichi il parametro. CloudFormation ResourceNamePrefix

Interrogazione. getPicturesByProprietario

Ora che si dispone di richieste di amicizia e immagini, è necessario fornire la possibilità agli utenti di visualizzare le immagini dei loro amici. Per soddisfare questo requisito, occorre prima verificare che il richiedente sia amico del proprietario, quindi è necessario eseguire una query per ottenere l'immagine.

Poiché questa funzionalità richiede due operazioni sull'origine dati, si creano due funzioni. La prima funzione isFriend, verifica se il richiedente e il proprietario sono amici. La seconda funzione, getPicturesByOwner, recupera le immagini richieste con un ID proprietario. Diamo un'occhiata al flusso di esecuzione riportato di seguito per il resolver proposto sulla Query. getPicturesByCampo proprietario:

  1. Modello di mappatura Before: prepara il contesto e gli argomenti di input per il campo.

  2. isFriend funzione: verifica se il richiedente è il proprietario dell'immagine. In caso contrario, verifica se gli utenti richiedenti e proprietari sono amici eseguendo un'operazione GetItem DynamoDB sulla tabella degli amici.

  3. getPicturesByFunzione Owner: recupera le immagini dalla tabella Pictures utilizzando un'operazione di interrogazione DynamoDB sull'indice secondario globale owner-index.

  4. Modello di mappatura After: mappa le immagini risultanti in modo che gli attributi di DynamoDB siano mappati correttamente con i campi dei tipi GraphQL previsti.

Innanzitutto, verranno create le funzioni.

isFriend Funzione
  1. Selezionare la scheda Functions (Funzioni).

  2. Scegliere Create Function (Crea funzione) per creare una funzione.

  3. Per il nome dell'origine dati, immetti FriendsDynamoDBTable.

  4. Come nome della funzione, immettere isFriend.

  5. Nell'area di testo del modello di mappatura della richiesta, incollare il seguente modello:

    #set($ownerId = $ctx.prev.result.owner) #set($callerId = $ctx.prev.result.callerId) ## if the owner is the caller, no need to make the check #if($ownerId == $callerId) #return($ctx.prev.result) #end { "version" : "2018-05-29", "operation" : "GetItem", "key" : { "userId" : $util.dynamodb.toDynamoDBJson($callerId), "friendId" : $util.dynamodb.toDynamoDBJson($ownerId) } }
  6. Nell'area di testo del modello di mappatura della risposta, incollare il seguente modello:

    #if($ctx.error) $util.error("Unable to retrieve friend mapping message: ${ctx.error.message}", $ctx.error.type) #end ## if the users aren't friends #if(!$ctx.result) $util.unauthorized() #end $util.toJson($ctx.prev.result)
  7. Selezionare Create function (Crea funzione).

Risultato: la isFriendfunzione è stata creata.

getPicturesByFunzione del proprietario
  1. Selezionare la scheda Functions (Funzioni).

  2. Scegliere Create Function (Crea funzione) per creare una funzione.

  3. Per il nome dell'origine dati, immetti PicturesDynamoDBTable.

  4. Come nome della funzione, immettere getPicturesByOwner.

  5. Nell'area di testo del modello di mappatura della richiesta, incollare il seguente modello:

    { "version" : "2018-05-29", "operation" : "Query", "query" : { "expression": "#owner = :owner", "expressionNames": { "#owner" : "owner" }, "expressionValues" : { ":owner" : $util.dynamodb.toDynamoDBJson($ctx.prev.result.owner) } }, "index": "owner-index" }
  6. Nell'area di testo del modello di mappatura della risposta, incollare il seguente modello:

    #if($ctx.error) $util.error($ctx.error.message, $ctx.error.type) #end $util.toJson($ctx.result)
  7. Selezionare Create function (Crea funzione).

Risultato: hai creato la funzione getPicturesByOwner. Ora che le funzioni sono state create, collegate un resolver di pipeline alla Query. getPicturesByCampo Proprietario.

Dall'editor dello schema nella AWS AppSync console, sul lato destro scegli Attach Resolver for. Query.getPicturesByOwner(id: ID!): [Picture] Nella pagina seguente, selezionare il collegamento Convert to pipeline resolver (Converti in resolver della pipeline) che viene visualizzato sotto l'origine dati nell'elenco a discesa. Utilizzare la procedura seguente per il modello di mappatura Before:

#set($result = { "owner": $ctx.args.id, "callerId": $ctx.identity.username }) $util.toJson($result)

Nella sezione after mapping template (modello di mappatura After), utilizzare la procedura seguente:

#foreach($picture in $ctx.result.items) ## prepend "src://" to picture.src property #set($picture['src'] = "src://${picture['src']}") #end $util.toJson($ctx.result.items)

Scegliere Create Resolver (Crea resolver). Il primo resolver della pipeline è stato ora collegato. Nella stessa pagina, aggiungere le due funzioni create in precedenza. Nella sezione funzioni, scegli Aggiungi una funzione, quindi scegli o digita il nome della prima funzione,. isFriend Aggiungi la seconda funzione seguendo la stessa procedura per la funzione getPicturesByProprietario. Assicuratevi che la isFriendfunzione compaia per prima nell'elenco seguita dalla funzione getPicturesByOwner. È possibile utilizzare le frecce Su è Giù per riorganizzare le funzioni per ordinarne l'esecuzione nella pipeline.

Ora che il pipeline resolver è stato creato e hai collegato le funzioni, testiamo il GraphQL appena creato. API

Test del tuo GraphQL API

Innanzitutto, occorre inserire immagini e richieste di amicizia eseguendo alcune mutazioni con l'utente con privilegi di amministratore creato. Sul lato sinistro della AWS AppSync console, scegli la scheda Queries.

createPicture Mutazione

  1. Nella AWS AppSync console, scegli la scheda Interrogazioni.

  2. Scegliere Login With User Pools (Accedi con pool di utenti).

  3. Nella modalità modale, inserisci l'ID client Cognito Sample creato dallo stack (ad esempio CloudFormation 37solo6mmhh7k4v63cqdfgdg5d).

  4. Immettete il nome utente CloudFormation che avete passato come parametro allo stack. L'impostazione predefinita è nadia.

  5. Utilizza la password temporanea che è stata inviata all'e-mail che hai fornito come parametro per lo CloudFormation stack (ad esempio, UserPoolUserEmail).

  6. Selezionare Login (Accesso). Ora dovresti vedere il pulsante rinominato Logout nadia, o qualunque nome utente tu abbia scelto durante la creazione dello CloudFormation stack (ovvero,). UserPoolUsername

Inviamo alcune createPicturemutazioni per popolare la tabella delle immagini. Eseguire la seguente query GraphQL nella console:

mutation { createPicture(input:{ owner: "nadia" src: "nadia.jpg" }) { id owner src } }

La risposta dovrebbe essere simile alla seguente:

{ "data": { "createPicture": { "id": "c6fedbbe-57ad-4da3-860a-ffe8d039882a", "owner": "nadia", "src": "nadia.jpg" } } }

Aggiungiamo alcune altre immagini:

mutation { createPicture(input:{ owner: "shaggy" src: "shaggy.jpg" }) { id owner src } }
mutation { createPicture(input:{ owner: "rex" src: "rex.jpg" }) { id owner src } }

Sono state aggiunte tre immagini utilizzando nadia come utente con privilegi di amministratore.

createFriendship Mutazione

Ora aggiungiamo una richiesta di amicizia. Eseguire le seguenti mutazioni nella console.

Nota: è necessario essere connessi con l'utente con privilegi di amministratore (l'utente predefinito è nadia).

mutation { createFriendship(id: "nadia", target: "shaggy") }

La risposta dovrebbe essere simile alla seguente:

{ "data": { "createFriendship": true } }

nadia e shaggy sono amici. rex non è amico di altri utenti.

getPicturesByRichiesta del proprietario

Per questa fase, effettuare l'accesso con l'utente nadia, utilizzando pool di utenti di Cognito e le credenziali impostate all'inizio di questo tutorial. Come utente nadia, recuperare le immagini di proprietà di shaggy.

query { getPicturesByOwner(id: "shaggy") { id owner src } }

Poiché nadia e shaggy sono amici, la query dovrebbe restituire l'immagine corrispondente.

{ "data": { "getPicturesByOwner": [ { "id": "05a16fba-cc29-41ee-a8d5-4e791f4f1079", "owner": "shaggy", "src": "src://shaggy.jpg" } ] } }

Analogamente, anche un eventuale tentativo di nadia di recuperare proprie immagini andrebbe a buon fine. Il pipeline resolver è stato ottimizzato per evitare di eseguire l'isFriend GetItem operazione in questo caso. Provare la seguente query:

query { getPicturesByOwner(id: "nadia") { id owner src } }

Se abiliti la registrazione sul tuo API (nel riquadro Impostazioni), imposti il livello di debug su ed esegui nuovamente la stessa query ALL, restituisce i log per l'esecuzione del campo. Esaminando i log, puoi determinare se la isFriendfunzione è tornata precocemente nella fase del modello di mappatura delle richieste:

{ "errors": [], "mappingTemplateType": "Request Mapping", "path": "[getPicturesByOwner]", "resolverArn": "arn:aws:appsync:us-west-2:XXXX:apis/XXXX/types/Query/fields/getPicturesByOwner", "functionArn": "arn:aws:appsync:us-west-2:XXXX:apis/XXXX/functions/o2f42p2jrfdl3dw7s6xub2csdfs", "functionName": "isFriend", "earlyReturnedValue": { "owner": "nadia", "callerId": "nadia" }, "context": { "arguments": { "id": "nadia" }, "prev": { "result": { "owner": "nadia", "callerId": "nadia" } }, "stash": {}, "outErrors": [] }, "fieldInError": false }

La earlyReturnedValuechiave rappresenta i dati restituiti dalla direttiva #return.

Infine, anche se rex è membro del Viewers Cognito UserPool Group e poiché rex non è amico di nessuno, non potrà accedere a nessuna delle immagini di proprietà di Shaggy o Nadia. Se si effettua l'accesso come rex nella console e si esegue la query seguente:

query { getPicturesByOwner(id: "nadia") { id owner src } }

Si otterrà il seguente errore per mancanza di autorizzazioni:

{ "data": { "getPicturesByOwner": null }, "errors": [ { "path": [ "getPicturesByOwner" ], "data": null, "errorType": "Unauthorized", "errorInfo": null, "locations": [ { "line": 2, "column": 9, "sourceName": null } ], "message": "Not Authorized to access getPicturesByOwner on type Query" } ] }

L'autorizzazione complessa è stata correttamente implementata utilizzando i resolver della pipeline.