¿Cómo se utiliza AWS AppSync para acceder a los recursos privados de la VPC?

Actualización más reciente: 6 de julio de 2022

Deseo acceder a los recursos de Amazon Virtual Private Cloud (Amazon VPC) desde la API de GraphQL de AWS AppSync, pero no sé cómo hacerlo.

Descripción breve

Para acceder a los recursos de Amazon VPC desde una API de GraphQL de AWS AppSync, siga estos pasos:

  1. Cree una función de AWS Lambda para que se ejecute dentro de la misma Amazon VPC que los recursos a los que desea acceder.
  2. Cree una API de AWS AppSync y, a continuación, asocie la función de Lambda como origen de datos.
  3. Configure el esquema de la API de AWS AppSync.
  4. Asocie un solucionador Lambda o un solucionador Lambda directo al campo GraphQL de destino.
  5. Pruebe el campo GraphQL.

Si configura una función de Lambda para conectarse a subredes privadas en una Amazon VPC, podrá acceder a los recursos privados de la Amazon VPC. Los resultados de los recursos privados descendentes luego se regresan a la API de GraphQL de AWS AppSync y se devuelven al cliente. Los recursos privados incluyen bases de datos, contenedores, API privadas, dominios privados de Amazon OpenSearch Service u otros servicios privados detrás de un equilibrador de carga de aplicación o de red.

AWS AppSync invoca la API de Lambda a través de los puntos de conexión de servicio públicos de Lambda. Se protege la API invocada mediante el proceso de firma de la versión 4 de firma. Esto permite a AWS AppSync asumir un rol de AWS Identity and Access Management (IAM) con permisos para invocar la función de Lambda de destino. Para obtener información sobre las funciones de Lambda configuradas para acceder a la Amazon VPC, consulte Redes de VPC para Lambda.

Nota:

  • AWS AppSync únicamente admite puntos de conexión públicos. Como solución, utilice los solucionadores Lambda como punto de entrada a los recursos de Amazon VPC.
  • Al agregar una función de Lambda entre los recursos privados de la Amazon VPC y la API de AWS AppSync, se introduce una nueva capa de aplicación con una pequeña sobrecarga de latencia.
  • Si utiliza una Amazon VPC con funciones Lambda, incurrirá en cargos adicionales. Para obtener más información, consulte los Precios de Lambda.

Resolución

Nota: Si se producen errores al ejecutar los comandos de la CLI de AWS, asegúrese de que utiliza la versión más reciente de la CLI de AWS.

Crea una función de AWS Lambda para que se ejecute dentro de la misma Amazon VPC que los recursos a los que desea acceder

En el siguiente escenario de ejemplo, se llama a un equilibrador de carga de aplicaciones interno existente desde una función de Lambda de Python. Un valor de ID se obtiene del parámetro de argumentos que se pasa en el objeto de evento que la invocación de AWS AppSync envía 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: En el caso de los solucionadores Lambda directos, la función recibe una carga que consiste en el objeto de contexto completo.

Ejemplo de respuesta de la función de Lambda:

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

Cree una API de AWS AppSync y asocie la función de Lambda como origen de datos

Uso de la Consola de administración de AWS

Para crear la API de GraphQL en AWS AppSync:

  1. Abra la consola de AWS AppSync.
  2. En el panel, elija Crear API.
  3. En la página Introducción, en Personalizar la API o importar desde Amazon DynamoDB, elija Crear desde cero.
  4. Elija Iniciar.
  5. En el campo Nombre de la API, ingrese un nombre para la API.
  6. Elija Crear.

Nota: Los pasos anteriores crean automáticamente una clave de API para la autorización que es válida durante siete días. Sin embargo, puede utilizar cualquier tipo de autorización.

Para crear el origen de datos de Lambda:

  1. Abra la consola de AWS AppSync.
  2. Elija Orígenes de datos.
  3. Elija Crear origen de datos.
  4. En Crear nuevo origen de datos, ingrese el nombre del origen de datos que desea definir.
    En Tipo de origen de datos, seleccione Función de Amazon Lambda.
    En Región, seleccione la región de AWS que contiene la función de Lambda.
    En ARN de la función, seleccione la función que creó.
  5. Proporcione un rol existente para permitir que AWS AppSync administre la función de Lambda. También puede permitir que el asistente cree una por usted.
  6. Elija Crear.

Uso de la Interfaz de la línea de comandos de AWS (AWS CLI)

1.    Cree la API de GraphQL mediante API_KEY como tipo de autenticación predeterminado para las pruebas:

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

Nota: Sustituya api name por el nombre de la API.

2.    Crea una clave de API:

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

Nota: Sustituya apiId por el ID de la API.

3.    Cree el rol de IAM que el origen de datos utiliza y, a continuación, asocie la política de confianza que permite a AWS AppSync asumir el rol:

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

Política de confianza JSON:

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

4.    Integrar la política de permisos en el rol:

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

JSON de la política de permisos:

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

Nota: Sustituya lambda-ARN por el ARN de la función de Lambda.

5.    Cree el origen de datos e indique el ARN del rol IAM y la función de 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: Sustituya LambdaDataSourceName por el nombre del origen de datos, apiId por el ID de la API, IAM-role-ARN por el ARN del rol de IAM y Lambda-function-ARN por el ARN de la función de Lambda.

Configure el esquema de la API de AWS AppSync

Uso de la Consola de administración de AWS

Configurar la definición del esquema GraphQL para acceder a la respuesta de la función de Lambda:

1.    Abra la consola de AWS AppSync.

2.    En el panel de la izquierda, elija Esquema.

3.    Copie y pegue el esquema proporcionado en el editor.

El siguiente esquema de ejemplo tiene una consulta de respuesta que devuelve datos con la estructura de tipo Producto:

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

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

schema {
    query: Query
}

4.    Elija Guardar esquema.

Utilizar AWS CLI

1.    Guarde el esquema GraphQL anterior como schema.graphql.

2.    Cree el esquema en AWS AppSync:

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

Nota: Sustituya apiId por el ID de la API.

Asocie un solucionador Lambda o un solucionador Lambda directo a un campo GraphQL

Uso de la Consola de administración de AWS

Asocie el solucionador:

  1. Abra la consola de AWS AppSync.
  2. En la página Esquema de la API, en Solucionadores, desplácese hasta la consulta de respuesta. O bien, filtre por consulta en los tipos de solucionadores.
  3. Junto al campo Respuesta, elija Asociar.
  4. En la página Crear nuevo solucionador, en Nombre del origen de datos, seleccione el nombre del origen de datos de Lambda. Nota: La integración directa de Lambda se utiliza para el escenario de ejemplo, por lo que no es necesario configurar las plantillas de asignación.
  5. Elija Guardar solucionadores.

Utilizar AWS CLI

Cree el solucionador de Lambda directo y especifique el nombre del origen de datos de los pasos anteriores:

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

Nota: Sustituya apiId por el ID de la API y LambdaDataSourceName por el nombre del origen de datos creado.

Probar el campo GraphQL

Para probar el campo GraphQL:

1.    Abra la consola de AWS AppSync.

2.    En el panel de navegación izquierdo, elija Consultas.

3.    En el editor de consultas, diseñe la consulta GraphQL.

Ejemplo de consulta GraphQL:

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

La consulta anterior obtiene el ID de producto 1 del equilibrador de carga de aplicación.

4.    Para ejecutar la consulta de prueba, elija Reproducir.

Ejemplo de respuesta de la API:

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

Uso del terminal

Ejecute la consulta mediante una llamada al método POST. El siguiente ejemplo utiliza el 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: Sustituya api-key por la clave de API.