Laravel e Amazon S3
Published: 2020-03-13 01:02:41

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](https://laracasts.com/discuss/channels/laravel/amazon-s3-upload-acl/replies/355774)

* 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/*"
            ]
        }
    ]
}
```
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/*"]
    }
  ]
}
```
## 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](https://docs.aws.amazon.com/general/latest/gr/rande.html):
```
AWS_ACCESS_KEY_ID=your_key_here
AWS_SECRET_ACCESS_KEY=your_secret_here
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=my-bucket
```
* 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](https://laravel.com/docs/5.5/filesystem) 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:
```php
$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');

```
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)
```