Usar APIs privadas do AWS AppSync - AWS AppSync

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á.

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, crie um endpoint da VPC da 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 AWS Direct Connect. As instâncias na VPC não precisam de endereços IP públicos para a comunicação com APIs do AWS AppSync. O tráfego entre a VPC e o AWS AppSync não sai da rede da AWS.

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 AWS 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 AWS Management Console 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.

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

Criar um endpoint da interface para o AWS AppSync

É possível criar um endpoint da interface para o AWS AppSync usando o console da Amazon VPC ou AWS Command Line Interface (AWS CLI). Para obter mais informações, consulte Criar um endpoint da interface no Guia do usuário da Amazon VPC.

Console
  1. Faça login em AWS Management Console 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 com.amazonaws.{region}.appsync-api. 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.

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. Por exemplo:

$ 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

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

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