Usar APIs privadas do AWS AppSync - AWS AppSync GraphQL

Usar APIs privadas do AWS AppSync

Se você usar o Amazon Virtual Private Cloud (Amazon VPC), poderá criar APIs privadas do AWS AppSync, que são APIs que podem ser acessadas somente a partir de uma VPC. Com uma API privada, você pode restringir o acesso da API aos seus aplicativos internos e conectar-se aos endpoints GraphQL e Realtime sem expor os dados publicamente.

Para estabelecer uma conexão privada entre a VPC e o serviço AWS AppSync, você deve criar endpoints da VPC de interface. Os endpoints de interface são desenvolvidos pelo AWS PrivateLink, o que permite que você acesse APIs do AWS AppSync de forma privada, sem um gateway da Internet, um dispositivo NAT, uma conexão VPN ou uma conexão do Direct Connect. As instâncias AWS AppSync na sua VPC não precisam de endereços IP públicos para a comunicação com APIs . O tráfego entre a VPC e o AWS AppSync não sai da rede da AWS.

O AWS AppSync dá suporte a AWS PrivateLink para as operações do plano de dados e do ambiente de gerenciamento:

  • Endpoint do plano de dados (com.amazonaws.{region}.appsync-api): dá acesso privado às APIs GraphQL e em tempo real para consultas, mutações e assinaturas.

  • Endpoint do ambiente de gerenciamento (com.amazonaws.{region}.appsync): dá acesso privado às operações de gerenciamento do AWS AppSync, como criação de APIs, atualização de esquemas e configuração de fontes de dados.

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

Há alguns fatores adicionais a serem considerados antes de ativar os atributos da API privada:

  • Configurar endpoints da interface da VPC para AWS AppSync com atributos de DNS privado ativados impedirá que os recursos na VPC possam invocar outras APIs públicas do AWS AppSync usando o URL da API gerada do AWS AppSync. Isso se deve ao fato de a solicitação à API pública ser roteada por meio do endpoint da interface, o que não é permitido para APIs públicas. Para invocar APIs públicas nesse cenário, é recomendável configurar nomes de domínio personalizados em APIs públicas, que podem ser usados pelos recursos na VPC para invocar a API pública.

  • Suas APIs privadas do AWS AppSync só estarão disponíveis na VPC. O editor de consultas do console do AWS AppSync só poderá acessar a API se a configuração de rede do navegador puder rotear o tráfego para a VPC (por exemplo, conexão via VPN ou Direct Connect).

  • Com um endpoint da interface da VPC para AWS AppSync, você pode acessar qualquer API privada na mesma conta e região do AWS. Para restringir ainda mais o acesso às APIs privadas, você pode considerar as seguintes opções:

    • Garantir que somente os administradores necessários possam criar interfaces de endpoint da VPC para. AWS AppSync

    • Usar políticas personalizadas de endpoint da VPC para restringir quais APIs podem ser invocadas a partir dos recursos na VPC.

    • Para recursos na VPC, recomendamos usar a autorização do IAM para invocar as APIs do AWS AppSync, garantindo que os recursos recebam funções de escopo reduzido para as APIs.

  • Ao criar ou usar políticas que restringem as entidades principais do IAM, você deve definir o authorizationType do método como AWS_IAM ou NONE.

Criar APIs privadas do AWS AppSync

As etapas a seguir mostram como criar APIs privadas no serviço AWS AppSync.

Atenção

Você pode ativar os atributos da API privada somente durante a criação da API. Essa configuração não pode ser modificada em uma API do AWS AppSync ou em uma API privada do AWS AppSync após sua criação.

  1. Faça login no Console de gerenciamento da AWS e abra o console do AppSync.

    1. No Painel, escolha Criar API.

  2. Escolha Criar uma API do zero e, em seguida, escolha Avançar.

  3. Na seção API privada, escolha Usar atributos da API privada.

  4. Configure o restante das opções, revise os dados da API e escolha Criar.

Para usar a API privada do AWS AppSync, você deve configurar endpoints de interface para AWS AppSync na VPC. Observe que a API privada e a VPC devem estar na mesma conta e região do AWS.

Criação de endpoints da interface para AWS AppSync

Você pode criar endpoints de interface para AWS AppSync usando o console da Amazon VPC ou a AWS Command Line Interface (AWS CLI). Dependendo do caso de uso, talvez você precise criar um ou ambos os tipos de endpoint:

  • Endpoint do plano de dados: necessário para acessar APIs privadas pela VPC

  • Endpoint do ambiente de gerenciamento: necessário para gerenciar recursos do AWS AppSync pela VPC usando a AWS CLI ou os SDKs

Para obter mais informações, consulte Criar um endpoint de interface no Guia do usuário da Amazon VPC.

nota

Não se esqueça de selecionar o serviço do endpoint da VPC correto; existem dois para AppSync: com.amazonaws.{region}.appsync-api é o necessário para APIs privadas, e com.amazonaws.{region}.appsync, o usado no gerenciamento de API.

Console
  1. Faça login em Console de gerenciamento da AWS e abra a página Endpoints do console da Amazon VPC.

  2. Escolha Criar endpoint.

    1. No campo Categoria de serviço, verifique se a opção Serviços da AWS está selecionada.

    2. Na tabela Serviços, escolha um dos seguintes serviços:

      • Para acesso do plano de dados: com.amazonaws.{region}.appsync-api

      • Para acesso do ambiente de gerenciamento: com.amazonaws.{region}.appsync

      Verifique se o valor da coluna Tipo é Interface.

    3. No campo VPC, escolha uma VPC e suas sub-redes.

    4. Para habilitar os atributos do DNS privado para o endpoint da interface, marque a caixa de seleção Habilitar nome de DNS.

    5. Em Grupo de segurança, selecione um ou mais grupos de segurança.

  3. Escolha Criar endpoint.

  4. Repita o processo para criar o segundo tipo de endpoint, se necessário.

CLI

Use o comando create-vpc-endpoint e especifique o ID da VPC, o tipo de endpoint da VPC (interface), o nome do serviço, as sub-redes que usarão o endpoint e os grupos de segurança associados às interfaces de rede do endpoint.

Crie um endpoint do plano de dados:

$ 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

Crie um endpoint do ambiente de gerenciamento:

$ 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 usar a opção de DNS privado, defina os valores enableDnsHostnames e enableDnsSupportattributes da VPC. Para obter mais informações, consulte Ver e atualizar o suporte do DNS para a VPC no Manual do usuário da Amazon VPC. Se você habilitar os atributos do DNS privado para o endpoint de interface, poderá fazer solicitações para a API GraphQL do AWS AppSync e para o endpoint em tempo real por meio dos endpoints do DNS público padrão usando o formato abaixo:

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

Para operações do ambiente de gerenciamento, você pode usar o endpoint de serviço do AWS AppSync padrão:

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

Para obter mais informações sobre endpoints de serviço, consulte Endpoints de serviço e cotas na Referência geral do AWS.

Para obter mais informações sobre interações de serviço com endpoints da interface, consulte Acessar um serviço por um endpoint de interface no Guia do usuário da Amazon VPC.

Para obter informações sobre como criar e configurar um endpoint usando o AWSCloudFormation, consulte o recurso ::EC2::VPCEndpoint do AWS no Guia do usuário do AWS CloudFormation.

Exemplos avançados

Se você habilitar os atributos do DNS privado para o endpoint de interface, poderá fazer solicitações para a API GraphQL do AWS AppSync e para o endpoint em tempo real por meio dos endpoints do DNS público padrão usando o formato abaixo:

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

Usando os nomes de host de DNS público do endpoint da VPC da interface, o URL de base para invocar a API estará neste formato:

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

Você também pode usar o nome de host de DNS específico do AZ se tiver implantado um endpoint no AZ:

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

Usar o nome de DNS público do endpoint da VPC exigirá que o nome do host do endpoint da API do AWS AppSync seja passado como cabeçalho Host ou x-appsync-domain para a solicitação. Esses exemplos usam um TodoAPI que foi criado no guia Iniciar esquema de amostra:

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"}}}'

Nos exemplos a seguir, usaremos o aplicativo Todo que é gerado no guia Iniciar esquema de amostra. Para testar a amostra da API Todo, usaremos o DNS privado para invocar a API. Você pode usar qualquer ferramenta de linha de comando de sua escolha; este exemplo usa curl para enviar consultas e mutações e wscat para configurar assinaturas. Para emular nosso exemplo, substitua os valores entre colchetes { } nos comandos abaixo pelos valores correspondentes da sua conta do AWS.

Operação de mutação de teste — Solicitação do 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"}}}'

Operação de mutação de teste — Resposta do createTodo

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

Operação de consulta de teste — Solicitação do 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"}}}'

Operação de consulta de teste — Solicitação do listTodos

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

Operação de assinatura de teste — Assinatura para a mutação do createTodo

Para configurar assinaturas do GraphQL no AWS AppSync, consulte Criar um cliente WebSocket em tempo real. Em uma instância do Amazon EC2 em uma VPC, você pode testar o endpoint de assinatura da API privada do AWS AppSync usando wscat. O exemplo abaixo usa um API KEY para autorização.

$ 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"}

Como alternativa, use o nome de domínio do endpoint da VPC e, ao mesmo tempo, certifique-se de especificar o cabeçalho Host no comando wscat para estabelecer o 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"}

Execute o código de mutação abaixo:

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"}}}'

Depois disso, uma assinatura é acionada, e a mensagem de notificação aparece conforme mostrado abaixo:

< {"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"}}}}

Exemplos do ambiente de gerenciamento

Com o endpoint da VPC do ambiente de gerenciamento configurado, você pode gerenciar recursos do AWS AppSync de dentro da VPC usando a AWS CLI ou os SDKs. Aqui estão exemplos de operações do ambiente de gerenciamento comuns:

Criação de uma API usando a AWS CLI

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

Atualizar um esquema

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

Criação de fonte de dados

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

Durante o uso do endpoint do ambiente de gerenciamento com o DNS privado habilitado, esses comandos serão encaminhados automaticamente pelo endpoint da VPC. Se o DNS privado não estiver habilitado, você poderá especificar o URL do endpoint:

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

Usar políticas do IAM para limitar a criação de API pública

AWS AppSync oferece suporte a declarações do Condition do IAM para uso com APIs privadas. O campo visibility pode ser incluído nas declarações da política do IAM para que a operação do appsync:CreateGraphqlApi para controlar quais perfis e usuários do IAM podem criar APIs públicas e privadas. Com isso, o administrador do IAM pode definir uma política do IAM que só permitirá que um usuário crie uma API privada do GraphQL. Um usuário que tentar criar uma API pública receberá uma mensagem informando que a operação não é autorizada.

Por exemplo, um administrador do IAM poderia criar a seguinte declaração de política do IAM para permitir a criação de APIs privadas:

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

Um administrador do IAM também pode adicionar a seguinte política de controle de serviços para impedir que todos os usuários de uma organização do AWS criem APIs do AWS AppSync que não sejam APIs privadas:

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

O suporte da VPC Privatelink está disponível no AWS AppSync. O PrivateLink permite a você usar e interagir com um serviço da AWS sem que nenhum tráfego deixe a rede da AWS.

O AWS AppSync dá suporte a AWS PrivateLink para as operações do plano de dados e do ambiente de gerenciamento.

  • Endpoint VPCE (appsync.<region>.vpce.amazonaws.com): dá acesso de VPC a operações do plano de dados e do ambiente de gerenciamento assim:

    • appsync para operações do ambiente de gerenciamento

    • appsync-api para operações de plano de dados