amazon cloudfront best practices and anti-patterns

62
BEST PRACTICES & ANTI- PATTERNS CLOUDFRONT

Upload: abhishek-tiwari

Post on 16-Apr-2017

145 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Amazon CloudFront  Best Practices and Anti-patterns

BEST PRACTICES & ANTI-PATTERNS

CLOUDFRONT

Page 2: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 3: Amazon CloudFront  Best Practices and Anti-patterns

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

AGENDA

• CloudFront in a nutshell

• CloudFront Best Practices/Anti-Patterns

3

Page 4: Amazon CloudFront  Best Practices and Anti-patterns

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

01Content Delivery Network Serves Static and Dynamic Content

4

CLOUDFRONT

Page 5: Amazon CloudFront  Best Practices and Anti-patterns

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

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

5

CLOUDFRONT

Page 6: Amazon CloudFront  Best Practices and Anti-patterns

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

01Cost Effective Transparent, PAYG, Price Classes

6

CLOUDFRONT

Page 7: Amazon CloudFront  Best Practices and Anti-patterns

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

01Wish list Edge Side Includes and Reporting

7

CLOUDFRONT

Page 8: Amazon CloudFront  Best Practices and Anti-patterns

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]

Page 9: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 10: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 11: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 12: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 13: Amazon CloudFront  Best Practices and Anti-patterns

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

02Cache invalidation

ANTI-PATTERNS

12

Page 14: Amazon CloudFront  Best Practices and Anti-patterns

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

02BEST PRACTICES

Page 15: Amazon CloudFront  Best Practices and Anti-patterns

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

1. Versioning

13

02BEST PRACTICES

Page 16: Amazon CloudFront  Best Practices and Anti-patterns

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

1. Versioning

2. Compression

13

02BEST PRACTICES

Page 17: Amazon CloudFront  Best Practices and Anti-patterns

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

1. Versioning

2. Compression

3. Domain Sharding

13

02BEST PRACTICES

Page 18: Amazon CloudFront  Best Practices and Anti-patterns

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

1. Versioning

2. Compression

3. Domain Sharding

4. Expiration

13

02BEST PRACTICES

Page 19: Amazon CloudFront  Best Practices and Anti-patterns

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

1. Versioning

2. Compression

3. Domain Sharding

4. Expiration

5. Bucket Organization

13

02BEST PRACTICES

Page 20: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 21: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 22: Amazon CloudFront  Best Practices and Anti-patterns

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

02Expensive Unmanageable if you have object dependencies

CACHE INVALIDATION

14

Page 23: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 24: Amazon CloudFront  Best Practices and Anti-patterns

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

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

CACHE INVALIDATION

16

Page 25: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 26: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 27: Amazon CloudFront  Best Practices and Anti-patterns

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

02Requires Versioning enabled Origin (Custom/S3)

VERSIONING

19

Page 28: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 29: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 30: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 31: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 32: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 33: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 34: Amazon CloudFront  Best Practices and Anti-patterns

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

02Compressed content is served faster and uses less bandwidth

COMPRESSION

26

Page 35: Amazon CloudFront  Best Practices and Anti-patterns

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

02Can serve both compressed and uncompressed version of files

COMPRESSION

27

Page 36: Amazon CloudFront  Best Practices and Anti-patterns

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

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

COMPRESSION

28

Page 37: Amazon CloudFront  Best Practices and Anti-patterns

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

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

COMPRESSION

29

Page 38: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 39: Amazon CloudFront  Best Practices and Anti-patterns

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

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

COMPRESSION

31

Page 40: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 41: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 42: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 43: Amazon CloudFront  Best Practices and Anti-patterns

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

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

EXPIRATION

35

Page 44: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 45: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 46: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 47: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 48: Amazon CloudFront  Best Practices and Anti-patterns

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

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

DOMAIN SHARDING

40

Page 49: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 50: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 51: Amazon CloudFront  Best Practices and Anti-patterns

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

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

BUCKET ORGANISATION

43

Page 52: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 53: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 54: Amazon CloudFront  Best Practices and Anti-patterns

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

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

LOGGING

46

Page 55: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 56: Amazon CloudFront  Best Practices and Anti-patterns

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

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

LOGGING

48

Page 57: Amazon CloudFront  Best Practices and Anti-patterns

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

02Measuring Latency Delay in DNS resolution and content delivery

PERFORMANCE TESTING

49

Page 58: Amazon CloudFront  Best Practices and Anti-patterns

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

02Backbone Testing (Ideal Word) Measuring latency from

CDN Server → Backbone

PERFORMANCE TESTING

50

Page 59: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 60: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 61: Amazon CloudFront  Best Practices and Anti-patterns

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

Page 62: Amazon CloudFront  Best Practices and Anti-patterns

Q & A

THANK YOU

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