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
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.
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
authorizationTypedel método aAWS_IAMoNONE.
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.
-
Inicie sesión en la Consola de administración de AWS y abra la consola de AppSync
. -
En el Panel, elija Crear API.
-
-
Elija Diseñar una API desde cero y, a continuación, seleccione Siguiente.
-
En la sección API privada, selecciona Usar características de API privadas.
-
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.
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{ } 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 wscatAPI
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" } } }
Compatibilidad con VPC PrivateLink
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
-