Uso de API privadas de AWS AppSync - AWS AppSync GraphQL

Uso de API privadas de AWS AppSync

Si usa Amazon Virtual Private Cloud (Amazon VPC), puede crear API privadas de AWS AppSync, que son API a las que solo se puede acceder desde una VPC. Con una API privada, puede restringir el acceso de la API a sus aplicaciones internas y conectarse a sus puntos de conexión de GraphQL y Realtime sin exponer públicamente los datos.

Para establecer una conexión privada entre la VPC y el servicio AWS AppSync, cree puntos de conexión de VPC de interfaz. Los puntos de enlace de tipo interfaz cuentan con la tecnología de AWS PrivateLink, lo que les permite acceder de forma privada a las API de AWS AppSync sin utilizar una gateway de Internet, un dispositivo NAT, una conexión de VPN o una conexión Direct Connect. Las instancias de su VPC no necesitan direcciones IP públicas para comunicar con las API de AWS AppSync. El tráfico entre la VPC y AWS AppSync no sale de la red de AWS.

AWS AppSync admite AWS PrivateLink para operaciones tanto en el plano de datos como en el plano de control:

  • Punto de conexión del plano de datos (com.amazonaws.{region}.appsync-api): proporciona acceso privado a las API de GraphQL y en tiempo real para consultas, mutaciones y suscripciones.

  • Punto de conexión del plano de control (com.amazonaws.{region}.appsync): proporciona acceso privado a las operaciones de administración de AWS AppSync, como la creación de API, la actualización de esquemas y la configuración de orígenes de datos.

Nube de AWS architecture showing VPC with public and private subnets connecting to AWS AppSync via PrivateLink.

Hay algunos factores adicionales que debe tener en cuenta antes de habilitar las características de la API privada:

  • La configuración de los puntos de conexión de VPC de la interfaz para AWS AppSync con las características de DNS privadas habilitadas impedirá que los recursos de la VPC puedan invocar otras API públicas de AWS AppSync mediante la URL de la API generada de AWS AppSync. Esto se debe a que la solicitud a la API pública se enruta a través del punto de conexión de la interfaz, lo que no está permitido en las API públicas. Para invocar las API públicas en este escenario, se recomienda configurar nombres de dominio personalizados en las API públicas, que luego los recursos de la VPC pueden usar para invocar la API pública.

  • Sus API privadas de AWS AppSync solo estarán disponibles en su VPC. El editor de consultas de la consola de AWS AppSync solo podrá acceder a su API si la configuración de red de su navegador puede enrutar el tráfico a su VPC (por ejemplo, mediante una conexión a través de una VPN o a través de Direct Connect).

  • Con un punto de conexión de interfaz de VPC para AWS AppSync, puede acceder a cualquier API privada de la misma cuenta y Región de AWS. Para restringir aún más el acceso a las API privadas, cuenta con las opciones siguientes:

    • Garantizar que solo los administradores necesarios puedan crear interfaces de punto de conexión de VPC para AWS AppSync.

    • Usar políticas personalizadas de puntos de conexión de VPC para restringir las API que se pueden invocar desde los recursos de la VPC.

    • En el caso de los recursos de la VPC, le recomendamos que utilice la autorización de IAM para invocar las API de AWS AppSync, asegurándose de que los recursos tengan funciones específicas para las API.

  • Al crear o utilizar políticas que restrinjan las entidades principales de IAM, debe establecer el authorizationType del método a AWS_IAM o NONE.

Creación de API privadas de AWS AppSync

Los siguientes pasos muestran cómo crear API privadas en el servicio de AWS AppSync.

aviso

Las características de la API privada solo se pueden habilitar durante la creación de la API. Esta configuración no se puede modificar en una API de AWS AppSync ni en una API privada de AWS AppSync una vez creadas.

  1. Inicie sesión en la Consola de administración de AWS y abra la consola de AppSync.

    1. En el Panel, elija Crear API.

  2. Elija Diseñar una API desde cero y, a continuación, seleccione Siguiente.

  3. En la sección API privada, selecciona Usar características de API privadas.

  4. Configure el resto de las opciones, revise los datos de la API y, a continuación, seleccione Crear.

Antes de poder usar la API privada de AWS AppSync, debe configurar puntos de conexión de interfaz para AWS AppSync en su VPC. Tenga en cuenta que tanto la API privada como la VPC deben estar en la misma cuenta y Región de AWS.

Creación de un punto de conexión de interfaz para AWS AppSync

Puede crear puntos de conexión de interfaz para AWS AppSync mediante la consola de Amazon VPC o la AWS Command Line Interface (AWS CLI). En función del caso de uso, es posible que tenga que crear uno o ambos tipos de puntos de conexión:

  • Punto de conexión del plano de datos: obligatorio para acceder a las API privadas desde su VPC.

  • Punto de conexión del plano de control: necesario para administrar los recursos de AWS AppSync de su VPC mediante las AWS CLI o los SDK.

Para obtener más información, consulte Creación de un punto de conexión de interfaz en la Guía del usuario de Amazon VPC.

nota

Asegúrese de seleccionar el servicio de puntos de conexión de VPC correcto. Hay dos para AppSync: com.amazonaws.{region}.appsync-api es el que se requiere para las API privadas y com.amazonaws.{region}.appsync se usa para la administración de las API.

Console
  1. Inicie sesión en Consola de administración de AWS y abra la página Puntos de conexión de la consola de Amazon VPC.

  2. Elija Crear punto de conexión.

    1. En el campo Categoría de servicio, asegúrese de que esté seleccionado Servicios de AWS.

    2. En la tabla Servicios, elija uno de los siguientes servicios:

      • Para acceder al plano de datos: com.amazonaws.{region}.appsync-api

      • Para el acceso al plano de control: com.amazonaws.{region}.appsync

      Compruebe que el valor de la columna Tipo es Interface.

    3. En el campo VPC, elija una VPC y sus subredes.

    4. Para habilitar características de DNS privado para el punto de conexión de a interfaz, seleccione la casilla de verificación Habilitar nombre de DNS.

    5. En Grupo de seguridad, elija uno o varios grupos de seguridad.

  3. Elija Crear punto de conexión.

  4. Repita el proceso para crear el segundo tipo de punto de conexión si es necesario.

CLI

Utilice el comando create-vpc-endpoint y especifique el ID de la VPC, el tipo de punto de enlace de la VPC (interfaz), el nombre del servicio, las subredes que usarán el punto de enlace y los grupos de seguridad que se asociarán a las interfaces de red del punto de enlace.

Creación de un punto de conexión del plano de datos:

$ aws ec2 create-vpc-endpoint —vpc-id vpc-ec43eb89 \ —vpc-endpoint-type Interface \ —service-name com.amazonaws.{region}.appsync-api \ —subnet-id subnet-abababab —security-group-id sg-1a2b3c4d

Creación de un punto de conexión del plano de control:

$ aws ec2 create-vpc-endpoint —vpc-id vpc-ec43eb89 \ —vpc-endpoint-type Interface \ —service-name com.amazonaws.{region}.appsync \ —subnet-id subnet-abababab —security-group-id sg-1a2b3c4d

Para poder utilizar la opción de DNS privado, debe definir los valores enableDnsHostnames y enableDnsSupportattributes en su VPC. Para obtener más información, consulte Visualización y actualización de la compatibilidad de DNS para su VPC en la Guía del usuario de Amazon VPC. Si habilita características de DNS privado para el punto de conexión de la interfaz, puede hacer solicitudes a su punto de conexión de GraphQL y en tiempo real de la API de AWS AppSync usando sus puntos de conexión de DNS públicos predeterminados con el formato siguiente:

https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql

Para las operaciones del plano de control, puede utilizar el punto de conexión del servicio AWS AppSync estándar:

https://appsync.{region}.amazonaws.com

Para obtener más puntos de conexión de servicio, consulte Puntos de conexión y cuotas de servicio en la Referencia general de AWS.

Para obtener más información sobre las interacciones del servicio con los puntos de conexión de la interfaz, consulte Acceda a un Servicio de AWS mediante un punto de conexión de VPC de interfaz en la Guía del usuario de Amazon VPC.

Para obtener información sobre la creación y configuración de un punto de conexión mediante AWS, CloudFormation, consulte el recurso AWSAWS::EC2::VPCEndpoint en la AWSGuía del usuario de AWS CloudFormation.

Ejemplos avanzados

Si habilita características de DNS privado para el punto de conexión de la interfaz, puede hacer solicitudes a su punto de conexión de GraphQL y en tiempo real de la API de AWS AppSync usando sus puntos de conexión de DNS públicos predeterminados con el formato siguiente:

https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql

Si utiliza los nombres de host de DNS públicos de punto de conexión de VPC de interfaz, la URL base para invocar la API tendrá el formato siguiente:

https://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync-api.{region}.vpce.amazonaws.com/graphql

También puede usar el nombre de host DNS específico de la AZ si ha implementado un punto de conexión en la AZ:

https://{vpc_endpoint_id}-{endpoint_dns_identifier}-{az_id}.appsync-api.{region}.vpce.amazonaws.com/graphql.

Si utiliza el nombre de DNS público del punto de conexión de VPC, será necesario transferir el nombre de host del punto de conexión de la API de AWS AppSync como Host o como encabezado de x-appsync-domain a la solicitud. En estos ejemplos, se utiliza una TodoAPI creada en la guía Lanzar un esquema de ejemplo:

curl https://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync-api.{region}.vpce.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -H "Host:{api_url_identifier}.appsync-api.{region}.amazonaws.com" \ -d '{"query":"mutation add($createtodoinput: CreateTodoInput!) {\n createTodo(input: $createtodoinput) {\n id\n name\n where\n when\n description\n }\n}","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

En los siguientes ejemplos, utilizaremos la aplicación Todo que se genera en la guía Lanzar un esquema de ejemplo. Para probar la API Todo de ejemplo, utilizaremos el DNS privado para invocar la API. Puede usar su herramienta de línea de comandos preferida; en este ejemplo, se usa curl para enviar consultas y mutaciones y wscat para configurar las suscripciones. Para emular nuestro ejemplo, sustituya los valores entre paréntesis { } en los comandos siguientes por los valores correspondientes de su cuenta de AWS.

Prueba de la operación de mutación: solicitud createTodo

curl https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -d '{"query":"mutation add($createtodoinput: CreateTodoInput!) {\n createTodo(input: $createtodoinput) {\n id\n name\n where\n when\n description\n }\n}","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

Operación de prueba de mutación: respuesta createTodo

{ "data": { "createTodo": { "id": "<todo-id>", "name": "My first GraphQL task", "where": "Day 1", "when": "Friday Night", "description": "Learn more about GraphQL" } } }

Operación de consulta de prueba: solicitud listTodos

curl https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -d '{"query":"query ListTodos {\n listTodos {\n items {\n description\n id\n name\n when\n where\n }\n }\n}\n","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

Operación de consulta de prueba: solicitud listTodos

{ "data": { "listTodos": { "items": [ { "description": "Learn more about GraphQL", "id": "<todo-id>", "name": "My first GraphQL task", "when": "Friday night", "where": "Day 1" } ] } } }

Operación de prueba de suscripción: suscripción a una mutación createTodo

Para configurar las suscripciones de GraphQL en AWS AppSync, consulte Creación de un cliente de WebSocket en tiempo real. Desde una instancia de Amazon EC2 en una VPC, puede probar su punto de conexión de suscripción a la API privada de AWS AppSync mediante wscat. En el siguiente ejemplo, se utiliza una API KEY para autorización.

$ header=`echo '{"host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com","x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}"}' | base64 | tr -d '\n'` $ wscat -p 13 -s graphql-ws -c "wss://{api_url_identifier}.appsync-realtime-api.us-west-2.amazonaws.com/graphql?header=$header&payload=e30=" Connected (press CTRL+C to quit) > {"type": "connection_init"} < {"type":"connection_ack","payload":{"connectionTimeoutMs":300000}} < {"type":"ka"} > {"id":"f7a49717","payload":{"data":"{\"query\":\"subscription onCreateTodo {onCreateTodo {description id name where when}}\",\"variables\":{}}","extensions":{"authorization":{"x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}","host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com"}}},"type":"start"} < {"id":"f7a49717","type":"start_ack"}

Si lo prefiere, puede usar el nombre de dominio del punto de conexión de VPC y asegurarse de especificar el encabezado Host en el comando wscat para establecer el websocket:

$ header=`echo '{"host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com","x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}"}' | base64 | tr -d '\n'` $ wscat -p 13 -s graphql-ws -c "wss://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync-api.{region}.vpce.amazonaws.com/graphql?header=$header&payload=e30=" --header Host:{api_url_identifier}.appsync-realtime-api.us-west-2.amazonaws.com Connected (press CTRL+C to quit) > {"type": "connection_init"} < {"type":"connection_ack","payload":{"connectionTimeoutMs":300000}} < {"type":"ka"} > {"id":"f7a49717","payload":{"data":"{\"query\":\"subscription onCreateTodo {onCreateTodo {description id priority title}}\",\"variables\":{}}","extensions":{"authorization":{"x-api-key":"da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}","host":"{api_url_identifier}.appsync-api.{region}.amazonaws.com"}}},"type":"start"} < {"id":"f7a49717","type":"start_ack"}

Ejecute el siguiente código de mutación:

curl https://{api_url_identifier}.appsync-api.{region}.amazonaws.com/graphql \ -H "Content-Type:application/graphql" \ -H "x-api-key:da2-{xxxxxxxxxxxxxxxxxxxxxxxxxx}" \ -d '{"query":"mutation add($createtodoinput: CreateTodoInput!) {\n createTodo(input: $createtodoinput) {\n id\n name\n where\n when\n description\n }\n}","variables":{"createtodoinput":{"name":"My first GraphQL task","when":"Friday Night","where":"Day 1","description":"Learn more about GraphQL"}}}'

Después, se activa una suscripción y el mensaje de notificación aparece como se muestra a continuación:

< {"id":"f7a49717","type":"data","payload":{"data":{"onCreateTodo":{"description":"Go to the shops","id":"169ce516-b7e8-4a6a-88c1-ab840184359f","priority":5,"title":"Go to the shops"}}}}

Ejemplos de planos de control

Con el punto de conexión de VPC del plano de control configurado, puede administrar los recursos de AWS AppSync desde su VPC mediante las AWS CLI o los SDK. Estos son algunos ejemplos de operaciones habituales del plano de control:

Creación de una API mediante la AWS CLI

aws appsync create-graphql-api \ --name "MyPrivateAPI" \ --authentication-type API_KEY \ --visibility PRIVATE

Actualización de un esquema

aws appsync start-schema-creation \ --api-id {api-id} \ --definition file://schema.graphql

Creación de un origen de datos

aws appsync create-data-source \ --api-id {api-id} \ --name "MyDataSource" \ --type AWS_LAMBDA \ --lambda-config lambdaFunctionArn=arn:aws:lambda:{region}:{account}:function:MyFunction

Al usar el punto de conexión del plano de control con el DNS privado habilitado, estos comandos se enrutarán automáticamente a través del punto de conexión de VPC. Si el DNS privado no está habilitado, puede especificar la URL del punto de conexión:

aws appsync create-graphql-api \ --endpoint-url https://{vpc_endpoint_id}-{endpoint_dns_identifier}.appsync.{region}.vpce.amazonaws.com \ --name "MyPrivateAPI" \ --authentication-type API_KEY \ --visibility PRIVATE

Uso de políticas de IAM para limitar la creación de API públicas

AWS AppSync es compatible con las declaraciones de Condition de IAM para su uso con API privadas. El campo visibility se puede incluir en las declaraciones de política de IAM para la operación appsync:CreateGraphqlApi, a fin de controlar qué usuarios y roles de IAM pueden crear API públicas y privadas. Esto permite al administrador de IAM definir una política de IAM que solo permitirá al usuario crear una API de GraphQL privada. Un usuario que intente crear una API pública recibirá un mensaje de no autorización.

Por ejemplo, un administrador de IAM podría crear la siguiente declaración de política de IAM para permitir la creación de API privadas:

{ "Sid": "AllowPrivateAppSyncApis", "Effect": "Allow", "Action": "appsync:CreateGraphqlApi", "Resource": "*", "Condition": { "ForAnyValue:StringEquals": { "appsync:Visibility": "PRIVATE" } } }

Un administrador de IAM también podría agregar la siguiente política de control de servicios para impedir que todos los usuarios de una organización de AWS creen API de AWS AppSync que no sean API privadas:

{ "Sid": "BlockNonPrivateAppSyncApis", "Effect": "Deny", "Action": "appsync:CreateGraphqlApi", "Resource": "*", "Condition": { "ForAnyValue:StringNotEquals": { "appsync:Visibility": "PRIVATE" } } }

La compatibilidad con VPC Privatelink está disponible en AWS AppSync. PrivateLink le permite usar e interactuar con un servicio de AWS sin que el tráfico salga de la red de AWS.

AWS AppSync admite AWS PrivateLink para operaciones tanto en el plano de datos como en el plano de control:

  • Punto de conexión VPCE (appsync.<region>.vpce.amazonaws.com): proporciona acceso de VPC a las operaciones del plano de datos y del plano de control de la siguiente manera:

    • appsync para operaciones en el plano de control

    • appsync-api para operaciones en el plano de datos