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:
Em seguida localize a opção criar bucket:
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.
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.
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
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
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.
Em seguida cliquem em Usuários na lateral superior esquerda e em seguida clique no botão Adicionar usuário
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”.
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.
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.
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:
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:
Veja que agora foram apresentadas algumas opções clique no botão Abrir
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:
- response-content-disposition=inline
- X-Amz-Security-Token
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.
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:
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:
Agora ao acessar novamente o arquivo e retirar da url o parâmetro X-Amz-Security-Token o mesmo irá abrir normalmente:
E ai o que achou ? comente abaixo.