Quiero que Python abra una suscripción de AWS AppSync y reciba las actualizaciones.
El blog oficial está indeciso sobre cómo autenticar un websocket con IAM.
https://aws.amazon.com/blogs/mobile/appsync-websockets-python/
Se remite a este documento sobre la firma de solicitudes http , que no menciona los websockets y, por lo tanto, no proporciona pistas sobre qué incluir, excluir o variar para iniciar un websocket. Me temo que me llevará bastante tiempo digerir, adaptar y probar antes de que suceda algo.
IAM_header = { "accept": "application/json, text/javascript", "content-encoding": "amz-1.0", "content-type": "application/json; charset=UTF-8", "host": <HOST>, "x-amz-date": <ISO_UTC_TIMESTAMP>,, "X-Amz-Security-Token": <IAM SECURITY TOKEN>, "Authorization": <IAM SIGNATURE> }Supongo que nadie ha hecho esto antes y puede compartir algunas ideas o código.
IAM_SIGNATURE
En el contexto de la creación de un websocket, ¿cuáles son los "parámetros de solicitud" que estamos firmando?
Hasta ahora, he ingresado detalles en request_aws4auth y he rellenado los encabezados de eso en el websocket. Ese esfuerzo recibió este tipo de respuesta:
<< {"payload":{"errors":[{"errorType":"BadRequestException","message":"La firma de solicitud que calculamos no coincide con la firma que proporcionó. Verifique su clave de acceso secreta de AWS y el método de firma. Consulte la documentación del servicio para obtener más detalles.\n\n La cadena canónica para esta solicitud debería haber sido \n'POST\n/graphql/connect\n\nhost:iutysrbt2qxx7ekx2xi.appsync-api.ap-southeast-2.amazonaws.com \nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934852b855\nx-amz-date:20200730T044539Z\nx-amz-security-token:FwoGZpgV9hfLzGbDiPLCK1HMsXYJapqB299GReKYAALLKPOgifkFMi2VZsiycpLbxp7ZDGGO4NfSgEaULYm9GMMkGIj1Ck/0YcckBNawWpisa6NxdMs=\n\nhost;x-amz-content-sha256;x-amz-date; x-amz-security-token\n44136fa355b3678a1b4fc21fe77e8310c060f61caaff8a'\n\n The String-to-Sign should have been \n'AWS4-HMAC-SHA256\n20200730T044539Z\n20200730/ap-southeast-2/appsync/aws4_request\n29a5ecebf83602958c569f1ae18b5fa8353dd04833a833885'\n "}]},"tipo":"error_conexión"}
Así que necesito resolver la "Cadena canónica", la "Cadena para firmar" y cómo incluirlos en el encabezado de Autorización.
graphql-python/gql es compatible con AWS AppSync desde la versión 3.0.0rc0 .
Admite consultas, mutación e incluso suscripciones en el punto final en tiempo real.
Es compatible con los métodos de autenticación IAM, clave api y JWT.
La documentación está disponible aquí .
Este es un ejemplo de una suscripción que usa la autenticación IAM:
import asyncio import os import sys from gql import Client, gql from gql.transport.appsync_websockets import AppSyncWebsocketsTransport # Uncomment the following lines to enable debug output # import logging # logging.basicConfig(level=logging.DEBUG) async def main(): # Should look like: # https://XXXXXXXXXXXXXXXXXXXXXXXXXX.appsync-api.REGION.amazonaws.com/graphql url = os.environ.get("AWS_GRAPHQL_API_ENDPOINT") if url is None: print("Missing environment variables") sys.exit() transport = AppSyncWebsocketsTransport(url=url) async with Client(transport=transport) as session: subscription = gql( """ subscription onCreateMessage { onCreateMessage { message } } """ ) print("Waiting for messages...") async for result in session.subscribe(subscription): print(result) asyncio.run(main())