DEV Community

Alexandre Freire
Alexandre Freire

Posted on

Laravel e Amazon S3

Precisa fazer upload de imagens para sua instância do S3 usando o Laravel? Felizmente, o Laravel simplifica a configuração de uma conexão e o upload para a nuvem.

Vou presumir que você tenha um conhecimento muito básico da AWS, tenha uma conta ativa na Amazon. Se você ainda não o fez, recomendo inscrever-me no teste gratuito de 1 ano, é um negócio maluco.

O caminho da AWS

Vamos criar um bucket do S3, adicionar as políticas adequadas e associar um usuário do IAM a ele. Usaremos o Laravel para nos conectarmos ao bucket do S3 por meio das credenciais do usuário do IAM (e é por isso que eles precisam de políticas de permissão própria ou de políticas).

Desafio do Bucket

A primeira etapa é fazer login na sua conta da AWS como usuário root. Em seguida, navegue até a seção S3 do site.

Clique no botão azul “+ Criar Bucket”.
Insira um slug exclusivo para o seu bucket do S3, selecione uma região para o servidor e clique em next.
Deixe as configurações padrão aqui, certifique-se de “Gerenciar público
Clique review.
Parabéns, você tem um novo Bucket S3. Agora vamos atribuir um usuário do IAM ao bucket.

Hora do IAM

Temos que criar um novo usuário (ou você pode usar um existente) e adicionar uma política de bucket que permite ao usuário do seu IAM fazer upload para o S3

  • Crie um novo usuário e salve seu id e segredo de acesso.
  • Aplique uma nova política ao usuário abaixo, substituindo “my-bucket” pelo seu bucket anterior:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListAllMyBuckets",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl", 
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
Enter fullscreen mode Exit fullscreen mode

Se você ainda tiver um “acesso negado” ao visualizar arquivos, tente adicionar o seguinte snippet às suas políticas nas Perguntas frequentes da Amazon:

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Sid":"AddPerm",
      "Effect":"Allow",
      "Action":["s3:GetObject"],
      "Resource":["arn:aws:s3:::examplebucket/*"]
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Conecte-se com o Laravel

Agora que conseguimos criar um bloco e atribuir um usuário a ele, vamos adicionar as credenciais ao Laravel para que ele possa se conectar!

  • Abra seu .ENV file arquivo e adicione as seguintes variáveis ​​se elas não existirem. Certifique-se de adicionar suas credenciais, bucket name, and the bucket’s region code:
AWS_ACCESS_KEY_ID=your_key_here
AWS_SECRET_ACCESS_KEY=your_secret_here
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=my-bucket
Enter fullscreen mode Exit fullscreen mode
  • Vá para o seu arquivo de configuração do Filesystem (/laravel-project/config/filesystems.php)e verifique se você está usando variáveis ​​de ambiente. A matriz de discos S3 array deve parecer isto:'s3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY'), 'region' => env('AWS_DEFAULT_REGION'), 'bucket' => env('AWS_BUCKET'), ]

É isso aí! Você conectou o Laravel ao seu bucket S3. Fácil certo?

Flex My S3

Vamos testar para ver se tudo deu certo! Você pode ver os documentos oficiais do Laravel para obter mais informações sobre o uso de sistemas de arquivos, mas você pode executar um teste rápido usando o seguinte fragmento em um controlador:

$my_file = 'file.txt';
$handle = fopen($my_file, 'w') or die('Cannot open file:  '.$my_file);
$data = 'Test data to see if this works!';
fwrite($handle, $data);

$storagePath = Storage::disk('s3')->put("uploads", $my_file, 'public');

Enter fullscreen mode Exit fullscreen mode

Criamos um arquivo de texto, inserimos texto nele e carregamos esse arquivo de texto para o armazenamento do S3. Há também um terceiro parâmetro no putmethod definido como public, o que torna o arquivo acessível publicamente. Você pode remover isso para tornar o arquivo privado.

O caminho para o arquivo no S3 é o armazenamento no $storagePath variável, para que você possa armazenar isso em seu banco de dados e encontrar posts usando

Storage::disk('s3')->get($storagePath)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)