Tutorial: Crie uma API REST como um proxy do Amazon S3
Como exemplo para mostrar o uso de uma API REST no API Gateway para o proxy do Amazon S3, esta seção descreve como criar e configurar uma API REST para expor as seguintes operações do Amazon S3:
-
Expor GET no recurso raiz da API para listar todos os buckets do Amazon S3 de um autor da chamada.
-
Expor GET em um recurso Folder para visualizar uma lista de todos os objetos no bucket do Amazon S3.
-
Expor GET em um recurso Folder/Item para visualizar ou baixar um objeto de um bucket do Amazon S3.
É recomendável importar a API de exemplo como um proxy do Amazon S3, conforme mostrado em Definições do OpenAPI da API de amostra como um proxy do Amazon S3. Este exemplo contém mais métodos expostos. Para obter instruções sobre como importar uma API usando a definição do OpenAPI, consulte Desenvolver APIs REST usando OpenAPI no API Gateway.
nota
Para integrar sua API do API Gateway ao Amazon S3, é necessário escolher uma região onde os serviços API Gateway e Amazon S3 estejam disponíveis. Para obter a disponibilidade da região, consulte Endpoints e cotas do Amazon API Gateway.
Tópicos
- Configurar permissões do IAM para a API invocar ações do Amazon S3
- Criar recursos de API para representar recursos do Amazon S3
- Expor um método de API para listar os buckets do Amazon S3 do autor da chamada
- Expor métodos de API para acessar um bucket do Amazon S3
- Expor métodos de API para acessar um objeto do Amazon S3 em um bucket
- Definições do OpenAPI da API de amostra como um proxy do Amazon S3
- Chamar a API usando um cliente de API REST
Configurar permissões do IAM para a API invocar ações do Amazon S3
Para permitir que a API invoque ações do Amazon S3, é necessário que as políticas do IAM apropriadas sejam associadas a um perfil do IAM.
Como criar o perfil de execução do proxy de serviço da AWS
Faça login no AWS Management Console e abra o console do IAM em https://console.aws.amazon.com/iam/
. -
Escolha Funções.
-
Selecione Criar função.
-
Selecione Serviço da AWS em Selecionar tipo de entidade confiável, selecione API Gateway e Permite que o API Gateway envie logs ao CloudWatch Logs.
-
Selecione Próximo e, depois, Próximo.
-
Em Role name (Nome da função), digite
APIGatewayS3ProxyPolicy
e escolha Create role (Criar função). -
Na lista Roles (Funções), escolha a função que você acaba de criar. Talvez seja necessário rolar a página ou usar a barra de pesquisa para encontrar o perfil.
-
Para a função escolhida, selecione a guia Adicionar permissões.
-
Selecione Anexar políticas na lista suspensa.
-
Na barra de pesquisa, insira
AmazonS3FullAccess
e escolha Adicionar permissões.nota
Este tutorial usa uma política gerenciada em prol da simplicidade. Como prática recomendada, você deve criar sua própria política do IAM para conceder as permissões mínimas necessárias.
-
Anote o ARN do perfil recém-criado, você o usará posteriormente.
Criar recursos de API para representar recursos do Amazon S3
Use o recurso-raiz da API (/
) como o contêiner de buckets do Amazon S3 de um chamador autenticado. Também crie recursos Folder
e Item
para representar um bucket do Amazon S3 específico e um determinado objeto do Amazon S3, respectivamente. O nome da pasta e a chave do objeto serão especificados, no formato de parâmetros de caminho como parte de uma URL de solicitação, pelo autor da chamada.
nota
Ao acessar objetos cuja chave de objeto inclua /
ou qualquer outro caractere especial, o caractere deverá ser codificado por URL. Por exemplo, test/test.txt
deve ser codificado para test%2Ftest.txt
.
Como criar um recurso de API que expõe os recursos de serviços do Amazon S3
-
Na mesma em Região da AWS onde você criou o bucket do Amazon S3, crie uma API chamada MyS3. O recurso raiz dessa API (/) representa o serviço Amazon S3. Nesta etapa, você vai criar dois recursos adicionais/{folder} e/{item}.
-
Selecione Criar recurso.
Mantenha Recurso proxy desativado.
Em Caminho do recurso, selecione
/
.Em Resource Name (Nome do recurso), insira
{folder}
.Mantenha CORS (Compartilhamento de recursos de origem cruzada) desmarcado.
Selecione Criar recurso.
Selecione o recurso /{folder} e, depois, Criar recurso.
Use as etapas anteriores para criar um recurso secundário de /{folder} chamado
{item}
.A API final deverá ser semelhante à seguinte:
Expor um método de API para listar os buckets do Amazon S3 do autor da chamada
Obter a lista de buckets do Amazon S3 do autor da chamada envolve invocar a ação GET Service no Amazon S3. No recurso raiz do API, (/), crie o método GET. Configure o método GET para integrar-se ao Amazon S3 da maneira a seguir.
Para criar e inicializar o método GET /
da API
-
Selecione o recurso / e Criar método.
Em tipo de método, selecione GET.
Em Tipo de integração, selecione AWS service (Serviço da AWS).
Para Região da AWS, selecione a Região da AWS onde você criou o bucket do Amazon S3.
Em AWS service (Serviço da AWS), selecione Amazon Simple Storage Service.
Mantenha o subdomínio da AWS em branco.
Em Método HTTP, selecione GET.
Em Tipo de ação, escolha Usar substituição de caminho.
Com a substituição de caminho, o API Gateway encaminha a solicitação do cliente para o Amazon S3 como a solicitação no estilo de caminho da API REST do Amazon S3 correspondente em que um recurso do Amazon S3 é expresso pelo caminho de recurso do padrão
s3-host-name/bucket/key
. O API Gateway define os3-host-name
e transmite obucket
especificado pelo cliente ekey
do cliente para o Amazon S3.Em Substituição de caminho, digite /.
Em Perfil de execução, digite o ARN do perfil para
APIGatewayS3ProxyPolicy
.Escolha Configurações de solicitação de método.
Use as configurações de solicitação de método para controlar quem pode chamar esse método da sua API.
-
Em Autorização, no menu suspenso, selecione
AWS_IAM
. Escolha Criar método.
Essa configuração integra a solicitação GET
https://
do front-end com o your-api-host
/stage
/GET https://
do backend.your-s3-host
/
Para que a API retorne respostas bem-sucedidas e exceções corretamente ao chamador, declare as respostas 200, 400 e 500 em Resposta de método. Use o mapeamento padrão para respostas 200 para que as respostas do back-end do código de status não declaradas aqui sejam retornadas ao chamador como respostas 200.
Como declarar tipos de resposta para o método GET /
-
Na guia Resposta de método, em Resposta 200, selecione Editar.
-
Selecione Adicionar usuário e faça o seguinte:
Em Nome do cabeçalho, insira
Content-Type
.Escolha Add header (Adicionar cabeçalho).
Repita essas etapas para criar um cabeçalho
Timestamp
e umContent-Length
. Escolha Salvar.
Na guia Resposta de método, em Respostas do método, selecione Criar resposta.
Para o código de status HTTP, insira 400.
Você não vai definir nenhum cabeçalho para essa resposta.
Escolha Salvar.
Repita as etapas a seguir para criar a resposta 500.
Você não vai definir nenhum cabeçalho para essa resposta.
Como a resposta de integração bem-sucedida do Amazon S3 retorna a lista de buckets como uma carga útil XML, e a resposta de método padrão do API Gateway retorna uma carga útil JSON, você deve mapear o valor do parâmetro do cabeçalho Content-Type do back-end para sua contraparte do front-end. Caso contrário, o cliente receberá application/json
para o tipo de conteúdo quando o corpo da resposta é na verdade uma string XML. O procedimento a seguir mostra como configurar isso. Além disso, mostre também para o cliente outros parâmetros de cabeçalho, como Date e Content-Length.
Para configurar mapeamentos de cabeçalho de resposta para o método GET /
-
Na guia Resposta de integração, em Padrão - Resposta, selecione Editar.
Para o cabeçalho Content-Length, insira
integration.response.header.Content-Length
para o valor do mapeamento.Para o cabeçalho Content-Type, insira
integration.response.header.Content-Type
para o valor do mapeamento.Para o cabeçalho Carimbo de data e hora, insira
integration.response.header.Date
para o valor do mapeamento.Escolha Salvar. O resultado deve ser semelhante ao seguinte:
-
Na guia Resposta de integração, em Respostas de integração, selecione Criar resposta.
Em HTTP status regex (Regex de status HTTP), insira
4\d{2}
. Isso associa todos os códigos de status de resposta HTTP 4xx à resposta do método.Em Código de status de resposta do método, selecione
400
.Escolha Criar.
Repita as etapas a seguir para criar uma resposta de integração para a resposta do método 500. Em HTTP status regex (Regex de status HTTP), insira
5\d{2}
.
Como prática recomendada, teste a API que você configurou até agora.
Como testar o método GET /
-
Selecione a guia Testar. Talvez seja necessário selecionar o botão de seta para a direita para mostrar a guia.
-
Escolha Testar. O resultado deve ser algo semelhante à seguinte imagem:
Expor métodos de API para acessar um bucket do Amazon S3
Para trabalhar com um bucket do Amazon S3, exponha o método GET
no recurso /{folder} para listar objetos em um bucket. As instruções são semelhantes às descritas em Expor um método de API para listar os buckets do Amazon S3 do autor da chamada. Para conhecer mais métodos, é possível importar a API de exemplo aqui, Definições do OpenAPI da API de amostra como um proxy do Amazon S3.
Como expor o método GET em um recurso de pasta
Selecione o recurso /{folder} e, depois, Criar método.
Em tipo de método, selecione GET.
Em Tipo de integração, selecione AWS service (Serviço da AWS).
Para Região da AWS, selecione a Região da AWS onde você criou o bucket do Amazon S3.
Em AWS service (Serviço da AWS), selecione Amazon Simple Storage Service.
Mantenha o subdomínio da AWS em branco.
Em Método HTTP, selecione GET.
Em Tipo de ação, escolha Usar substituição de caminho.
Em Substituição de caminho, digite
{bucket}
.Em Perfil de execução, digite o ARN do perfil para
APIGatewayS3ProxyPolicy
.Escolha Criar método.
Você vai definir os parâmetros de caminho {folder}
no URL do endpoint do Amazon S3. É necessário associar o parâmetro de caminho {folder}
da solicitação de método ao parâmetro de caminho {bucket}
da solicitação de integração.
Como associar {folder}
a {bucket}
-
Na guia Solicitação de integração, em Configurações de solicitação de integração, selecione Editar.
Selecione Parâmetros de caminho de URL e, depois, Adicionar parâmetro de caminho.
Em Nome, digite
bucket
.-
Em Mapeado de, insira
method.request.path.folder
. Escolha Salvar.
Agora, você vai testar a API.
Como testar o método /{folder} GET
.
-
Selecione a guia Testar. Talvez seja necessário selecionar o botão de seta para a direita para mostrar a guia.
-
Em Caminho, em pasta, insira o nome do bucket.
-
Escolha Testar.
O resultado do teste conterá uma lista de objetos no bucket.
Expor métodos de API para acessar um objeto do Amazon S3 em um bucket
O Amazon S3 oferece suporte a ações GET, DELETE, HEAD, OPTIONS, POST e PUT para acessar e gerenciar objetos em um determinado bucket. Neste tutorial, você vai expor um método GET
no recurso {folder}/{item}
para obter uma imagem de um bucket. Para conhecer mais aplicações do recurso {folder}/{item}
, consulte a API de exemplo, Definições do OpenAPI da API de amostra como um proxy do Amazon S3.
Como expor o método GET em um recurso de item
-
Selecione o recurso /{item} e, depois, Criar método.
-
Em tipo de método, selecione GET.
-
Em Tipo de integração, selecione AWS service (Serviço da AWS).
-
Para Região da AWS, selecione a Região da AWS onde você criou o bucket do Amazon S3.
-
Em AWS service (Serviço da AWS), selecione Amazon Simple Storage Service.
-
Mantenha o subdomínio da AWS em branco.
-
Em Método HTTP, selecione GET.
-
Em Tipo de ação, escolha Usar substituição de caminho.
-
Em Substituição de caminho, insira {bucket}/{object}.
-
Em Perfil de execução, digite o ARN do perfil para
APIGatewayS3ProxyPolicy
. -
Escolha Criar método.
Você vai definir os parâmetros de caminho {folder}
e o {item}
no URL do endpoint do Amazon S3. É necessário associar o parâmetro de caminho da solicitação de método ao parâmetro de caminho da solicitação de integração.
Nesta etapa, faça o seguinte:
-
Mapeie o parâmetro de caminho
{folder}
da solicitação de método ao parâmetro de caminho{bucket}
da solicitação de integração. Mapeie o parâmetro de caminho
{item}
da solicitação de método ao parâmetro de caminho{object}
da solicitação de integração.
Como associar {folder}
a {bucket}
e {item}
a {object}
-
Na guia Solicitação de integração, em Configurações de solicitação de integração, selecione Editar.
-
Selecione Parâmetros de caminho de URL.
-
Selecione Adicionar parâmetro de caminho.
-
Em Nome, digite
bucket
. -
Em Mapeado de, insira
method.request.path.folder
. -
Selecione Adicionar parâmetro de caminho.
-
Em Nome, digite
object
. -
Em Mapeado de, insira
method.request.path.item
. -
Escolha Salvar.
Como testar o método /{folder}/{object} GET
.
-
Selecione a guia Testar. Talvez seja necessário selecionar o botão de seta para a direita para mostrar a guia.
-
Em Caminho, em pasta, insira o nome do bucket.
-
Em Caminho, em item, insira o nome de um item.
-
Escolha Testar.
O corpo da resposta incluirá o conteúdo do item.
A solicitação exibe corretamente o texto sem formatação (“Hello world”) como o conteúdo do arquivo especificado (test.txt) no bucket do Amazon S3 especificado (amzn-s3-demo-bucket).
Para fazer download ou upload de arquivos binários, que no API Gateway é qualquer conteúdo que não seja JSON codificado em utf-8, são necessárias configurações de API adicionais. Isto é descrito da seguinte forma:
Para fazer download ou upload de arquivos binários do S3
-
Registre os tipos de mídia do arquivo afetado para binaryMediaTypes da API. Você pode fazer isso no console:
-
Selecione Configurações para a API.
-
Em Tipos de mídia binária, selecione Adicionar tipo de mídia binária.
-
Selecione Adicionar tipo de mídia binária e insira o tipo de mídia necessário, por exemplo,
image/png
. -
Selecione Save changes (Salvar alterações) para salvar a configuração.
-
-
Adicione o cabeçalho
Content-Type
(para upload) e/ouAccept
(para download) à solicitação de método para exigir que o cliente especifique o tipo de mídia binário necessário e o mapeie para a solicitação de integração. -
Defina Tratamento de conteúdo como
Passthrough
na solicitação de integração (para upload) e em uma resposta de integração (para download). Certifique-se de que nenhum modelo de mapeamento está definido para o tipo de conteúdo afetado. Para obter mais informações, consulte Comportamentos de passagem direta de integração e Selecionar um modelo de mapeamento VTL.
O tamanho máximo da carga é 10 MB. Consulte Cotas do API Gateway para configurar e executar uma API REST.
Certifique-se de que os arquivos no Amazon S3 tenham os tipos de conteúdo corretos adicionados como metadados de arquivos. Para a transmissão de conteúdo de mídia, talvez também seja necessário adicionar Content-Disposition:inline
aos metadados.
Para obter mais informações sobre o suporte binário no API Gateway, consulte Conversões de tipo de conteúdo no API Gateway.