Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon How can I use CloudFront to serve AWS S3 bucket contents securely in Laravel


How can I use CloudFront to serve AWS S3 bucket contents securely in Laravel


To use CloudFront to serve AWS S3 bucket contents securely in Laravel, follow these steps:

Step 1: Set Up CloudFront Distribution

1. Create a CloudFront Distribution:
- Go to the AWS Management Console and navigate to the CloudFront dashboard.
- Click on "Create Distribution" and select "Web" as the distribution type.
- Configure the distribution with the following settings:
- Origin Domain Name: Select the S3 bucket you want to serve.
- Restrict Bucket Access: Set this to "Yes" to restrict access to S3 only from CloudFront.
- Origin Access Identity: If you're creating your first CloudFront Distribution, choose "Create a New Identity." If you've already created an "origin access identity," you can select it from "Use an Existing Identity."
- Grant Read Permissions on Bucket: Set this to "Yes" and choose "Update Bucket Policy." This will automatically add a policy setting to S3's Bucket Policy.

Step 2: Configure S3 Bucket Policy

2. Update S3 Bucket Policy:
- Go to the S3 dashboard and select the bucket you want to serve.
- Click on "Permissions" and then "Bucket Policy."
- Update the bucket policy to allow CloudFront to access the bucket. The policy should include the following:

json
     {
         "Version": "2012-10-17",
         "Statement": [
             {
                 "Effect": "Allow",
                 "Principal": "cloudfront.amazonaws.com",
                 "Action": "s3:GetObject",
                 "Resource": "arn:aws:s3:::your-bucket-name/*"
             }
         ]
     }
     

Step 3: Configure Laravel to Use CloudFront

3. Configure Laravel to Use CloudFront:
- In your Laravel project's `config/filesystems.php` file, update the `s3` disk to use CloudFront:

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'),
         'url' => env('AWS_URL'),
         'endpoint' => env('AWS_ENDPOINT'),
         'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
         'cloudfront' => env('CLOUDFRONT_ENDPOINT'),
     ],
     

Step 4: Use CloudFront URLs in Laravel

4. Use CloudFront URLs in Laravel:
- In your Laravel application, use the `Storage::url()` method to generate CloudFront URLs for your files:

php
     $url = Storage::url('path/to/file.jpg');
     

Example Code

Here is an example of how to use CloudFront to serve AWS S3 bucket contents securely in Laravel:

php
// Define the model
class Post extends Model
{
    use HasMedia;
}

// Upload media
$file = $request->file('file');
$media = MediaUploader::fromFile($file)->upload();

// Attach media to the model
$post = Post::first();
$post->addMedia($media)->toMediaCollection('images', 's3');

// Get the CloudFront URL
$url = Storage::url('path/to/file.jpg');

Troubleshooting

- Error Handling:
- Ensure that the AWS S3 adapter is correctly installed and configured.
- Verify that the environment variables are correctly set in the `.env` file.

By following these steps, you can securely integrate your Laravel application with AWS S3 and CloudFront, ensuring that your users' files are stored and accessed in a secure manner.

Citations:
[1] https://laracasts.com/discuss/channels/laravel/handle-s3-urls-configured-with-cloudfront
[2] https://stackoverflow.com/questions/39392114/laravel-and-aws-cloudfront
[3] https://laraveldiary.com/posts/serving-images-with-cloudfront-s3
[4] https://nestcode.co/en/blog/laravel-to-store-your-files-to-amazon-simple-storage-aws-s3
[5] https://www.honeybadger.io/blog/laravel-s3/