Come posso utilizzare AWS AppSync per accedere alle risorse private nel mio VCP?

Ultimo aggiornamento: 06/07/2022

Voglio accedere alle risorse del Cloud privato virtuale Amazon (Amazon VPC) dalla mia API GraphQL di AWS AppSync, ma non so come fare.

Breve descrizione

Per accedere alle risorse di Amazon VPC da un'API GraphQL di AWS AppSync, segui questi passaggi:

  1. Crea una funzione AWS Lambda da eseguire all'interno dello stesso Amazon VPC delle risorse a cui desideri accedere.
  2. Crea un'API di AWS AppSync, quindi collega la funzione Lambda come origine dei dati.
  3. Configura lo schema API di AWS AppSync.
  4. Collega un resolver Lambda o un resolver Lambda diretto al campo GraphQL di destinazione.
  5. Test del campo GraphQL.

La configurazione di una funzione Lambda per connettersi a sottoreti private in un Amazon VPC consente di accedere alle risorse private in Amazon VPC. I risultati delle risorse private a calle vengono quindi trasmessi all'API GraphQL di AWS AppSync e restituiti al client. Le risorse private includono database, container, API private, domini privati del servizio OpenSearch di Amazon o altri servizi privati dietro un’applicazione o un Network Load Balancer.

AWS AppSync richiama l'API Lambda tramite gli endpoint di servizio pubblico Lambda. L'API richiamata è protetta dal processo di firma Signature Version 4. Ciò consente ad AWS AppSync di assumere un ruolo AWS Identity and Access Management (IAM) con autorizzazioni per richiamare la funzione Lambda di destinazione. Per informazioni sulle funzioni Lambda configurate per accedere al tuo Amazon VPC, consulta Reti VPC per Lambda.

Nota:

  • solo gli endpoint pubblici sono supportati da AWS AppSync. Come soluzione alternativa, usa i resolver Lambda come punto di accesso alle risorse Amazon VPC.
  • L'aggiunta di una funzione Lambda tra le risorse private di Amazon VPC e l'API di AWS AppSync introduce un nuovo livello di applicazione con un overhead di latenza minore.
  • Se utilizzi un Amazon VPC con funzioni Lambda, dovrai sostenere costi aggiuntivi. Per ulteriori informazioni, consulta Prezzi di Lambda.

Risoluzione

Nota: se si riceve un messaggio di errore durante l’esecuzione dei comandi AWS CLI, assicurarsi di utilizzare la versione di AWS CLI più recente.

Crea una funzione AWS Lambda da eseguire all'interno dello stesso Amazon VPC delle risorse a cui desideri accedere

Nel seguente scenario di esempio, un Application Load Balancer interno esistente viene chiamato da una funzione Python Lambda. Un valore id viene ottenuto dal parametro arguments passato nell'oggetto event inviato dall'invocazione di AWS AppSync a Lambda.

import urllib.request
import json

def lambda_handler(event, context):
  URL = 'http://XXXXXXXXXXX.us-east-1.elb.amazonaws.com/' + event['arguments']['id']  
  #Open the JSON reponse, read it, convert it to JSON object and return it
  response = urllib.request.urlopen(URL)
  raw_json = response.read()
  loaded_json = json.loads(raw_json) 
  return loaded_json

Nota: per i resolver Lambda diretti, la funzione riceve un payload costituito dall'intero oggetto context.

Risposta di esempio dalla funzione Lambda:

{
  "id": "25",
  "name": "hamburger",
  "available": true
}

Crea un'API di AWS AppSync e collega la funzione Lambda come origine dei dati

Utilizzo della Console di gestione AWS

Per creare l'API di GraphQL in AWS AppSync:

  1. Apri la console AWS AppSync.
  2. Nel pannello di controllo, scegli Crea API.
  3. Nella pagina Nozioni di base, in Personalizza la tua API o importa da Amazon DynamoDB, scegli Crea da zero.
  4. Seleziona Avvia.
  5. Nel campo Nome API, immetti un nome per l'API.
  6. Scegli Crea.

Nota: i passaggi precedenti creano automaticamente una chiave API per l'autorizzazione valida per sette giorni. Tuttavia, puoi utilizzare qualsiasi tipo di autorizzazione.

Per creare l'origine dei dati Lambda:

  1. Apri la console AWS AppSync.
  2. Scegli Origini dei dati.
  3. Scegli Crea origine dei dati.
  4. In Crea nuova origine dei dati, inserisci il nome dell'origine dei dati che desideri definire.
    Per Tipo di origine dei dati, seleziona la funzione Amazon Lambda.
    Per Regione, seleziona la Regione AWS che contiene la funzione Lambda.
    Per Funzione ARN, seleziona la funzione creata.
  5. Fornisci un ruolo esistente per consentire ad AWS AppSync di gestire la funzione Lambda. Puoi anche lasciare che la procedura guidata ne crei uno per te.
  6. Scegli Crea.

Utilizzo dell'Interfaccia della linea di comando AWS (AWS CLI)

1.    Crea l'API GraphQL utilizzando API_KEY come tipo di autenticazione predefinito per il test:

$ aws appsync create-graphql-api --name api-name --authentication-type API_KEY

Nota: sostituisci il nome API con il nome della tua API.

2.    Crea una chiave API:

$ aws appsync create-api-key --api-id apiId

Nota: sostituisci apiId con l'ID dell'API.

3.    Crea il ruolo IAM utilizzato dall'origine dei dati, quindi allega la policy di attendibilità che consente ad AWS AppSync di assumere il ruolo:

$ aws iam create-role --role-name Test-Role-for-AppSync --assume-role-policy-document file://trustpolicy.json

Policy di attendibilità JSON:

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Effect": "Allow",
          "Principal": {
              "Service": "appsync.amazonaws.com"
          },   
         "Action": "sts:AssumeRole"
      }
  ]
}

4.    Incorpora la policy delle autorizzazioni nel ruolo:

$ aws iam put-role-policy --role-name Test-Role-for-AppSync --policy-name Permissions-Policy-For-AppSync --policy-document file://permissionspolicy.json

Policy delle autorizzazioni JSON:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowFunctionInvocation",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": [
        "lambda-ARN"
      ]
    }
  ]
}

Nota: sostituisci Lambda-ARN con il tuo Lambda ARN.

5.    Crea l’origine dei dati e indica l'ARN del ruolo IAM e la funzione Lambda:

$ aws appsync create-data-source --api-id apiId \
--name LambdaDataSourceName \
--type AWS_LAMBDA \
--service-role-arn IAM-role-ARN \
--lambda-config lambdaFunctionArn=Lambda-function-ARN

Nota: sostituisci LambdaDataSourceName con il nome dell'origine dei dati, apiId con l'ID dell'API, IAM-role-ARN con l'ARN del tuo ruolo IAM e Lambda-function-ARN con l'ARN della tua funzione Lambda.

Configurazione dello schema API di AWS AppSync

Utilizzo della Console di gestione AWS

Configura la definizione dello schema GraphQL per accedere alla risposta della funzione Lambda:

1.    Apri la console AWS AppSync.

2.    Nel pannello di sinistra, scegli Schema.

3.    Copia e incolla lo schema fornito nell'editor.

Lo schema di esempio seguente contiene una query di risposta che restituisce dati con la struttura del tipo di Prodotto:

type Product {
    id: ID!
    name: String
    available: Boolean
}

type Query {
    response(id: ID!): Product
}

schema {
    query: Query
}

4.    Scegli Salva schema.

Utilizzo di AWS CLI

1.    Salva lo schema GraphQL precedente come schema.graphql.

2.    Crea lo schema in AWS AppSync:

$ aws appsync start-schema-creation --api-id "apiId" --definition fileb://schema.graphql

Nota: sostituisci apiId con l'ID della tua API.

Collega un resolver Lambda o un resolver Lambda diretto a un campo GraphQL

Utilizzo della Console di gestione AWS

Allega il resolver:

  1. Apri la console AWS AppSync.
  2. Nella pagina Schema dell'API, in Resolver, scorri fino alla query di risposta. Oppure, filtra per query nei tipi di resolver.
  3. Accanto al campo Risposta, scegli Allega.
  4. Nella pagina Crea nuovo resolver, per Nome origine dei dati, seleziona il nome dell'origine dei dati Lambda. Nota: l'integrazione diretta Lambda viene utilizzata per lo scenario di esempio, quindi non è necessaria la configurazione dei modelli di mappatura.
  5. Scegli Salva resolver.

Utilizzo di AWS CLI

Crea il resolver Lambda diretto e specifica il nome dell'origine dei dati nei passaggi precedenti:

$ aws appsync create-resolver \
--field-name response \
--type-name Query \
--api-id "apiId" \
--data-source-name LambdaDataSourceName

Nota: sostituisci apiId con l'ID dell'API e LambdaDataSourceName con il nome dell'origine dei dati creata.

Test del campo GraphQL

Per testare il campo GraphQL:

1.    Apri la console AWS AppSync.

2.    Nel riquadro di navigazione a sinistra, scegli Query.

3.    Nell'editor di query, progetta la tua query GraphQL.

Esempio di query GraphQL:

query MyQuery {
  response(id: "1") {
    available
    name
    id
  }
}

La query precedente ottiene l'ID prodotto1 da Application Load Balancer.

4.    Per eseguire la query di prova, scegli Riproduci.

Esempio di risposta dall'API:

{
  "data": {
    "response": {
      "available": false,
      "id": "1",
      "name": "pizza"
    }
  }
}

Utilizzo del terminale

Esegui la query chiamando il metodo POST. L'esempio seguente utilizza il comando curl:

$ curl --request POST 'https://<Grapqhl-API-endpoint>/graphql' \
--header 'Content-Type: application/graphql' \
--header 'x-api-key: api-key' \
--data-raw '{"query":"query MyQuery {\n  response(id: \"1\") {\n available\n    id\n    name\n  }\n}\n","variables":{}}'

Nota: sostituisci api-key con la tua chiave API.