paulo-dutra logo

Salvando arquivos na AWS S3 via API no Laravel 6

Fala galera, no post anterior foi apresentada uma forma de realizar upload de arquivos base64 via API utilizando o Laravel 6. Neste post iremos apresentar uma forma de utilizar o serviço S3 da AWS como storage de arquivos, ou seja ao invés de enviar o arquivo para a pasta da aplicação, iremos enviar para um bucket na S3.

Iremos utilizar o projeto que fizemos no post anterior como base, para isso execute os seguintes comandos:

Os comandos executados acima executaram as seguintes atividades: clone do projeto, renomeação de pasta, copia do arquivo de configuração e geração da chave APP_KEY da aplicação.

Antes de prosseguirmos com as configurações necessárias, é interessante comentar que além de armazenar arquivos localmente ou na S3, também é possível utilizar outras opções tais como: ftp e sftp, para maiores informações veja sobre file storage na documentação

Após realizar a configuração do projeto, precisamos instalar dois pacotes, um deles é o SDK AWS e o outro é um da The League PHP, para isso iremos abrir o arquivo composer.json da aplicação e dentro do objeto require, iremos acrescentar as seguintes dependências:

Agora será necessário instalar as dependências para isso vá até o terminal/CMD e execute: composer update

Configurando bucket S3

Realizados os passos acima, vamos partir para a criação do bucket(espaço destinado ao armazenamento de arquivos na AWS). Efetue login no console e em seguinte busque por s3, conforme feito na imagem abaixo:

pesquisa-s3-console-aws

Em seguida localize a opção criar bucket:

tela-criar-bucket-s3

Preencha o formulário com o nome do bucket e a escolha da região de uso do serviço e logo em seguida clique em criar. Neste caso optei pelo nome: aws-s3-files e a região: Oeste dos EUA (Oregon).

OBS: a escolha do nome do bucket passa por uma validação, não podendo terminar com ponto e traço e também uma validação do nome em si do mesmo. Durante o processo de criação do bucket pulei alguns passos de configurações.

nome-e-regiao-bucket

Veja que o bucket foi criado e nas informações de acesso esta indicando que o “Bucket e objetos não públicos”, em outro passo iremos mudar essa configuração para poder acessar o arquivo após o envio.

s3-bucket-nao-publico-criado

Clique no nome do bucket para que seja apresentado os arquivos do mesmo e as opções de configurações.

Logo em seguida clique em Permissões e depois em Editar e desmarque a opção “Bloquear todo o acesso público” e depois clique em salvar

permissao-publica-bucket

Em seguida será apresentada uma tela de confirmação de edição de configurações de “Bloquear acesso público (configurações de bucket), execute os passos pedidos. No meu caso foi indicado digitar a palavra confirmar e logo em seguida clicar no botão confirmar

confirmar-permissao-bucket-s3

Realizadas essas configurações, iremos criar um usuário com a permissão de gerenciamento full de objetos S3.

OBS: Você pode utilizar um usuário existente que possua a permissão “AmazonS3FullAccess”.

Configurando usuário no serviço IAM

Clique em serviços no canto superior esquerdo ao lado da logo e digite iam na barra de pesquisa. No meu caso a opção também foi apresentada na barra de histórico na lateral, após encontrar apresentar o resultado da busca clique na mesma.

iam-criar-usuario-bucket

Em seguida cliquem em Usuários na lateral superior esquerda e em seguida clique no botão Adicionar usuário

usuarios-iam

Preencha a primeira etapa defindo o Nome de usuário e o Tipo de acesso, escolhi o nome de usuário “s3-user” e no caso do tipo de acesso deve ser escolhido a opção “Acesso programático” para poder utilizar o serviço e em seguida clique no botão “Próximo Permissões”.

usuario-tipo-de-acesso-iam

OBS: Caso escolha apenas a opção “Acesso programático” este usuário não irá efetua login no console AWS.

Agora na etapa definir permissões clique no botão “Anexar póliticas existentes de forma direta” e localize a permissão “AmazonS3FullAccess”, selecione a mesma e em seguida avançe as etapas 3 e 4.

permissao-s3-usuario-iam

Será apresentadas as seguintes informações ID da chave de acesso e Chave de acesso secreta (clicar em exibir para visualizar) na tela e também a opção Fazer download .csv.

download-chaves-de-acesso-usuario-iam

Configurações finais do projeto e teste de envio

Baixe o arquivo .csv e em seguida volte ao projeto. Abra o arquivo .env e adicione as seguintes configurações:

Em seguida abra o terminal/CMD e execute o seguinte comando: php artisan serve

Abra Postman ou outro Cliente HTTP devidamente instalado e realize uma requisição POST para o seguinte endereço: localhost:8000/api/send-file, com o seguinte corpo em formato JSON:

enviando-arquivo

Após realizar a requisição e a mesma tiver sido bem sucedida, veja o valor de file dentro do response. Vá até o console AWS novamente, selecione o serviço S3, note que as pastas public/base64-files foi criada e que dentro delas irá estar um arquivo de mesmo nome e formato retornado na resposta da API.

Clique no nome do arquivo para exibir mais opções:

arquivo-no-bucket-s3

Veja que agora foram apresentadas algumas opções clique no botão Abrir

abrir-arquivo-bucket

O arquivo irá ser aberto em outra aba do browser, note que na url esta sendo passado dois parâmetros depois do nome do arquivo:

abrir-arquivo-bucket-com-permissao

O response-content-disposition se trata de como será exibido o arquivo (como uma página web, como parte de uma página web, ou como arquivo para download).

X-Amz-Security-Token é um token de autorização que é adicionado na requisição, esse token pode ser configurado via SDK também, onde pode ser determinado o tempo de duração.

Caso seja retirado o parâmetro X-Amz-Security-Token da url você irá notar que será retornada uma resposta no formato XML com o code InvalidRequest, isso significa que esse objeto(arquivo) do bucket não esta público.

abrir-arquivo-bucket-sem-permissao

Para acessar os arquivos sem informar o X-Amz-Security-Token iremos ter que deixar o bucket publico para isso retorne ao console AWS, selecione novamente o serviço S3, localize o bucket e em seguida clique em Permissões e depois em Política de bucket, será aberto editor, coloque as seguintes diretivas em formato JSON:

politica-do-bucket-permissao-publica

OBS: altere a o termo nome-do-bucket.

Após ter inserido a política do bucket clique em Salvar, note que agora esta sendo apresentado avisos falando que o bucket é público:

aviso-bucket-publico

Agora ao acessar novamente o arquivo e retirar da url o parâmetro X-Amz-Security-Token o mesmo irá abrir normalmente:

abrindo-arquivo-de-forma-publica

Reposítório do Projeto

E ai o que achou ? comente abaixo.