simple-cloudfront-invalidator 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/README.md +10 -0
- data/Rakefile +7 -0
- data/fixtures/cassettes/cloudfront.yml +36 -0
- data/lib/simple-cloudfront-invalidator.rb +77 -0
- data/simple-cloudfront-invalidator.gemspec +19 -0
- data/spec/simple_cloudfront_invalidator_spec.rb +16 -0
- data/spec/test_helper.rb +8 -0
- metadata +158 -0
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
# Simple Cloudfront invalidator
|
2
|
+
[]
|
4
|
+
(http://travis-ci.org/laurilehmijoki/simple-cloudfront-invalidator)
|
5
|
+
|
6
|
+
A library for invalidating AWS Cloudfront items.
|
7
|
+
|
8
|
+
## Tests
|
9
|
+
|
10
|
+
Run `rake test`.
|
data/Rakefile
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://cloudfront.amazonaws.com/2012-05-05/distribution/FOOOO/invalidation
|
6
|
+
body:
|
7
|
+
string: "\n <InvalidationBatch>\n <Paths>\n <Quantity>2</Quantity>\n <Items>\n <Path>/index.html</Path><Path>/articles.html</Path>\n </Items>\n </Paths>\n <CallerReference>1238921371</CallerReference>\n </InvalidationBatch>\n "
|
8
|
+
headers:
|
9
|
+
Authorization:
|
10
|
+
- AWS foooo:baaaar
|
11
|
+
Content-Type:
|
12
|
+
- text/xml
|
13
|
+
X-Amz-Date:
|
14
|
+
- Thu, 23 Aug 2012 19:46:10 EEST
|
15
|
+
response:
|
16
|
+
status:
|
17
|
+
code: 201
|
18
|
+
message: Created
|
19
|
+
headers:
|
20
|
+
Content-Length:
|
21
|
+
- "393"
|
22
|
+
Location:
|
23
|
+
- https://cloudfront.amazonaws.com/2012-05-05/distribution/FOOOO/invalidation/BAR
|
24
|
+
Date:
|
25
|
+
- Thu, 23 Aug 2012 16:46:10 GMT
|
26
|
+
X-Amzn-Requestid:
|
27
|
+
- FOOO
|
28
|
+
Content-Type:
|
29
|
+
- text/xml
|
30
|
+
body:
|
31
|
+
string: |-
|
32
|
+
<?xml version="1.0"?>
|
33
|
+
<Invalidation xmlns="http://cloudfront.amazonaws.com/doc/2012-05-05/"><Id>FOOO</Id><Status>InProgress</Status><CreateTime>2012-08-23T16:46:10.764Z</CreateTime><InvalidationBatch><Paths><Quantity>2</Quantity><Items><Path>/articles.html</Path><Path>/index.html</Path></Items></Paths><CallerReference>123213123</CallerReference></InvalidationBatch></Invalidation>
|
34
|
+
http_version:
|
35
|
+
recorded_at: Thu, 23 Aug 2012 16:46:10 GMT
|
36
|
+
recorded_with: VCR 2.2.2
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'openssl'
|
3
|
+
require 'digest/sha1'
|
4
|
+
require 'net/https'
|
5
|
+
require 'base64'
|
6
|
+
require 'colored'
|
7
|
+
|
8
|
+
module SimpleCloudfrontInvalidator
|
9
|
+
class CloudfrontClient
|
10
|
+
def initialize(aws_account, aws_secret, distribution)
|
11
|
+
@aws_account = aws_account
|
12
|
+
@aws_secret = aws_secret
|
13
|
+
@distribution = distribution
|
14
|
+
end
|
15
|
+
|
16
|
+
def invalidate(items)
|
17
|
+
items = prefix_with_slash(items)
|
18
|
+
body = %|
|
19
|
+
<InvalidationBatch>
|
20
|
+
<Paths>
|
21
|
+
<Quantity>#{items.length}</Quantity>
|
22
|
+
<Items>
|
23
|
+
#{to_xml items}
|
24
|
+
</Items>
|
25
|
+
</Paths>
|
26
|
+
<CallerReference>#{Time.now.utc.to_i}</CallerReference>
|
27
|
+
</InvalidationBatch>
|
28
|
+
|
|
29
|
+
res = sign_and_call(
|
30
|
+
"https://cloudfront.amazonaws.com/2012-05-05/distribution/#{@distribution}/invalidation",
|
31
|
+
Net::HTTP::Post, body)
|
32
|
+
create_report(items)
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def sign_and_call(url, method, body = nil)
|
38
|
+
date = Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z")
|
39
|
+
digest = Base64.encode64(
|
40
|
+
OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), @aws_secret, date)).strip
|
41
|
+
uri = URI.parse(url)
|
42
|
+
req = method.new(uri.path)
|
43
|
+
req.initialize_http_header({
|
44
|
+
'x-amz-date' => date,
|
45
|
+
'Content-Type' => 'text/xml',
|
46
|
+
'Authorization' => "AWS %s:%s" % [@aws_account, digest]
|
47
|
+
})
|
48
|
+
req.body = body unless body == nil
|
49
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
50
|
+
http.use_ssl = true
|
51
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
52
|
+
res = http.request(req)
|
53
|
+
if res.code.to_i.between? 200, 299
|
54
|
+
res
|
55
|
+
else
|
56
|
+
raise "AWS API call failed. Reason:".red + "\n" + res.body
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_report(items)
|
61
|
+
report = []
|
62
|
+
report << "Invalidating Cloudfront items..."
|
63
|
+
items.each do |item|
|
64
|
+
report << " #{item}".yellow
|
65
|
+
end
|
66
|
+
report << "succeeded".green
|
67
|
+
end
|
68
|
+
|
69
|
+
def prefix_with_slash(file_names)
|
70
|
+
file_names.map { |file_name| "/#{file_name}" }
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_xml(items)
|
74
|
+
items.map { |item| "<Path>#{item}</Path>" }
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'simple-cloudfront-invalidator'
|
3
|
+
s.version = '0.0.1'
|
4
|
+
s.license = 'MIT'
|
5
|
+
s.summary = 'A library for invalidating Cloudfront distributions'
|
6
|
+
s.authors = ['Lauri Lehmijoki']
|
7
|
+
s.email = 'lauri.lehmijoki@iki.fi'
|
8
|
+
s.files = `git ls-files`.split("\n")
|
9
|
+
s.require_paths = ['lib']
|
10
|
+
s.homepage = 'https://github.com/laurilehmijoki/simple-cloudfront-invalidator'
|
11
|
+
|
12
|
+
s.add_dependency 'colored', '= 1.2'
|
13
|
+
|
14
|
+
s.add_development_dependency 'rspec'
|
15
|
+
s.add_development_dependency 'vcr'
|
16
|
+
s.add_development_dependency 'webmock'
|
17
|
+
s.add_development_dependency 'rake'
|
18
|
+
s.add_development_dependency 'require_relative'
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module SimpleCloudfrontInvalidator
|
4
|
+
describe CloudfrontClient do
|
5
|
+
it "calls the Cloudfront invalidation API" do
|
6
|
+
VCR.use_cassette('cloudfront', :match_requests_on => [:host]) do
|
7
|
+
@client = CloudfrontClient.new('some aws key', 'aws secret', 'cloudfrontdistid')
|
8
|
+
report = @client.invalidate(['index.html', 'articles.html'])
|
9
|
+
report.join('').should include("Invalidating Cloudfront items...")
|
10
|
+
report.join('').should include("/index.html")
|
11
|
+
report.join('').should include("/articles.html")
|
12
|
+
report.join('').should include("succeeded")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: simple-cloudfront-invalidator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Lauri Lehmijoki
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-08-23 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: colored
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - "="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 11
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 2
|
32
|
+
version: "1.2"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: rspec
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: vcr
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
63
|
+
- !ruby/object:Gem::Dependency
|
64
|
+
name: webmock
|
65
|
+
prerelease: false
|
66
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ">="
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
hash: 3
|
72
|
+
segments:
|
73
|
+
- 0
|
74
|
+
version: "0"
|
75
|
+
type: :development
|
76
|
+
version_requirements: *id004
|
77
|
+
- !ruby/object:Gem::Dependency
|
78
|
+
name: rake
|
79
|
+
prerelease: false
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ">="
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
hash: 3
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
version: "0"
|
89
|
+
type: :development
|
90
|
+
version_requirements: *id005
|
91
|
+
- !ruby/object:Gem::Dependency
|
92
|
+
name: require_relative
|
93
|
+
prerelease: false
|
94
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
hash: 3
|
100
|
+
segments:
|
101
|
+
- 0
|
102
|
+
version: "0"
|
103
|
+
type: :development
|
104
|
+
version_requirements: *id006
|
105
|
+
description:
|
106
|
+
email: lauri.lehmijoki@iki.fi
|
107
|
+
executables: []
|
108
|
+
|
109
|
+
extensions: []
|
110
|
+
|
111
|
+
extra_rdoc_files: []
|
112
|
+
|
113
|
+
files:
|
114
|
+
- .gitignore
|
115
|
+
- .travis.yml
|
116
|
+
- Gemfile
|
117
|
+
- README.md
|
118
|
+
- Rakefile
|
119
|
+
- fixtures/cassettes/cloudfront.yml
|
120
|
+
- lib/simple-cloudfront-invalidator.rb
|
121
|
+
- simple-cloudfront-invalidator.gemspec
|
122
|
+
- spec/simple_cloudfront_invalidator_spec.rb
|
123
|
+
- spec/test_helper.rb
|
124
|
+
homepage: https://github.com/laurilehmijoki/simple-cloudfront-invalidator
|
125
|
+
licenses:
|
126
|
+
- MIT
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
|
130
|
+
require_paths:
|
131
|
+
- lib
|
132
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 3
|
138
|
+
segments:
|
139
|
+
- 0
|
140
|
+
version: "0"
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
none: false
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
hash: 3
|
147
|
+
segments:
|
148
|
+
- 0
|
149
|
+
version: "0"
|
150
|
+
requirements: []
|
151
|
+
|
152
|
+
rubyforge_project:
|
153
|
+
rubygems_version: 1.8.13
|
154
|
+
signing_key:
|
155
|
+
specification_version: 3
|
156
|
+
summary: A library for invalidating Cloudfront distributions
|
157
|
+
test_files: []
|
158
|
+
|