Registrar chamadas à API do AWS AppSync usando o AWS CloudTrail - AWS AppSync GraphQL

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Registrar chamadas à API do AWS AppSync usando o AWS CloudTrail

O AWS AppSync é integrado ao AWS CloudTrail, um serviço que fornece um registro das ações realizadas por um usuário, por uma função ou por um produto da AWS no AWS AppSync. O CloudTrail captura as chamadas de API do AWS AppSync como eventos. As chamadas capturadas incluem as chamadas do console do AWS AppSync e as chamadas de código para as APIs do AWS AppSync. Você pode usar as informações coletadas pelo CloudTrail para determinar qual solicitação foi feita para o AWS AppSync, o endereço IP de origem da solicitação, quem fez a solicitação, quando isso foi feito e outros detalhes.

Se você criar uma trilha, poderá habilitar a entrega contínua de eventos do CloudTrail para um bucket do Amazon Simple Storage Service (Amazon S3), incluindo eventos do AWS AppSync. Mesmo que você não configure uma trilha, é possível visualizar os eventos mais recentes no console do CloudTrail.

Para obter mais informações sobre o CloudTrail, consulte o Guia do usuário do AWS CloudTrail.

AWS AppSyncInformações do no CloudTrail

O CloudTrail é habilitado em sua AWS conta ao criá-la. No console do CloudTrail em Histórico de eventos, é possível visualizar, pesquisar e baixar eventos recentes em sua conta da AWS. Para obter mais informações, consulte Visualizar eventos com o histórico de eventos CloudTrail no Guia do usuário do AWS CloudTrail.

Para um registro contínuo de eventos em sua AWS conta, inclusive eventos para AWS AppSync, crie uma trilha. Por padrão, quando uma trilha é criada no console, a mesma é aplicada a todas as regiões da AWS. A trilha registra logs de eventos de todas as Regiões na AWS divisória e entrega os arquivos do log para o bucket Amazon S3 especificado. Além disso, é possível configurar outros AWS serviços para melhor analisar e agir de acordo com dados coletados do evento nos logs CloudTrail. Para obter mais informações, consulte o seguinte no Guia do usuário do AWS CloudTrail:

O CloudTrail registra todas as operações da API AWS AppSync. Por exemplo, as chamadas para as APIs CreateGraphqlApi, CreateDataSource e ListResolvers geram entradas nos arquivos de log do CloudTrail. Essas e outras operações estão documentadas na Referência da API AWS AppSync.

Cada entrada de log ou evento contém informações sobre quem gerou a solicitação. As informações de identidade ajudam a determinar:

  • Se a solicitação foi feita com credenciais de usuário-raiz ou usuário do AWS Identity and Access Management (IAM).

  • Se a solicitação foi feita com credenciais de segurança temporárias de um perfil ou de um usuário federado.

  • Se a solicitação foi feita por outro serviço da AWS.

Para obter mais informações, consulte o Elemento userIdentity do CloudTrail no Guia do usuário do AWS CloudTrail.

AWS AppSyncEventos de dados do no CloudTrail

Os Eventos de dados fornecem informações sobre as operações de recursos realizadas em um recurso (por exemplo, leitura ou gravação em um objeto do Amazon S3). Também são conhecidas como operações de plano de dados. Os eventos de dados costumam ser atividades de alto volume. Por padrão, o CloudTrail não registra eventos de dados em log. O Histórico de eventos do CloudTrail não registra eventos de dados.

Há cobranças adicionais para eventos de dados. Para obter mais informações sobre os preços do CloudTrail, consulte Preços do AWS CloudTrail.

Você pode registrar eventos de dados para o tipo de recurso AWS::AppSync::GraphQLApi usando o console CloudTrail, AWS CLI, ou as operações da API do CloudTrail (entre elas estão operações de consulta, mutação e assinatura, operações de conexão com o endpoint WebSocket em tempo real, mas não mensagens enviadas pelo endpoint WebSocket em tempo real). Para obter mais informações sobre como registrar eventos de dados em log, consulte Registrar eventos de dados com o Console de gerenciamento da AWS e Registrar eventos de dados com a AWS Command Line Interface no Guia do usuário do AWS CloudTrail.

A tabela a seguir lista o tipo de recurso AWS AppSync no qual você pode registrar em log eventos de dados. A coluna Tipo de evento de dados (console) mostra o valor a ser escolhido na lista Tipo de evento de dados no console do CloudTrail. A coluna do valor resources.type mostra o valor de resources.type que você especificaria ao configurar seletores de eventos avançados usando a AWS CLI ou as APIs do CloudTrail. A coluna APIs de dados registradas no CloudTrail mostra as chamadas de API registradas no CloudTrail para o tipo de recurso.

Tipo de evento de dados (console) valor resources.type APIs de dados registradas no CloudTrail
AppSync GraphQL AWS::AppSync::GraphQLApi

GraphQL

É possível configurar seletores de eventos avançados para filtrar os campos eventName, readOnly e resources.ARN para registrar em log somente os eventos que são importantes para você. Para obter mais informações sobre esses campos, consulte AdvancedFieldSelector na Referência de API do AWS CloudTrail.

[ { "name": "Only 1 AppSync API", "fieldSelectors": [ { "field": "eventCategory", "equals": [ "Data" ] }, { "field": "resources.type", "equals": [ "AWS::AppSync::GraphQLApi" ] }, { "field": "resources.ARN", "equals": [ "arn:aws:appsync:us-east-1:111122223333:apis/YourGraphQLApiId" ] } ] } ]

Noções básicas sobre entradas de arquivos de log do AWS AppSync

O CloudTrail gera eventos como arquivos de log contendo uma ou mais entradas de log. Um evento representa uma única solicitação de qualquer origem e inclui informações sobre a operação solicitada, a data e a hora em que ocorreram, os parâmetros da solicitação etc. Os arquivos de log não são um rastreamento de pilha ordenada de chamadas de API pública e, portanto, não são exibidos em uma ordem específica.

nota

O requestID não é um ID exclusivo autorizado para logs emitidos por AWS AppSync. O requestID pode ser substituído pelo cliente. Por isso, você deve tomar cuidado ao tomar decisões com base nessas informações.

O exemplo a seguir mostra uma entrada de log do CloudTrail demonstrado a operação de CreateApiKey.

{ "Records": [{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::111122223333:user/Alice", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "diego_ramirez" }, "eventTime": "2018-01-31T21:49:09Z", "eventSource": "appsync.amazonaws.com", "eventName": "CreateApiKey", "awsRegion": "us-west-2", "sourceIPAddress": "192.2.0.1", "userAgent": "aws-cli/1.11.72 Python/2.7.11 Darwin/16.7.0 botocore/1.5.35", "requestParameters": { "apiId": "a1b2c3d4e5f6g7h8i9jexample" }, "responseElements": { "apiKey": { "id": "***", "expires": 1518037200000 } }, "requestID": "99999999-9999-9999-9999-999999999999", "eventID": "99999999-9999-9999-9999-999999999999", "readOnly": false, "eventType": "AwsApiCall", "recipientAccountId": "111122223333" } ] }

O exemplo a seguir mostra uma entrada de log do CloudTrail demonstrado a operação de ListApiKeys.

{ "Records": [{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::111122223333:user/diego_ramirez", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "diego_ramirez" }, "eventTime": "2018-01-31T21:49:09Z", "eventSource": "appsync.amazonaws.com", "eventName": "ListApiKeys", "awsRegion": "us-west-2", "sourceIPAddress": "192.2.0.1", "userAgent": "aws-cli/1.11.72 Python/2.7.11 Darwin/16.7.0 botocore/1.5.35", "requestParameters": { "apiId": "a1b2c3d4e5f6g7h8i9jexample" }, "responseElements": { "apiKeys": [ { "id": "***", "expires": 1517954400000 }, { "id": "***", "expires": 1518037200000 }, ] }, "requestID": "99999999-9999-9999-9999-999999999999", "eventID": "99999999-9999-9999-9999-999999999999", "readOnly": false, "eventType": "AwsApiCall", "recipientAccountId": "111122223333" } ] }

O exemplo a seguir mostra uma entrada de log do CloudTrail demonstrado a operação de DeleteApiKey.

{ "Records": [{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::111122223333:user/diego_ramirez", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "diego_ramirez" }, "eventTime": "2018-01-31T21:49:09Z", "eventSource": "appsync.amazonaws.com", "eventName": "DeleteApiKey", "awsRegion": "us-west-2", "sourceIPAddress": "192.2.0.1", "userAgent": "aws-cli/1.11.72 Python/2.7.11 Darwin/16.7.0 botocore/1.5.35", "requestParameters": { "id": "***", "apiId": "a1b2c3d4e5f6g7h8i9jexample" }, "responseElements": null, "requestID": "99999999-9999-9999-9999-999999999999", "eventID": "99999999-9999-9999-9999-999999999999", "readOnly": false, "eventType": "AwsApiCall", "recipientAccountId": "111122223333" } ] }

A entrada de log do CloudTrail de exemplo a seguir demonstra uma mutação do GraphQL bem-sucedida autorizada com um autorizador de função do Lambda personalizado.

{ "eventVersion": "1.10", "userIdentity": { "type": "Unknown" }, "eventTime": "2024-11-06T15:42:30Z", "eventSource": "appsync.amazonaws.com", "eventName": "GraphQL", "awsRegion": "us-west-2", "sourceIPAddress": "15.248.1.214", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0", "requestParameters": null, "responseElements": null, "additionalEventData": { "operationName": "MyMutation", "authType": [ "AWS_LAMBDA" ], "fieldAuthorizationResults": { "deniedFields": [] } }, "requestID": "c2d3768b-3446-40a1-bd95-8399fe776f96", "eventID": "21568be1-a1a8-4f43-b978-63cb4cc02a96", "readOnly": false, "resources": [ { "accountId": "123456789012", "type": "AWS::AppSync::GraphQLApi", "ARN": "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u" } ], "eventType": "AwsApiCall", "managementEvent": false, "recipientAccountId": "123456789012", "eventCategory": "Data" }

A entrada de log do CloudTrail de exemplo a seguir demonstra uma operação do GraphQL parcialmente bem-sucedida autorizada com um autorizador de função do Lambda personalizado. Observe a propriedade fieldAuthorizationResults.deniedFields que especifica os campos negados.

{ "eventVersion": "1.10", "userIdentity": { "type": "Unknown" }, "eventTime": "2024-11-06T16:11:49Z", "eventSource": "appsync.amazonaws.com", "eventName": "GraphQL", "awsRegion": "us-west-2", "sourceIPAddress": "15.248.1.214", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0", "requestParameters": null, "responseElements": null, "additionalEventData": { "operationName": "MyMutation", "authType": [ "AWS_LAMBDA" ], "fieldAuthorizationResults": { "deniedFields": [ "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u/types/Mutation/fields/createPost", "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u/types/Subscription/fields/onCreatePost", "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u/types/Post/fields/status" ] } }, "requestID": "ae817c4c-66ba-4f64-92a5-ba9c9c341dcd", "eventID": "30109698-7605-476a-9dff-b7ed78d134dc", "readOnly": false, "resources": [ { "accountId": "123456789012", "type": "AWS::AppSync::GraphQLApi", "ARN": "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u" } ], "eventType": "AwsApiCall", "managementEvent": false, "recipientAccountId": "123456789012", "eventCategory": "Data" }

A entrada de log do CloudTrail do exemplo a seguir demonstra uma operação do GraphQL com falha.

{ "eventVersion": "1.10", "userIdentity": { "type": "Unknown" }, "eventTime": "2024-11-06T15:51:11Z", "eventSource": "appsync.amazonaws.com", "eventName": "GraphQL", "awsRegion": "us-west-2", "sourceIPAddress": "15.248.1.214", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0", "errorCode": "AccessDenied", "errorMessage": "{\n \"errors\" : [ {\n \"errorType\" : \"UnauthorizedException\",\n \"message\" : \"You are not authorized to make this call.\"\n } ]\n}", "requestParameters": null, "responseElements": null, "additionalEventData": { "operationName": "MyFullyDeniedLambdaMutation" }, "requestID": "0bef3cf3-a48b-4de9-8b1f-038afb563516", "eventID": "b738651f-4ec0-4548-8fec-200c6b42842b", "readOnly": false, "resources": [ { "accountId": "123456789012", "type": "AWS::AppSync::GraphQLApi", "ARN": "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u" } ], "eventType": "AwsApiCall", "managementEvent": false, "recipientAccountId": "123456789012", "eventCategory": "Data" }

O exemplo a seguir demonstra uma solicitação do GraphQL bem-sucedida.

{ "eventVersion": "1.10", "userIdentity": { "type": "AssumedRole", "principalId": "AIDACKCEVSQ6C2EXAMPLE:jane_doe", "arn": "arn:aws:sts::123456789012:assumed-role/admin/jane_doe", "accountId": "123456789012", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn": "arn:aws:iam::123456789012:role/admin", "accountId": "123456789012", "userName": "jane_doe" }, "attributes": { "creationDate": "2024-11-06T15:40:09Z", "mfaAuthenticated": "false" } } }, "eventTime": "2024-11-06T16:03:43Z", "eventSource": "appsync.amazonaws.com", "eventName": "GraphQL", "awsRegion": "us-west-2", "sourceIPAddress": "15.248.1.214", "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:131.0) Gecko/20100101 Firefox/131.0", "requestParameters": null, "responseElements": null, "additionalEventData": { "operationName": "IamFullSuccess", "authType": [ "AWS_IAM" ], "fieldAuthorizationResults": { "allowedFields": [ "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u/types/Mutation/fields/createSecondPostAllowed" ], "deniedFields": [] } }, "requestID": "edc6bbbf-6bf2-40f5-820f-ef444f12e0c1", "eventID": "524656a5-0925-4370-9e7e-08888e9c299f", "readOnly": false, "resources": [ { "accountId": "123456789012", "type": "AWS::AppSync::GraphQLApi", "ARN": "arn:aws:appsync:us-west-2:123456789012:apis/rxfqcxzi3nbvza2hsq4njqqq6u" } ], "eventType": "AwsApiCall", "managementEvent": false, "recipientAccountId": "123456789012", "eventCategory": "Data" }