AWS S3 TALL Stack

Installare l’adapter sul progetto con composer require league/flysystem-aws-s3-v3 "^3.0".

Creare un bucket (https://s3.console.aws.amazon.com/) assegnando un nome (es. nomeprogetto-bucket) e una regione (es. eu-central-1) e lasciando le impostazioni di default.

Creare un utente IAM (https://console.aws.amazon.com/iamv2/home#/users):

  • Selezionare “Chiave di accesso – Accesso programmatico
  • Selezionare “Collega direttamente le policy esistenti
  • Cercare “S3FullAccess
  • Confermare e salvare Access Key e Secret Key

Configurare il file .env:

AWS_ACCESS_KEY_ID=Access Key dell'utente IAM creato
AWS_SECRET_ACCESS_KEY=Secret Key dell'utente IAM creato
AWS_BUCKET=nome bucket (es. nomeprogetto-bucket)
AWS_DEFAULT_REGION=codice regione (es. eu-central-1)
AWS_ENDPOINT=https://s3.eu-central-1.amazonaws.com // non lasciare vuoto
AWS_URL=https://nomeprogetto-bucket.eu-central-1.amazonaws.com // non lasciare vuoto
AWS_USE_PATH_STYLE_ENDPOINT=false // non lasciare vuoto

e il file config/filesystems.php:

's3' => [
 'driver' => 's3',
         'key' => env('AWS_ACCESS_KEY_ID'),
         'secret' => env('AWS_SECRET_ACCESS_KEY'),
         'region' => env('AWS_DEFAULT_REGION'),
         'bucket' => env('AWS_BUCKET'),
         'endpoint' => env('AWS_ENDPOINT'),
         'url' => env('AWS_URL'),
         'root' => 'path/to/root' // opzionale
],

Riferimento: Laravel Daily

Per adattare la configurazione allo stack TALL, bisogna aggiungere una CORS Policy al bucket, come spiegato in questo articolo di Tall Stack Tips.

Per farlo, bisogna accedere al bucket da AWS Console e cercare nella sezione Condivisione delle risorse multiorigine (CORS) in Autorizzazioni e inserire questa configurazione (che nell’articolo di Tall Stack Tips é in XML invece che JSON):

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "https://website.url" // oppure "*" per testare in locale
        ],
        "ExposeHeaders": []
    }
]

Eseguire il comando php artisan livewire:configure-s3-upload-cleanup per impostare la pulizia periodica della cartella di upload temporanea di Livewire.


Abilitare la lettura pubblica dei contenuti

Accedere al bucket da AWS Console e, nella sezione Blocco dell’accesso pubblico (impostazioni del bucket) in Autorizzazioni, disabilitare “Blocca tutti gli accessi pubblici“.

Quindi, inserire nella sezione Policy del bucket in Autorizzazioni la seguente policy:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowPublicRead",
            "Effect": "Allow",
            "Principal": {
                "AWS": "*"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::nome-bucket/*"
        }
    ]
}
Quando si carica un file su s3 non si deve specificare il parametro visibility='public' nel metodo store.

Abilitare ACL

Accedere al bucket da AWS Console e, nella sezione Proprietà dell’oggetto in Autorizzazioni, scegliere ACL abilitate insieme a Proprietario del bucket preferito.

Con questa configurazione, quando si carica un file su s3 si può specificare il parametro visibility='public' nel metodo store, come fa Jetstream se si usa la funzionalità profilePhotos.

Per far funzionare il plugin di SpatieMediaLibrary con Filament, bisogna modificare il file di configurazione media-library.php inserendo:

'extra_headers' => [
      'CacheControl' => 'no-cache',
],