Amazon S3 and Cloudfront cache, how to clear cache or synchronize their cache

后端 未结 9 997
死守一世寂寞
死守一世寂寞 2021-01-30 05:59

I have a cron job that runs every 10 minutes and updates the content-type and x-amz-meta. But since yesterday it seems like after the cron job run, Amazon is not picking up the

相关标签:
9条回答
  • 2021-01-30 06:41

    Use Invalidations to clear the cache, you can put the path to the files you want to clear, or simply use wild cards to clear everything.

    http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-api

    This can also be done using the API! http://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html

    The AWS PHP SDK now has the methods but if you want to use something lighter check out this library: http://www.subchild.com/2010/09/17/amazon-cloudfront-php-invalidator/

    user3305600's solution doesn't work as setting it to zero is the equivalent of Using the Origin Cache Headers.

    0 讨论(0)
  • 2021-01-30 06:50

    If you're looking for a minimal solution that invalidates the cache, this edited version of Dr Manhattan's solution should be sufficient. Note that I'm specifying the root / directory to indicate I want the whole site refreshed.

    export AWS_ACCESS_KEY_ID=<Key>
    export AWS_SECRET_ACCESS_KEY=<Secret>
    export AWS_DEFAULT_REGION=eu-west-1
    
    echo "Invalidating cloudfrond distribution to get fresh cache"
    aws cloudfront create-invalidation --distribution-id=<distributionId> --paths / --profile=<awsprofile>
    

    Region Codes can be found here

    You'll also need to create a profile using the aws cli. Use the aws configure --profile option. Below is an example snippet from Amazon.

    $ aws configure --profile user2
    AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
    AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
    Default region name [None]: us-east-1
    Default output format [None]: text
    
    0 讨论(0)
  • 2021-01-30 06:54

    Don't use invalidations. They cannot be reverted and you will be charged. They only way it works for me is reducing the TTL and wait.

    Regards

    0 讨论(0)
  • 2021-01-30 06:54

    I believe using * invalidate the entire cache in the distribution. I am trying at the moment, I would update it further

    invalidate request screenshot

    Update:

    It worked as expected. Please note that you can invalidate the object you would like by specifying the object path.

    0 讨论(0)
  • 2021-01-30 06:55

    As to the actual code

    get your CloudFront distribution id

    aws cloudfront list-distributions

    Invalidate all files in the distribution, so CloudFront fetches fresh ones

    aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths /

    My actual full release script is

    #!/usr/bin/env bash
    
    BUCKET=mysite.com
    SOURCE_DIR=dist/
    
    export AWS_ACCESS_KEY_ID=xxxxxxxxxxx
    export AWS_SECRET_ACCESS_KEY=xxxxxxxxx
    export AWS_DEFAULT_REGION=eu-west-1
    
    
    echo "Building production"
    if npm run build:prod ; then
       echo "Build Successful"
    else
      echo "exiting.."
      exit 1
    fi
    
    
    echo "Removing all files on bucket"
    aws s3 rm s3://${BUCKET} --recursive
    
    
    echo "Attempting to upload site .."
    echo "Command:  aws s3  sync $SOURCE_DIR s3://$BUCKET/"
    aws s3  sync ${SOURCE_DIR} s3://${BUCKET}/
    echo "S3 Upload complete"
    
    echo "Invalidating cloudfrond distribution to get fresh cache"
    aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths / --profile=myawsprofile
    
    echo "Deployment complete"  
    

    References

    http://docs.aws.amazon.com/cli/latest/reference/cloudfront/get-invalidation.html

    http://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html

    0 讨论(0)
  • 2021-01-30 06:55

    S3 is not used for real time development but if you really want to test your freshly deployed website use

    http://yourdomain.com/index.html?v=2
    http://yourdomain.com/init.js?v=2
    

    Adding a version parameter in the end will stop using the cached version of the file and the browser will get a fresh copy of the file from the server bucket

    0 讨论(0)
提交回复
热议问题