Amazon CloudFront Best Practices and Anti-patterns

Post on 16-Apr-2017

137 views 0 download

Transcript of Amazon CloudFront Best Practices and Anti-patterns

BEST PRACTICES & ANTI-PATTERNS

CLOUDFRONT

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

ABOUT ME

• Solutions Architect

• Early AWS adopter (2007)

• Built Cotton On Group’s AWS Infrastructure (2012)

2

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

AGENDA

• CloudFront in a nutshell

• CloudFront Best Practices/Anti-Patterns

3

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

01Content Delivery Network Serves Static and Dynamic Content

4

CLOUDFRONT

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

01Global, Redundant, Scalable Low Latency, High Bandwidth Applications

5

CLOUDFRONT

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

01Cost Effective Transparent, PAYG, Price Classes

6

CLOUDFRONT

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

01Wish list Edge Side Includes and Reporting

7

CLOUDFRONT

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

MINIMUM TTL

REQUESTS

PROTOCOL

VIEWER

COOKIES & QUERY STRING FORWARDING

PATH PATTERNS

CNAME ALIASES

CACHE BEHAVIORS

STREAMING

DISTRIBUTIONDELIVERY METHOD

ORIGIN SERVER

DOMAIN NAME

OBJECTS OBJECT PATH/

CACHE KEY

ORIGIN PROTOCOL

DOWNLOAD

CLOUDFRONT (CF) CONCEPTS

8

[1-10, ORDERED]

[M:M]

[1:1]

[1-10]

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS 9

CloudFront Distribution

Origin Servers Cache Behavior

S3 Bucket with images

S3 Bucket with photos

EC2 Instance

default (*)

photos(photos/*)

thumbnail(thumbnail/*)

Cached objects with cache key

Edge Locations Viewer

Client Browser

Cache key = Object path relative to origin + forwarded query string/cookies

From nearest edge location GET http://my.cloudfront.net/photos/profile.png

Returns object with matching cache key photos/profile.png

Cached Etag, Date, LastModified for each objects

http://<CloudFront domain name>/<object name in origin>

01CLOUDFRONT (CF) CONCEPTS

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS 9

CloudFront Distribution

Origin Servers Cache Behavior

S3 Bucket with images

S3 Bucket with photos

EC2 Instance

default (*)

photos(photos/*)

thumbnail(thumbnail/*)

Cached objects with cache key

Edge Locations Viewer

Client Browser

Cache key = Object path relative to origin + forwarded query string/cookies

From nearest edge location GET http://my.cloudfront.net/photos/profile.png

Returns object with matching cache key photos/profile.png

Cached Etag, Date, LastModified for each objects

http://<CloudFront domain name>/<object name in origin>

Custom Origin Dynamic Content

S3 Origin Static Content

01CLOUDFRONT (CF) CONCEPTS

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

HOW IT WORKS

10

1. Client request file

2. If file in cache CF return fileNearest Edge Location

a. If file not in cache, CloudFront request to origin

b. Origin returns latest version of file, status 200, cached in CloudFront

1. Client request file

2. If file in cache CF return fileNearest Edge Location

a. If file in cache but expired, CloudFront request to origin

b. Cached file is latest, status 304, CloudFront keeps file in cache,

No change in Date, Expire Refreshed Age

Condition GET

Routing based on low latency/price class 01

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. 10 Origin Servers per CF Distribution

2. 10 Cache Behavior per CF Distribution

3. 10 CNAME per CF Distribution

4. 10 Cookies forwarded per Cache Behavior

11

01MAKE A NOTE

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Cache invalidation

ANTI-PATTERNS

12

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS 13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

2. Compression

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

2. Compression

3. Domain Sharding

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

2. Compression

3. Domain Sharding

4. Expiration

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

2. Compression

3. Domain Sharding

4. Expiration

5. Bucket Organization

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

2. Compression

3. Domain Sharding

4. Expiration

5. Bucket Organization

6. Logging

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

1. Versioning

2. Compression

3. Domain Sharding

4. Expiration

5. Bucket Organization

6. Logging

7. Performance Testing

13

02BEST PRACTICES

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Expensive Unmanageable if you have object dependencies

CACHE INVALIDATION

14

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Programmatic 3 invalidation requests at any given time with each include maximum of 1000 files

CACHE INVALIDATION

15

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Eventual Consistency Invalidation takes time to propagate across all edge locations

CACHE INVALIDATION

16

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Deal breaker: Browser cache Versioning is best way to avoid the invalidation related issues

CACHE INVALIDATION

17

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Versioning using query strings File name plus query string with version: /static/profile.png?versionID=123

VERSIONING

18

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Requires Versioning enabled Origin (Custom/S3)

VERSIONING

19

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

UPLOAD TO S3 STATIC/IMAGES/PROFILE.PNG

PROFILE.PNG RETURN X-AMZ-VERSION-ID = 644C69E1

CF KEY STATIC/IMAGES/PROFILE.PNG?

VERSIONID=644C69E1

VERSIONED ENABLED S3 CONTENT

20

02

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

MINIFY+COMBINE MAIN.CSS MAIN.JS

CSS AND JS PHOTO.CSS, APP.CSS, PROFILE.CSS

PHOTO.JS, APP.JS, PROFILE.JS

VERSIONIFY BUILD NUMBER OR HASH OF

GIT/HG HEAD

CF KEY MAIN.CSS?V=468DF6B MAIN.JS?V=468DF6B

VERSIONIFY APPLICATION CONTENT

21

02

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Versioning using content based hash key File name as unique key based on file content: /static/712vds57tr18929812312enb.png

VERSIONING

22

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

MD5 HASH USING FILE CONTENT

B723EH0F0DF

PROFILE.PNG UPLOAD TO S3 USE HASH AS FILE NAME

STATIC/IMAGES/B723EH0F0DF.PNG

CF KEY STATIC/IMAGES/B723EH0F0DF.PNG

FOR S3 CONTENT

23

Avoid content duplication

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

MINIFY+COMBINE STATIC/MAIN.CSS STATIC/MAIN.JS

CSS AND JS PHOTO.CSS, APP.CSS, PROFILE.CSS

PHOTO.JS, APP.JS, PROFILE.JS

MD5 HASH OF FILE CONTENT AS FILE NAMES

STATIC/8972BW7DYF2H.CSS STATIC/67BFWU9HHUW.JS

CF KEY STATIC/8972BW7DYF2H.CSS STATIC/67BFWU9HHUW.JS

VERSIONIFY APPLICATION CONTENT

24

02

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Versioning using prefix/suffix File name with version prefix/suffix: /static/profile_123.png

File name with version prefix/suffix: /static/profile_ 712vds57tr18929812312enb.png

VERSIONING

25

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Compressed content is served faster and uses less bandwidth

COMPRESSION

26

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Can serve both compressed and uncompressed version of files

COMPRESSION

27

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02For compression CF relies on the origin servers (Custom vs S3)

COMPRESSION

28

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

55Viewer request To receive compressed content browser request must include Accept-Encoding: gzip

COMPRESSION

29

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Upload both gzip and non-gzip versions of the file in the same S3 bucket

COMPRESSION

30

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02When uploading gzip file to S3 set Content-Encoding to gzip

COMPRESSION

31

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02HTML, CSS, JS etc On-the-fly compression by custom origin server (Nginx, Apache)

COMPRESSION

32

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Use one/both of these •On Origin server set Cache-Control max-age header •In Cache Behavior set Minimum TTL

EXPIRATION

33

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Default expiration 24hrs Set Cache-Control max-age or Minimum TTL very far future max {Cache-Control max-age directive, Cache Behavior Minimum TTL}

EXPIRATION

34

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Depending on request frequency, CloudFront might remove the object before its expiration

EXPIRATION

35

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Avoid Expire header After expiry browser cachability issues (stale response) Can not cache object if {Age <=0 OR Expire Date - Current Date <=0}

EXPIRATION

36

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Browser limit number of simultaneous synchronous connections to one server (n)

DOMAIN SHARDING

37

Client Browser Server

time ->

GET

200 OK

GET

200 OK

X n

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Browser treat CNAM aliases as different servers

Bypass parallel download limit using 2 or more CNAM aliases Route 53, Wild Card CNAME, Custom SSL

DOMAIN SHARDING

38

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Sharding across 2 CNAME aliases will double the parallel download

DOMAIN SHARDING

39

Client Browser CNAME2 ->Server

time ->

GET

200 OK

GET

200 OK

X n

Client Browser CNAME1 ->Server

time ->

GET

200 OK

GET

200 OK

X n

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02On application side Enable CF sharding logic (template compilation etc)

DOMAIN SHARDING

40

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02

41

<span style="width:inherit;"> <a href="http://mysite.com/about"><img src="http://cf.mycloudfront.net/about.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/blogs"><img src="http://cf.mycloudfront.net/blogs.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/contact"><img src="http://cf.mycloudfront.net/cont.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/about"><img src="http://cf1.mycloudfront.net/about.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/blogs"><img src="http://cf2.mycloudfront.net/blogs.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/contact"><img src="http://cf1.mycloudfront.net/cont.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/about"><img src="{{ CDN_DOMAINS }}/about.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/blogs"><img src="{{ CDN_DOMAINS }}/blogs.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/contact"><img src="{{ CDN_DOMAINS }}/cont.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/about"><img src="http://mysite.com/about.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/blogs"><img src="http://mysite.com/blogs.jpg" alt=""/></a></span>

<span style="width:inherit;"> <a href="http://mysite.com/contact"><img src="http://mysite.com/cont.jpg" alt=""/></a></span>

CDN with domain shardingCDN without domain sharding

HTML Template

Without CDN

Compiled OR DOM Manipulation

Compiled OR DOM Manipulation

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Performance Considerations •When to shard?

•DNS lookup, Connection time, Evenly distribute

•Mobile browsers, Network congestion, Battery Life •SPDY (HTTP MULTIPLEXING)

DOMAIN SHARDING

42

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Limited Cache Behavior Plan your bucket organisation (object keys)

BUCKET ORGANISATION

43

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Watch out for the object paths /video/uploads/, /audio/uploads/, /images/uploads/ BAD

/uploads/video/, /uploads/audio/, /uploads/image/ GOOD

Use wild card patterns (/uploads/*)

BUCKET ORGANISATION

44

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Reporting non-existence •Object/Content Popularity Report

•Cache Hit Ratio

•Edge Location Report

•Error Report •Mapping Geo-IP and Geo-location

LOGGING

45

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Enable logging Store access log file to S3. One bucket per distribution.

LOGGING

46

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Tons of log files As traffic levels climb, the number of log files will increase Delayed (24H), missing logs, not in order

LOGGING

47

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Combine log files and analyze Using EMR (Custom scripts, CloudFront LogAnalyzer, EmrEtlRunner)

LOGGING

48

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Measuring Latency Delay in DNS resolution and content delivery

PERFORMANCE TESTING

49

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Backbone Testing (Ideal Word) Measuring latency from

CDN Server → Backbone

PERFORMANCE TESTING

50

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Last Mile Testing (Real World) Measuring latency from

CDN Server → Backbone → Device 3rd party service (Gomez), Application instrument

PERFORMANCE TESTING

51

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Quantifying Scalability Tradition Load Testing not useful One Client → Same DNS Request → Same Set of IPs

PERFORMANCE TESTING

52

06-11-2013 @ABHISHEKTIWARI | CLOUDFRONT BEST PRACTICES & ANTI-PATTERNS

02Load Testing (Edge Location, EIP) 1.Multiple Client from different geolocations 2.Independent DNS request, different set of IPs 3.Distribute load across set of IPs

PERFORMANCE TESTING

53

Q & A

THANK YOU

http://bit.ly/abhishektiwarihttp://abhishek-tiwari.com