cf-s3-invalidator 0.1.0
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/bin/cf-s3-inv +21 -0
- data/lib/cloudfront_invalidator.rb +62 -0
- metadata +84 -0
data/bin/cf-s3-inv
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'aws-sdk'
|
4
|
+
require 'cloudfront_invalidator'
|
5
|
+
|
6
|
+
key = ARGV[0]
|
7
|
+
secret = ARGV[1]
|
8
|
+
s3_bucket = ARGV[2]
|
9
|
+
cloudfront_distribution_id = ARGV[3]
|
10
|
+
|
11
|
+
s3 = AWS::S3.new(
|
12
|
+
:access_key_id => key,
|
13
|
+
:secret_access_key => secret)
|
14
|
+
|
15
|
+
s3_objects = []
|
16
|
+
s3.buckets[s3_bucket].objects.each do |object|
|
17
|
+
s3_objects << "/#{object.key}"
|
18
|
+
end
|
19
|
+
|
20
|
+
invalidator = CloudfrontInvalidator.new(key, secret, cloudfront_distribution_id)
|
21
|
+
invalidator.invalidate(s3_objects)
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'digest/sha1'
|
3
|
+
require 'net/https'
|
4
|
+
require 'base64'
|
5
|
+
|
6
|
+
# Adapted from:
|
7
|
+
# Confabulus @ http://blog.confabulus.com/2011/05/13/cloudfront-invalidation-from-ruby
|
8
|
+
class CloudfrontInvalidator
|
9
|
+
def initialize(aws_account, aws_secret, distribution)
|
10
|
+
@aws_account = aws_account
|
11
|
+
@aws_secret = aws_secret
|
12
|
+
@distribution = distribution
|
13
|
+
end
|
14
|
+
|
15
|
+
def invalidate(items)
|
16
|
+
date = Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z")
|
17
|
+
digest = Base64.encode64(
|
18
|
+
OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), @aws_secret, date)).strip
|
19
|
+
uri = URI.parse(
|
20
|
+
"https://cloudfront.amazonaws.com/2012-05-05/distribution/#{@distribution}/invalidation")
|
21
|
+
req = Net::HTTP::Post.new(uri.path)
|
22
|
+
req.initialize_http_header({
|
23
|
+
'x-amz-date' => date,
|
24
|
+
'Content-Type' => 'text/xml',
|
25
|
+
'Authorization' => "AWS %s:%s" % [@aws_account, digest]
|
26
|
+
})
|
27
|
+
req.body = %|
|
28
|
+
<InvalidationBatch>
|
29
|
+
<Paths>
|
30
|
+
<Quantity>#{items.length}</Quantity>
|
31
|
+
<Items>
|
32
|
+
#{to_xml items}
|
33
|
+
</Items>
|
34
|
+
</Paths>
|
35
|
+
<CallerReference>#{Time.now.utc.to_i}</CallerReference>
|
36
|
+
</InvalidationBatch>
|
37
|
+
|
|
38
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
39
|
+
http.use_ssl = true
|
40
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
41
|
+
res = http.request(req)
|
42
|
+
print_operation_result(res, items)
|
43
|
+
end
|
44
|
+
|
45
|
+
def print_operation_result(http_response, items)
|
46
|
+
success = http_response.code == '201'
|
47
|
+
puts "Invalidating items"
|
48
|
+
items.each do |item|
|
49
|
+
puts " #{item}"
|
50
|
+
end
|
51
|
+
if success
|
52
|
+
puts "succeeded"
|
53
|
+
else
|
54
|
+
puts "FAILED, reason:"
|
55
|
+
puts res.body
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def to_xml(items)
|
60
|
+
items.map{ |item| "<Path>#{item}</Path>" }
|
61
|
+
end
|
62
|
+
end
|
metadata
ADDED
@@ -0,0 +1,84 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cf-s3-invalidator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Lauri Lehmijoki
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-07-03 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: aws-sdk
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
26
|
+
- - ">="
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 3
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
version: "0"
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
34
|
+
description: |-
|
35
|
+
This lib fetches the names of all objects on an Amazon Web
|
36
|
+
Services S3 bucket. Then it calls the Cloudfront invalidation REST API on the
|
37
|
+
objects.
|
38
|
+
|
39
|
+
The Cloudfront distribution must be based on the S3 bucket.
|
40
|
+
email: lauri.lehmijoki@iki.fi
|
41
|
+
executables:
|
42
|
+
- cf-s3-inv
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files: []
|
46
|
+
|
47
|
+
files:
|
48
|
+
- lib/cloudfront_invalidator.rb
|
49
|
+
- bin/cf-s3-inv
|
50
|
+
homepage: https://github.com/laurilehmijoki/cf-s3-invalidator
|
51
|
+
licenses: []
|
52
|
+
|
53
|
+
post_install_message:
|
54
|
+
rdoc_options: []
|
55
|
+
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
hash: 3
|
64
|
+
segments:
|
65
|
+
- 0
|
66
|
+
version: "0"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
none: false
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
hash: 3
|
73
|
+
segments:
|
74
|
+
- 0
|
75
|
+
version: "0"
|
76
|
+
requirements: []
|
77
|
+
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.8.13
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: A tool for invalidating AWS S3-based Cloudfront distributions
|
83
|
+
test_files: []
|
84
|
+
|