Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
Como uso o API Gateway como proxy para outro serviço da AWS?
Quero usar o Amazon API Gateway como proxy para outro serviço da AWS e integrar outros serviços com o API Gateway.
Resolução
Observação: se você receber mensagens de erro ao executar comandos da AWS Command Line Interface (AWS CLI), consulte Solução de problemas da AWS CLI. Além disso, verifique se você está usando a versão mais recente da AWS CLI.
As APIs de serviço da AWS são APIs REST às quais é possível fazer uma solicitação HTTPS. Para integrar outro serviço com o API Gateway, crie uma solicitação HTTPS do API Gateway para a API do serviço. Quando você usa esse método, todos os parâmetros da solicitação são mapeados corretamente.
Esta resolução descreve um exemplo de configuração quando você se integra à API de Publicação do Amazon Simple Notification Service (Amazon SNS) com o API Gateway. Use o exemplo a seguir como um esboço dos métodos a serem usados ao integrar o API Gateway a outros serviços.
Configure as ferramentas e os recursos necessários
Configure seu ambiente e crie todos os recursos da AWS necessários para seu caso de uso. Para o exemplo de configuração do Amazon SNS, conclua as seguintes etapas:
-
Crie um tópico do Amazon SNS. Anote o nome do recurso da Amazon (ARN) do tópico.
-
Abra o console do AWS Identity and Access Management (AWS IAM) e, em seguida, crie um perfil de execução do proxy de serviço da AWS. Na configuração de exemplo do Amazon SNS, permita a ação sns:Publish. Para obter mais informações, consulte Controlar e gerenciar o acesso a APIs REST no API Gateway.
-
Para criar uma API REST do API Gateway, use um recurso de teste. Para obter mais informações e exemplos, consulte Tutoriais e workshops do Amazon API Gateway.
-
Para importar a API REST, use o exemplo a seguir de definição de OpenAPI 2.0 (Swagger):
{ "swagger": "2.0", "info": { "version": "2019-10-09T14:10:24Z", "title": "aws-service-integration" }, "basePath": "/dev", "schemes": [ "https" ], "paths": { "/test": { "post": { "produces": [ "application/json" ], "parameters": [ { "name": "Message", "in": "query", "required": true, "type": "string" }, { "name": "TopicArn", "in": "query", "required": true, "type": "string" } ], "responses": { "200": { "description": "200 response", "schema": { "$ref": "#/definitions/Empty" } } }, "x-amazon-apigateway-integration": { "credentials": "arn:aws:iam::account-id:role/apigateway-sns-role", "uri": "arn:aws:apigateway:your-region:sns:action/Publish", "responses": { "default": { "statusCode": "200" } }, "requestParameters": { "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "requestTemplates": { "application/json": { "Fn::Sub": "Action=Publish&TopicArn=$util.urlEncode('${**YOUR-TOPIC-ARN**}')&Message=$util.urlEncode($input.body)##" } }, "passthroughBehavior": "when_no_match", "httpMethod": "POST", "type": "aws" } } } }, "definitions": { "Empty": { "type": "object", "title": "Empty Schema" } } }Observação: substitua arn:aws:iam::account-id:role/apigateway-sns-role pelo ARN do seu perfil do IAM e YOUR-TOPIC-ARN pelo ARN do seu tópico do SNS.
A opção anterior pré-configura as configurações do exemplo de configuração do Amazon SNS. Para criar sua API REST, substitua your-region pela sua região da AWS. Para obter mais informações, consulte What is OpenAPI? (O que é OpenAPI?) no site da Swagger.
Obtenha um exemplo de solicitação HTTPS
Um exemplo de solicitação HTTPS da API de serviço que você está integrando pode ajudá-lo a mapear os parâmetros da solicitação no API Gateway.
Na API de Publicação do Amazon SNS, é possível consultar a referência da API do serviço para obter um exemplo de solicitação.
Para obter uma solicitação HTTPS, execute o exemplo de solicitação a seguir:
https://sns.us-west-2.amazonaws.com/?Action=Publish&TargetArn=arn%3Aaws%3Asns%3Aus-west-2%3A803981987763%3Aendpoint%2FAPNS\_SANDBOX%2Fpushapp%2F98e9ced9-f136-3893-9d60-776547eafebb&Message=%7B%22default%22%3A%22This+is+the+default+Message%22%2C%22APNS\_SANDBOX%22%3A%22%7B+%5C%22aps%5C%22+%3A+%7B+%5C%22alert%5C%22+%3A+%5C%22You+have+got+email.%5C%22%2C+%5C%22badge%5C%22+%3A+9%2C%5C%22sound%5C%22+%3A%5C%22default%5C%22%7D%7D%22%7D &Version=2010-03-31 &AUTHPARAMS
- ou -
Gere o exemplo a partir de uma chamada de API. Use a AWS CLI para chamar a API de serviço e, em seguida, analise a saída. Identifique o comando da AWS CLI correspondente para a API de serviço que você está integrando e, em seguida, execute uma solicitação de teste com a opção —debug.
Para gerar um exemplo de uma chamada de API, execute o seguinte comando publish:
aws sns publish --topic-arn arn:aws:sns:us-east-1:123456789012:test --message "hi" --debug
Observação: substitua arn:aws:sns:us-east-1:123456789012:test pelo ARN do seu tópico do Amazon SNS.
Exemplo de saída:
2018-11-22 11:56:39,647 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: sns2018-11-22 11:56:39,648 - MainThread - botocore.hooks - DEBUG - Event before-parameter-build.sns.Publish: calling handler <function generate\_idempotent\_uuid at 0x11093d320>2018-11-22 11:56:39,649 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=Publish) (verify\_ssl=True) with params: {'body': {'Action': u'Publish', u'Message': u'hello', 'Version': u'2010-03-31', u'TopicArn': u'arn:aws:sns:us-east-1:123456789012:test'}, 'url': u'https://sns.us-east-1.amazonaws.com/', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.15.74 Python/2.7.14 Darwin/16.7.0 botocore/1.9.23'}, 'context': {'auth\_type': None, 'client\_region': 'us-east-1', 'has\_streaming\_input': False, 'client\_config': <botocore.config.Config object at 0x1118437d0>}, 'query\_string': '', 'url\_path': '/', 'method': u'POST'} 2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event request-created.sns.Publish: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x111843750>> 2018-11-22 11:56:39,650 - MainThread - botocore.hooks - DEBUG - Event choose-signer.sns.Publish: calling handler <function set\_operation\_specific\_signer at 0x11093d230> 2018-11-22 11:56:39,650 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth. 2018-11-22 11:56:39,651 - MainThread - botocore.auth - DEBUG - CanonicalRequest: POST / content-type:application/x-www-form-urlencoded; charset=utf-8 host:sns.us-east-1.amazonaws.com x-amz-date:20181122T062639Z content-type;host;x-amz-date
A saída contém a solicitação HTTPS, os cabeçalhos passados e a solicitação é um método HTTP POST.
Crie um método para sua API do API Gateway
Conclua as etapas a seguir:
- Abra o console do API Gateway.
- No painel de navegação, clique em APIs e, em seguida, selecione o nome da sua API.
- No painel Recursos, selecione um recurso. Na configuração de exemplo do Amazon SNS, selecione o recurso de teste que você criou.
- Clique em Criar método.
- Na nova janela:
Escolha o método que sua API de serviço usa no exemplo de solicitação HTTPS.
Na configuração de exemplo do Amazon SNS, selecione POST.
Em Tipo de integração, selecione AWS Service.
Em região da AWS, selecione a região da AWS do recurso associado à API de serviço que você está integrando.
Na configuração de exemplo do Amazon SNS, selecione a região do seu tópico do SNS.
Em Serviço da AWS, selecione o serviço que você está integrando ao API Gateway. Por exemplo, use o serviço Simple Notification Service (SNS).
Em Subdomínio da AWS, insira o subdomínio usado pelo serviço da AWS. Verifique a documentação do serviço para confirmar a disponibilidade de um subdomínio.
No exemplo de configuração do Amazon SNS, deixe o campo em branco.
Em Método HTTP, selecione o método que corresponde à API de serviço da AWS que você está integrando.
Na configuração de exemplo do Amazon SNS, selecione POST.
Em Tipo de ação, se a API de serviço que você está integrando for uma ação compatível, selecione Usar nome da ação. Consulte a referência da API do serviço para obter uma lista de ações compatíveis.
No Amazon SNS, consulte Ações.
Em Ação, insira o nome da API de serviço. Na configuração de exemplo do Amazon SNS, insira Publish.
-ou-
Em Tipo de ação, se a API de serviço da AWS espera um caminho de recurso em sua solicitação, selecione Usar substituição de caminho. Por exemplo, para a API ListLexicons do Amazon Polly, insira /v1/lexicons em Substituição de caminho (opcional).
Em Perfil de execução, insira o ARN do perfil do IAM que você criou. - Clique em Criar método.
Crie parâmetros para a solicitação do método
Identifique os parâmetros de solicitação obrigatórios e opcionais para a API de serviço que você está integrando. Para identificar esses parâmetros, consulte o exemplo de solicitação HTTPS que você recebeu anteriormente ou consulte a Referência de API na API de serviço. Por exemplo, consulte Publish.
Conclua as etapas a seguir:
- Abra o console do API Gateway.
- No painel de navegação, clique em APIs e, em seguida, selecione o nome da sua API.
- Na página Recursos, selecione seu Tipo de método.
- Clique na guia Solicitação de método e, em seguida, selecione Editar.
- Clique na lista suspensa Solicitar validador e selecione Validar corpo, parâmetros de string e cabeçalhos.
- Expanda Parâmetros de string de consulta de URL, e clique em Adicionar string de consulta.
- Em Nome, insira o nome de um parâmetro de solicitação para a API de serviço que você está integrando. Na configuração de exemplo do Amazon SNS, crie um parâmetro chamado TopicArn e outro chamado Message.
- (Opcional) Se o parâmetro for obrigatório, marque a caixa de seleção em Obrigatório.
- Clique em Salvar.
Para obter mais informações, consulte Configurar um método usando o console do API Gateway.
Observação: para algumas APIs de serviço, você deve enviar os cabeçalhos necessários e um corpo na solicitação de integração, além dos parâmetros necessários. É possível criar os cabeçalhos e o corpo no painel Solicitação de integração em Cabeçalhos da solicitação HTTP e Corpo da solicitação.
Por exemplo, se você estiver integrando a API ListCollections do Amazon Rekognition, crie o cabeçalho X-Amz-Target: RekognitionService.ListCollections.
Exemplo de código de solicitação:
POST https://rekognition.us-west-2.amazonaws.com/ HTTP/1.1 Host: rekognition.us-west-2.amazonaws.com Accept-Encoding: identity Content-Length: 2 X-Amz-Target: RekognitionService.ListCollections X-Amz-Date: 20170105T155800Z User-Agent: aws-cli/1.11.25 Python/2.7.9 Windows/8 botocore/1.4.82 Content-Type: application/x-amz-json-1.1 Authorization: AWS4-HMAC-SHA256 Credential=XXXXXXXX/20170105/us-west-2/rekognition/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-target, Signature=XXXXXXXX {}
Se você estiver integrando a API SendMessage do Amazon Simple Queue Service (Amazon SQS), mapeie o corpo da solicitação que usa a expressão de mapeamento method.request.body.JSONPath_EXPRESSION. (Substitua JSONPath_EXPRESSION por uma expressão JSONPath em um campo JSON do corpo da solicitação.)
Exemplo de código de solicitação:
{'url_path': '/', 'query_string': '', 'method': 'POST','headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.16.81 Python/3.6.5 Darwin/18.7.0 botocore/1.12.183'}, 'body': {'Action': 'SendMessage', 'Version': '2012-11-05', 'QueueUrl': 'https://sqs.ap-southeast-2.amazonaws.com/123456789012/test01', 'MessageBody': 'Hello'}, 'url': 'https://ap-southeast-2.queue.amazonaws.com/', 'context': {'client_region': 'ap-southeast-2', 'client_config': <botocore.config.Config object at 0x106862da0>, 'has_streaming_input': False, 'auth_type': None}}
Crie parâmetros para a solicitação de integração
Mapeie os parâmetros que você criou na solicitação de método para os parâmetros na solicitação de integração.
Conclua as etapas a seguir:
- Abra o console do API Gateway.
- No painel de navegação, clique em APIs e, em seguida, selecione o nome da sua API.
- Na página Recursos, selecione seu Tipo de método.
- Clique na guia Solicitação de integração e, em seguida, em Editar.
- Expanda Parâmetros de string de consulta de URL e selecione Adicionar parâmetro de string de consulta.
- Em Nome, insira o nome de um parâmetro de solicitação para a API de serviço que você está integrando.
Observação: o nome diferencia maiúsculas de minúsculas e deve ser escrito exatamente conforme a API de serviço exige - Em Mapeado de, insira method.request.querystring.param_name. Substitua param_name pelo nome do parâmetro correspondente que você criou para a solicitação de método. Por exemplo, method.request.querystring.TopicArn.
- Crie parâmetros para a solicitação de integração que correspondam a cada um dos parâmetros que você criou para a solicitação de método.
- Clique em Salvar.
Observação: se você criou cabeçalhos obrigatórios e um corpo para a solicitação de método, mapeie-os para a solicitação de integração. Para criar os cabeçalhos obrigatórios e um corpo para a solicitação do método, acesse o painel Solicitação de integração que fica abaixo de Cabeçalhos HTTP e Modelos de mapeamento.
Para mais informações, consulte Configurar uma solicitação de integração de API usando o console do API Gateway.
(Opcional) Verifique sua configuração de integração
Para verificar se sua configuração de integração está configurada corretamente, execute o seguinte comando get-integration:
aws apigateway get-integration --rest-api-id 1234123412 --resource-id y9h6rt --http-method POST
Para o exemplo de configuração do Amazon SNS, a saída parece semelhante ao exemplo de código a seguir:
{ "integrationResponses": { "200": { "responseTemplates": { "application/json": null }, "statusCode": "200" } }, "passthroughBehavior": "WHEN_NO_MATCH", "timeoutInMillis": 29000, "uri": "arn:aws:apigateway:us-east-2:sns:action/Publish", "httpMethod": "POST", "cacheNamespace": "y9h6rt", "credentials": "arn:aws:iam::1234567890:role/apigateway-sns-role", "type": "AWS", "requestParameters": { "integration.request.querystring.TopicArn": "method.request.querystring.TopicArn", "integration.request.querystring.Message": "method.request.querystring.Message" }, "cacheKeyParameters": [] }
Para maiores cargas úteis de mensagem, execute a seguinte integração do Amazon SNS em sua API:
"requestParameters": { "integration.request.header.Content-Type": "'application/x-www-form-urlencoded'" }, "requestTemplates" : { "application/json" : "Action=Publish&TopicArn=$util.urlEncode('<ourTopicArn>')&Message=$util.urlEncode($input.body)" }
Observação: o Amazon SNS suporta o tamanho máximo de cabeçalho de 16 KB. Antes de enviar a solicitação para sua integração, use um modelo de mapeamento de solicitação para converter uma solicitação HTTP recebida em um formato diferente. Como o ARN do tópico do Amazon SNS está codificado no modelo de mapeamento, os clientes não passam pelo ARN do tópico do SNS em sua solicitação.
Para verificar sua configuração de integração, conclua as seguintes etapas:
- Abra o console do API Gateway.
- No painel de navegação, clique em APIs e, em seguida, selecione o nome da sua API.
- Na página Recursos, selecione seu Tipo de método e, em seguida, clique na guia Teste.
- Na página Método de teste, conclua as seguintes etapas:
Em Strings de consulta, insira uma string de consulta que inclua parâmetros e valores de solicitação para elas.
Em Integração com o Amazon SNS, insira TopicArn= arn:aws:sns:us-east-1:123456789012:test&Message="Hello". Substitua arn:aws:sns:us-east-1:123456789012:test pelo ARN do seu tópico do Amazon SNS.
Para a integração com o Amazon SNS que usa o modelo de mapeamento, insira os dados JSON da carga útil da mensagem no Corpo da solicitação e clique em Testar.
Observação: a carga útil varia de acordo com sua configuração. - Quando você receber uma resposta bem-sucedida, implante sua API REST.
Informações relacionadas
Tutorial: Crie uma API REST com uma integração da AWS
Métodos para APIs REST no API Gateway
Integrações para APIs REST no API Gateway
Exemplos de mapeamento de parâmetros para APIs REST no API Gateway
- Idioma
- Português

Conteúdo relevante
- feita há 2 meses