How to cache AWS credentials in Laravel

Last time I wrote a post about how to cache AWS credentials. This time I decided to show how it can be used in Laravel.

You can create an additional adapter in your Laravel application. This time I wanted to cache AWS credentials for the S3 storage service.

Let’s create new class


Class content:


namespace App\Providers;

use Aws\Credentials\CredentialProvider;
use Aws\DoctrineCacheAdapter;
use Aws\S3\S3Client;
use Doctrine\Common\Cache\FilesystemCache;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\ServiceProvider;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\Filesystem;

class AwsS3CredentialsServiceProvider extends ServiceProvider
     * Register services.
     * @return void
    public function register()

     * Bootstrap services.
     * @return void
    public function boot()
        Storage::extend('s3cached', function ($app, $config) {

            $s3Config = $config;
            $s3Config['version'] = 'latest';

            if (! empty($config['key']) && ! empty($config['secret'])) {
                $s3Config['credentials'] = Arr::only($config, ['key', 'secret', 'token']);
            } else {
                $cache = new DoctrineCacheAdapter(new FilesystemCache('/tmp/cache'));
                $provider = CredentialProvider::defaultProvider();
                $s3Config['credentials'] = CredentialProvider::cache($provider, $cache);

            $root = $s3Config['root'] ?? null;
            $options = $config['options'] ?? [];
            $streamReads = $config['stream_reads'] ?? false;

            return new Filesystem(new AwsS3Adapter(new S3Client($s3Config), $s3Config['bucket'], $root, $options, $streamReads), $config);

The last step we need to do is to autoload the newly created class. This can be done in the config/app.php config file in the provider’s section.

'providers' => [   App\Providers\AwsS3CredentialsServiceProvider::class,

Now let’s change or create a new config in filesystem.php. I used the same s3 config and changed the driver parameter from s3 to s3cached:

's3' => [
            'driver' => 's3cached',
            'key' => env('AWS_ACCESS_KEY_ID'),

Leave a Reply

Your email address will not be published. Required fields are marked *