Reputation: 1774
I created a distribution in cloudfront using my files on S3. It worked fine and all my files were available. But today I updated my files on S3 and tried to access them via Cloudfront, but it still gave old files.
What am I missing ?
Upvotes: 97
Views: 82782
Reputation: 546
My Issue was: First I deployed ReactJS build with dev api URL, and then added with prod api url. At this situation, React APP was calling old dev api url and it causing an issue.
So, I get to know about the caching of AWS Cloudfront, and added * in section of invlidation under cloudfront.
By that way, I just invalidate all the files by adding * in aws Cloud front invalidation section and informed Cloudfront to not cache any of my files.
Thanks
Upvotes: 0
Reputation: 369
For CDK you can do this to create an invalidation:
new aws_s3_deployment.BucketDeployment(this, "MyBucketDeployment", {
sources: [aws_s3_deployment.Source.asset("assetFolder")],
destinationBucket: myBucket,
distribution: myCloudFrontDistribution,
distributionPaths: ["/*"],
});
Or you can just set the cache for each object in the bucket:
new aws_s3_deployment.BucketDeployment(this, "MyBucketDeployment", {
sources: [aws_s3_deployment.Source.asset("assetFolder")],
destinationBucket: myBucket,
cacheControl: [aws_s3_deployment.CacheControl.noCache()],
});
Upvotes: 1
Reputation: 21
The best practice for solving this issue is probably using the Object Version approach.
The invalidation method could solve this problem anyhow but it will bring you some side effects simultaneously. Such as cost increasing if exceeding 1000 times per month, or some object could not be deleted via this method.
Hope the official doc on "Why CloudFront is serving outdated content from Amazon" could help the poor guys.
Upvotes: 0
Reputation: 771
Invalidate all distribution files:
aws cloudfront create-invalidation --distribution-id <dist-id> --paths "/*"
If you need to remove a file from CloudFront edge caches before it expires docs
Upvotes: 1
Reputation: 10629
How to change the Cache-Control max-age via the AWS S3 Console:
Actions
dropdown, then click on Edit Metadata
Add metadata
System defined
Cache-Control
0
(or whatever you would like to set it to)Upvotes: 1
Reputation: 3154
Just ran into the same issue. At first I tried updating the cache control to be 0 and max-age=0 for the files in my S3 bucket I updated but that didn't work.
What did work was following the steps from @jpaljasma. Here's the steps with some screen shots.
First go to your AWS CloudFront service.
Then click on the CloudFront distrubition you want to invalidate.
Click on the invalidations tab then click on "Create Invalidation" which is circled in red.
In the "object path" text field, you can list the specific files ie /index.html
or just use the wildcard /*
to invalidate all. This forces cloudfront to get the latest from everything in your S3 bucket.
Once you filled in the text field click on "Invalidate", after CloudFront finishes invalidating you'll see your changes the next time you go to the web page.
Note: if you want to do it via aws command line interface you can do the following command
aws cloudfront create-invalidation --distribution-id <your distribution id> --paths "/*"
The /*
will invalidate everything, replace that with specific files if you only updated a few.
To find the list of cloud front distribution id's you can do this command aws cloudfront list-distributions
Look at these two links for more info on those 2 commands:
https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html
https://docs.aws.amazon.com/cli/latest/reference/cloudfront/list-distributions.html
Upvotes: 108
Reputation: 361
For immediate reflection of your changes, you have to invalidate objects in the Cloudfront - Distribution list -> settings -> Invalidations -> Create Invalidation.
This will clear the cache objects and load the latest ones from S3.
If you are updating only one file, you can also invalidate exactly one file.
It will just take few seconds to invalidate objects.
Distribution List -> settings -> Invalidations -> Create Invalidation
Upvotes: 10
Reputation: 825
I also faced similar issues and found out its really easy to fix in your cloudfront distribution
Step 1.
Login To your AWS account and select your target distribution as shown in the picture below
Step 2.
Select Distribution settings and select behaviour tab
Step 3.
Select
Edit
and choose option All as per the below image
Step 4.
Save your settings and that's it
Upvotes: 6
Reputation: 1176
The main advantage of using CloudFront is to get your files from a source (S3 in your case) and store it on edge servers to respond to GET requests faster. CloudFront will not go back to S3 source for each http request.
To have CloudFront serve latest fiels/objects, you have multiple options:
You can use CloudFront to invalidate one or more files or directories manually or using a trigger. This option have been described in other responses here. More information at Invalidate Multiple Objects in CloudFront. This approach comes handy if you are updating your files infrequently and do not want to impact the performance benefits of cached objects.
This is now the recommended solution. It is straight forward:
I use a combination of these two methods to make sure updates are propagated to an edge locations quickly and avoid serving outdated files managed by CloudFront.
AWS however recommends changing the object names by using a version identifier in each file name. If you are using a build command and compiling your files, that option is usually available (as in react npm build command).
Upvotes: 12
Reputation: 1011
I also had this issue and solved it by using versioning (not the same as S3 versioning). Here is a comprehensive link to using versioning with cloudfront
Invalidating Files In summary:
When you upload a new file or files to your S3 bucket, change the version, and update your links as appropriate. From the documentation the benefit of using versioning vs. invalidating (the other way to do this) is that there is no additional charge for making CloudFront refresh by version changes whereas there is with invalidation. If you have hundreds of files this may be problematic, but its possible that by adding a version to your root directory, or default root object (if applicable) it wouldn't be a problem. In my case, I have an SPA, all I have to do is change the version of my default root object (index.html to index2.html) and it instantly updates on CloudFront.
Upvotes: 3
Reputation: 1364
Please refer to this answer this may help you.
What's the difference between Cache-Control: max-age=0 and no-cache?
Adding a variable Cache-Control
to 0
in the header to the selected file in S3
Upvotes: 2
Reputation: 1612
You should invalidate your objects in CloudFront distribution cache. Back in the old days you'd have to do it 1 file at a time, now you can do it wildcard, e.g. /images/*
Upvotes: 24
Reputation: 10249
How to change the Cache-Control max-age via the AWS S3 Console:
Properties
Metadata
Key
named Cache-Control
, then click Add more metadata
. Key
to Cache-Control
set the Value
to max-age=0
(where 0 is the number of seconds you would like the file to remain in the cache). You can replace 0 with whatever you want.Upvotes: 13
Reputation: 1774
Thanks tedder42 and Chris Heald
I was able to reduce the cache duration in my origin i.e. s3 object and deliver the files more instantly then what it was by default 24 hours. for some of my other distribution I also set forward all headers to origin in which cloudfront doesn't cache anything and sends all request to origin.
thanks.
Upvotes: 2