Este tópico explica como integrar o API Gateway ao Function Compute usando o Function Compute 3.0 como exemplo.
Pré-requisitos
Você já criou uma instância do API Gateway. Para informações sobre seleção de instâncias, consulte Guia de tipos e seleção de instâncias.
Visão geral
O API Gateway oferece suporte a dois tipos de funções do Function Compute: funções HTTP e funções de evento.
Integrar uma função HTTP ao API Gateway
Etapa 1: Criar uma função web
Antes de configurar o API Gateway, crie uma função web no console do Function Compute 3.0. Para mais informações, consulte Criar uma função web.
Etapa 2: Criar um serviço de backend
Defina um serviço de backend no API Gateway e configure o endereço para apontar para o serviço do Function Compute.
-
Faça login no console do API Gateway. No painel de navegação à esquerda, escolha . Na barra de navegação superior, selecione uma região e clique em Create Backend Service.

-
Na caixa de diálogo Create Backend Service, configure os parâmetros e clique em OK.
Defina Name como
FC-backend, Type como Function Compute, Product Version como Function Compute 3.0 e Function Type como HTTP function. Na página Backend Services, clique no serviço de backend recém-criado. Na página de definição de serviço exibida, selecione a aba Production. Na seção Basic Information, clique em Create.
-
Na página Basic Information, configure o endereço de acesso do trigger path e clique em Publish.
O endereço de acesso é a url da função HTTP. Exemplo:
https://helloworld-xxx-hangzhou-vpc.fcapp.run.
Etapa 3: Criar uma API
Crie uma API no console do API Gateway. Para mais informações, consulte Criar uma API.
Selecione um grupo de APIs. Recomendamos criar o grupo na mesma região da função do Function Compute.
Se a função do Function Compute e a API estiverem em regiões diferentes, o API Gateway encaminhará as solicitações ao serviço do Function Compute pela internet, o que pode gerar custos de transferência de dados. Se a segurança dos dados e a latência de rede forem críticas, garanta que a API e a função do Function Compute estejam na mesma região.
Crie e defina a API. Na etapa Define Backend Service, configure os seguintes parâmetros:
Backend Configuration: Use um serviço de backend existente.
Backend Service Type: Function Compute.
Product Version: Function Compute 3.0.
Function Type: HTTP function.
Backend Service: Selecione o nome do serviço de backend criado.
Backend Request Path: Especifique um caminho personalizado ou insira uma barra (/).
HTTP Method: Selecione o método compatível com a função do Function Compute no backend. Se houver suporte para vários métodos, selecione ANY.
Usar uma função de outra conta
O API Gateway pode invocar uma função do Function Compute pertencente a uma conta diferente da Alibaba Cloud. Esta seção descreve como uma instância do API Gateway na Conta A pode invocar uma função na Conta B.
-
A Conta B deve conceder permissão à instância do API Gateway da Conta A para invocar a função do Function Compute.
Etapa 1: Faça login no console do Resource Access Management (RAM) como Conta B e crie uma função do RAM. Para mais informações, consulte Criar uma função do RAM para uma conta confiável da Alibaba Cloud.
Etapa 2: Conceda à função do RAM criada na Etapa 1 permissão para invocar a função do Function Compute. Anexe a política de sistema AliyunFCInvocationAccess. Para mais informações, consulte Conceder permissões a uma função do RAM.
Etapa 3: Edite a política de confiança da função do RAM criada na Etapa 1. Para mais informações, consulte Editar a política de confiança de uma função do RAM. Adicione o ID da Conta A (por exemplo, 123456789012****) à política de confiança. A política modificada fica assim:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "123456789012****@apigateway.aliyuncs.com" ] } } ], "Version": "1" }Etapa 4: A Conta B fornece o Alibaba Cloud Resource Name (ARN) da função do RAM criada na Etapa 1 para a Conta A. Para mais informações, consulte Visão geral das funções do RAM.
No console do API Gateway, a Conta A adiciona um serviço de backend que acessa a função do Function Compute da Conta B. No campo trigger path, insira a url de acesso da função na Conta B. No campo role ARN, insira o ARN fornecido pela Conta B.
Quando uma função HTTP atua como serviço de backend, o API Gateway sobrescreve o cabeçalho Authorization do cliente. Recomendamos usar um nome de parâmetro diferente no cliente.
Integrar uma função de evento ao API Gateway
Etapa 1: Criar uma função acionada por evento
Para criar uma função de evento no console do Function Compute 3.0, consulte Criar uma função acionada por evento.
Etapa 2: Criar um serviço de backend
Defina um serviço de backend no API Gateway e configure o endereço para apontar para o serviço do Function Compute.
-
Faça login no console do API Gateway. Selecione uma região. No painel de navegação à esquerda, escolha . No canto superior direito, clique em Create Backend Service.
Defina Name como
FC-mobile, Type como Function Compute, Product Version como Function Compute 3.0 e Function Type como event function. Na página Backend Services, clique no serviço de backend recém-criado. Na página de definição de serviço exibida, selecione a aba Production. Na seção Basic Information, clique em Create.
-
Selecione o nome da função de evento criada e clique em Publish.
Defina Region como China (Hangzhou) e Function Alias como LATEST.
Etapa 3: Criar uma API
Crie uma API no console do API Gateway. Para mais informações, consulte Criar uma API.
Selecione um grupo de APIs. Recomendamos criar o grupo na mesma região da função do Function Compute.
Se a função do Function Compute e a API estiverem em regiões diferentes, o API Gateway encaminhará as solicitações ao serviço do Function Compute pela internet, o que pode gerar custos de transferência de dados. Se a segurança dos dados e a latência de rede forem críticas, garanta que a API e a função do Function Compute estejam na mesma região.
Backend Configuration: Use um serviço de backend existente.
Backend Service Type: Function Compute.
Product Version: Function Compute 3.0.
Function Type: event function.
Backend Service: Selecione o nome do serviço de backend criado.
Formatos de dados da função de evento
Ao invocar uma função de evento, o API Gateway converte os dados relacionados à API em formato de mapa e os transmite ao serviço do Function Compute. Após o processamento, a função retorna dados como código de status, cabeçalhos e corpo no formato de saída ilustrado na figura a seguir. O API Gateway mapeia esse conteúdo retornado para o código de status, cabeçalho e corpo da resposta enviada ao cliente.

Formato do payload da solicitação (do API Gateway para o Function Compute)
Ao usar o Function Compute como serviço de backend para uma API, o API Gateway passa os parâmetros da solicitação em uma estrutura de mapa fixa para o parâmetro de entrada event da função. Assim, a função obtém e processa os parâmetros dessa estrutura.
{
"path":"api request path",
"httpMethod":"request method name",
"headers":{all headers,including system headers},
"queryParameters":{query parameters},
"pathParameters":{path parameters},
"body":"string of request payload",
"isBase64Encoded":"true|false, indicate if the body is Base64-encode"
}
Se o valor de
"isBase64Encoded"for"true", o API Gateway transmitirá um corpo codificado em Base64. A função deve decodificá-lo antes do processamento.Se o valor de
"isBase64Encoded"for"false", o API Gateway não aplicará codificação Base64 ao conteúdo do corpo.
Formato do payload da resposta (do Function Compute para o API Gateway)
A função deve retornar a saída no seguinte formato JSON para que o API Gateway possa analisá-la.
{
"isBase64Encoded":true|false,
"statusCode":httpStatusCode,
"headers":{response headers},
"body":"..."
}
Para conteúdo binário no corpo, codifique-o em Base64 dentro da função e defina
"isBase64Encoded"como"true". Se a codificação Base64 do corpo não for necessária, defina"isBase64Encoded"como"false". O API Gateway decodifica qualquer conteúdo de corpo onde"isBase64Encoded"seja"true"antes de retornar a resposta ao cliente.-
Em ambiente Node.js, a função define o callback conforme os resultados.
Solicitação bem-sucedida:
callback(null,{"statusCode":200,"body":"..."})Exceção:
callback(new Error('internal server error'),null)Erro do cliente:
callback(null,{"statusCode":400,"body":"param error"})
Se a função retornar um resultado fora do formato exigido, o API Gateway enviará um erro 503 Service Unavailable ao cliente.
Exemplos de invocação de função de evento
A seção a seguir apresenta amostras de código de função de evento, uma solicitação e uma resposta do API Gateway.
Amostra de código de função de evento
Configure o exemplo de código abaixo na página de execução de código da função.
module.exports.handler = function(event, context, callback) {
var responseCode = 200;
console.log("request: " + JSON.stringify(event.toString()));
// Convert the event to a JSON object.
event=JSON.parse(event.toString());
var isBase64Encoded=false;
// Return a response based on the statusCode entered by the user. This can be used to test different status codes.
if (event.queryParameters !== null && event.queryParameters !== undefined) {
if (event.queryParameters.httpStatus !== undefined && event.queryParameters.httpStatus !== null && event.queryParameters.httpStatus !== "") {
console.log("Received http status: " + event.queryParameters.httpStatus);
responseCode = event.queryParameters.httpStatus;
}
}
// If the body is Base64-encoded, decode the body in Function Compute.
if(event.body!==null&&event.body!==undefined){
if(event.isBase64Encoded!==null&&event.isBase64Encoded!==undefined&&event.isBase64Encoded){
event.body=new Buffer(event.body,'base64').toString();
}
}
// The input is the content sent from API Gateway to Function Compute.
var responseBody = {
message: "Hello World!",
input: event
};
// Base64-encode the body content as needed.
var base64EncodeStr=new Buffer(JSON.stringify(responseBody)).toString('base64');
// The response from Function Compute to API Gateway must be in the required format. The isBase64Encoded setting depends on whether the body is Base64-encoded.
var response = {
isBase64Encoded:true,
statusCode: responseCode,
headers: {
"x-custom-header" : "header value"
},
body: base64EncodeStr
};
console.log("response: " + JSON.stringify(response));
callback(null, response);
};
Amostra de solicitação de função de evento
O exemplo abaixo mostra uma solicitação POST para uma API com o seguinte caminho:
/fc/test/invoke/[type]
POST http://test.alicloudapi.com/fc/test/invoke/test?param1=aaa¶m2=bbb
"X-Ca-Signature-Headers":"X-Ca-Timestamp,X-Ca-Version,X-Ca-Key,X-Ca-Stage",
"X-Ca-Signature":"TnoBldxxRHrFferGlzzkGcQsaezK+ZzySloKqCOsv2U=",
"X-Ca-Stage":"RELEASE",
"X-Ca-Timestamp":"1496652763510",
"Content-Type":"application/x-www-form-urlencoded; charset=utf-8",
"X-Ca-Version":"1",
"User-Agent":"Apache-HttpClient\/4.1.2 (java 1.6)",
"Host":"test.alicloudapi.com",
"X-Ca-Key":"testKey",
"Date":"Mon, 05 Jun 2017 08:52:43 GMT","Accept":"application/json",
"headerParam":"testHeader"
{"bodyParam":"testBody"}
Amostra de resposta do API Gateway
200
Date: Mon, 05 Jun 2017 08:52:43 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 429
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS , PATCH
Access-Control-Allow-Headers: X-Requested-With, X-Sequence,X-Ca-Key,X-Ca-Secret,X-Ca-Version,X-Ca-Timestamp,X-Ca-Nonce,X-Ca-API-Key,X-Ca-Stage,X-Ca-Client-DeviceId,X-Ca-Client-AppId,X-Ca-Signature,X-Ca-Signature-Headers,X-Forwarded-For,X-Ca-Date,X-Ca-Request-Mode,Authorization,Content-Type,Accept,Accept-Ranges,Cache-Control,Range,Content-MD5
Access-Control-Max-Age: 172800
X-Ca-Request-Id: 16E9D4B5-3A1C-445A-BEF1-4AD8E31434EC
x-custom-header: header value
{"message":"Hello World!","input":{"body":"{\"bodyParam\":\"testBody\"}","headers":{"X-Ca-Api-Gateway":"16E9D4B5-3A1C-445A-BEF1-4AD8E31434EC","headerParam":"testHeader","X-Forwarded-For":"100.81.146.152","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},"httpMethod":"POST","isBase64Encoded":false,"path":"/fc/test/invoke/test","pathParameters":{"type":"test"},"queryParameters":{"param1":"aaa","param2":"bbb"}}}
Perguntas frequentes
-
Por que não consigo selecionar minha função existente?
Verifique se o nome do serviço e o nome da função inseridos correspondem exatamente aos nomes do serviço e da função criados no console do Function Compute.
-
Ao usar o Function Compute como serviço de backend para uma API, o API Gateway pode se conectar ao serviço de backend via rede interna?
Sim. Se você usar uma função de evento e tanto o API Gateway quanto o Function Compute estiverem na mesma região, o API Gateway usará a rede interna por padrão.