S3 Transfer Acceleration Semantics - amazon-web-services

I have a rather simple question which I cannot find an explicit answer to, but anyone using the subject should be able to answer.
Does S3 Transfer Acceleration follow an eventual model i.e. clients upload to a CF edge location, get the response back and then the data is eventually moved to a bucket OR is the performance (speed) gain is simply because of the AWS internal network usage and upon the request completion the data is always 100% IN the S3 bucket?
If it's the former is there any SLA regarding how fast this eventual process is?

S3 Transfer Acceleration uses CloudFront and CloudFront doesn't cache POST/PUT request which means the data gets uploaded to the S3 at the same time. CloudFront doesn't buffer it, it simply saves your RTT (round trip time) by letting you connect to the nearest edge location compare to when you connect to S3 endpoint situated far from you.
And, since transfer between CloudFront and S3 is in AWS Network, it should be faster.
(buffer in the sense you can consider Acceleration endpoint as proxy).

S3 Transfer Acceleration uses portions of the CloudFront infrastructure to provide low-latency, performance-optimized connectivity from browser to edge to bucket.
It does not use any storage or caching components of CloudFront.
The acceleration is only TLS and transport (buffer and routing) related; all HTTP interactions are ultimately end-to-end with the actual S3 bucket, with CloudFront edge servers providing termination for the browser-facing TLS session and a reverse-proxy function.
Nothing stored outside the bucket, so S3's standard consistency model applies.

Related

Use Amazon CloudFront together with Amazon S3 Transfer Acceleration?

I read this and understand the difference between CloudFront and S3 Transfer Acceleration. Since both can improve the download speed(though S3 Transfer Acceleration is mainly for uploading, it also improving download), can I use them together? Based on my test, it seems to be impossible as CloudFront will always take the S3 bucket URL like xxx.s3.amazonaws.com/ as the source. It cannot take xxx.s3-accelerate.amazonaws.com as the source.
Amazon CloudFront caches content in 225+ Points of Presence.
The first user who requests a piece of content in a particular location will trigger the edge location to 'pull' the content from the origin. Future requests for that content will be served from the cache. It is an excellent way to reduce latency for users spread around the world.
Amazon S3 Transfer Acceleration always makes a request back to the source bucket. This is good for uploading, but does not reduce latency for users spread around the world since all of their requests would need to go to the source bucket.
You might be able to have CloudFront in front of S3 Transfer Acceleration, but CloudFront uses the AWS network to reach origin buckets, so it is unlikely to make any difference. If you do experiment with this, let us know your findings!

Amazon S3 as cdn copying images from my server

I have searched a lot on this but all I get is using CloudFront (CDN) in collaboration with S3.
I want to do something different.
CloudFront works as a CDN with its Origin set to either my domain where images are, or S3.
If I set it to my domain, there is an issue of having my hosting space used.
If I use it with S3, the question is, how to get my images to S3 without much hassle? In case of CDN, this is automatic, as every call to CloudFront copies the image from my server automatically.
Is it possible that CloudFront works with S3 but if image is not present on S3, it copies it from my server to S3?
Or may be S3 itself works as CDN (best solution). I have seen on some sites that they use s3 urls for hosting their images, like this:
https://retsimages.s3.amazonaws.com/14/A10363214_6.jpg
How is that possible?
If I set it to my domain, there is an issue of having my hosting space used.
More expensive than the storage space is the cost of having a server sitting there ready to handle the request. Your application logic konws when the images change; that's the time to put them in S3.
how to get my images to S3 without much hassle?
There's an SDK for just about every language, so upload the image as it comes in. Use s3cmd sync to move the images you have. Then you can just turn off your server.
Or may be S3 itself works as CDN
CloudFront can use a customer provided dns name and matching certificate so that you can use a custom domain with https. It can integrate into AWS WAF which S3 cannot directly. Otherwise, CDN behaves similarly to s3. CloudFront should provide better caching and endpoint locality, but you'll see little functional difference at low volumes. Neither is read-after-write consistent, but Cloudfront caches additionally. Pricing is unlikely to make CloudFront cheaper for most uses.
Is it possible that CloudFront works with S3 but if image is not present on S3, it copies it from my server to S3?
Close.
CloudFront does have a feature that would help move you in this direction -- origin groups. Create an origin group with S3 as primary and your server as secondary. Any time CloudFront encounters a cache miss, it will first check S3, and only if the image is not there, it will retry by sending the request to your server. It will cache the response, but it will not remember the source of the object -- so subsequent requests on future cache misses for the same object will always try S3 first.
This means something on your server needs to be responsible for ultimately moving images to S3 -- but as long as the image exists in one place or the other, the image will be served by CloudFront and cached in CloudFront in the edge or edges (up to two -- one global/outer, one regional/inner) that handled the request.

How to replicate existing aws-ec2 instances and s3 data on nearest location/endpoints for improved network throughput?

I am a remote developer working out of India. My client is based out of North America and has his ec2 servers/s3 data kept in the us-west-2 region.
The number of hops needed to fetch the data is obviously big and thus wastes a lot of my time during testing, as we are dependent on large data coming in from s3.
How can I replicate the existing ec2/s3 system to have an endpoint in India so that my testing performance can be increased?
How to geographically replicate an entire environment is a very broad topic.
But there is a potential solution you should investigate, S3 Transfer Acceleration, which optimizes your connection to the bucket from distant locations, by creating a mesh of global endpoints for the bucket using the AWS Edge Network (the same global network of edge locations that provide services like CloudFront and Route 53) so that your traffic is routed to the nearest edge, where it hops on the managed AWS network and then rides back to the actual bucket location. The content isn't replicated, but your connection is transparently proxied, providing signicant optimization.
There's a test page at the link, above, that will illustrate the impact of transfer acceleration on your uploads, but the improvement of downloads is similar.
When the feature is enabled on a bucket, the bucket works the same as always, with no change, unless you access it using the accelerated endpoint, bucket-name.s3-accelerate[.dualstack].amazonaws.com, which causes you to connect to the nearest accelerate endpoint rather than all the way back to the actual bucket in its home region. (Add .dualstack for IPv6.) The SDKs provide a way to specify that the accelerate endpoint be used.

Are there any difference between amazon cloudfront and amazon s3 transfer acceleration?

I have read documents about them, but I don't know their difference exactly.
could you let me know what's the difference?
TL;DR: CloudFront is for content delivery. S3 Transfer Acceleration is for faster transfers and higher throughput to S3 buckets (mainly uploads).
Amazon S3 Transfer Acceleration is an S3 feature that accelerates uploads to S3 buckets using AWS Edge locations - the same Edge locations as in AWS CloudFront service.
However, (a) creating a CloudFront distribution with an origin pointing to your S3 bucket and (b) enabling S3 Transfer acceleration for your bucket - are two different things serving two different purposes.
When you create a CloudFront distribution with an origin pointing to your S3 bucket, you enable caching on Edge locations. Consequent requests to the same objects will be served from the Edge cache which is faster for the end user and also reduces the load on your origin. CloudFront is primarily used as a content delivery service.
When you enable S3 Transfer Acceleration for your S3 bucket and use <bucket>.s3-accelerate.amazonaws.com instead of the default S3 endpoint, the transfers are performed via the same Edge locations, but the network path is optimized for long-distance large-object uploads. Extra resources and optimizations are used to achieve higher throughput. No caching on Edge locations.
More inromation:
https://aws.amazon.com/blogs/aws/aws-storage-update-amazon-s3-transfer-acceleration-larger-snowballs-in-more-regions/
http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration-examples.html
https://aws.amazon.com/about-aws/whats-new/2016/04/transfer-files-into-amazon-s3-up-to-300-percent-faster/
If you are interested in the difference between these two options pertaining to uploading content to S3 you may be interested in the following from Amazon's FAQ for S3:
Q. How should I choose between Transfer Acceleration and Amazon
CloudFront’s PUT/POST? Transfer Acceleration optimizes the TCP
protocol and adds additional intelligence between the client and the
S3 bucket, making Transfer Acceleration a better choice if a higher
throughput is desired. If you have objects that are smaller than 1GB
or if the data set is less than 1GB in size, you should consider using
Amazon CloudFront's PUT/POST commands for optimal performance.
As the FAQ answer states, transfer acceleration should be used if you need higher throughput.
Per the FAQs:
Q: How should I choose between S3 Transfer Acceleration and Amazon CloudFront’s PUT/POST?
S3 Transfer Acceleration optimizes the TCP protocol and adds additional intelligence between the client and the S3 bucket, making S3 Transfer Acceleration a better choice if a higher throughput is desired. If you have objects that are smaller than 1GB or if the data set is less than 1GB in size, you should consider using Amazon CloudFront's PUT/POST commands for optimal performance.
https://aws.amazon.com/s3/faqs/#s3ta
both Amazon cloudfront and amazon S3 are very different. Here is what these are for:
Amazon S3 provides a storage service on the internet while Amazon CloudFront is a web service for content delivery. Amazon S3 uses its own global network of websites while Amazon CloudFront delivers your content through a worldwide network of edge locations. Major differences in the features of both these services are mentioned Here.
And if you want to know about the S3 transfer accelerators, it actually takes advantage of Amazon CloudFront’s globally distributed edge locations to deliver/transfer fast, easy, and secure way of files over long distances between your client and an S3 bucket. Want to read more about S3 transfer accelerator, click here.
CloudFront is download direction only, so it is not offering a performant upload to the origin. Whereas S3 with Transfer Acceleration, it will utilize Edge locations like CloudFront both for upload and download.

upload files via cloudfront distribution

how to upload files directly to cloudfront distribution ?
now I use the putobject method in the s3 class in the javascript sdk
According to documentation we can upload to the distribution directly
http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AddingObjects.html
when I send the put request to distributionname.cloudfront.net It says 403 forbidden
although I enabled the CORS configuration in s3
is there any similar method to s3.putobject for uploading to the cloudfront directly ?
or should I keep sending to the s3 origin of distribution buketname.s3.amazonaws.com/?
Actually AWS released a feature later called as
"Amazon S3 Transfer Acceleration"
to Transfer Acceleration takes advantage of Amazon CloudFront’s globally distributed edge locations
http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html
There is no such concept as uploading files "to" Cloudfront.
The link you cited only really discusses adding objects to your origin -- not to your distribution, in spite of the ambiguous title in the Amazon documentation. As discussed there, you're adding objects to your origin so that they will be accessible via your distribution... not actually adding objects "to" the distribution.
Cloudfront does not provide persistent storage -- it only stores (caches) the objects that are requested through it, after the objects are fetched from the origin (which can be S3, or not).
Once an object is requested and cached at a Cloudfront edge location, it still isn't in any real sense "in" Cloudfront. It's only stored at the particular edge locations where it's been requested, and only until it either expires or is otherwise evicted from the Cloudfront cache at that location.
“[...] when space is needed at an edge location, the Amazon CloudFront will remove less popular objects in order to make room for more popular ones. This means that your static objects that aren’t accessed frequently are less likely to remain in Amazon CloudFront’s edge locations’ caches.”
— https://aws.amazon.com/cloudfront/details/
Now, with all of that said... it is technically possible to upload objects to S3 through Cloudfront, but this technique doesn't put the object "into" Cloudfront... it only allows you to put the object into S3 using Cloudfront as a proxy, which can offer some performance improvement in less than ideal network conditions, but has no impact on subsequent behavior on the part of Cloudfront when fetching the object, and doesn't invalidate the old copy of the object that might already be cached in Cloudfront at the various edge locations around the globe.
As I understand, if you use Transfer Acceleration on a bucket then the objects uploaded to that bucket will be first uploaded to CloudFront and then it will be transferred to the actual S3 bucket.
Cloud Front can support those requests if you enable them: POST, PUT, DELETE, OPTIONS, and PATCH.
Aws recommend to use CloudFront for upload/download file < 1Gb in size. For larger files, the S3 Transfer Accelerator is recommended.
see: https://aws.amazon.com/blogs/aws/amazon-cloudfront-content-uploads-post-put-other-methods/
https://aws.amazon.com/s3/faqs/#Amazon_S3_Transfer_Acceleration