cf-s3-invalidator 0.1.0 → 0.2.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/.gitignore +2 -0
- data/Gemfile +4 -0
- data/README.md +13 -0
- data/bin/cf-s3-inv +38 -16
- data/cf-s3-invalidator.gemspec +20 -0
- data/lib/cloudfront_invalidator.rb +8 -3
- data/lib/s3_loader.rb +18 -0
- metadata +9 -4
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Invalidator for AWS S3-based Cloudfront distributions
|
2
|
+
|
3
|
+
If your Amazon Web Services Cloudfront distribution is based on AWS S3, then
|
4
|
+
this library may be useful to you.
|
5
|
+
|
6
|
+
This library fetches all the object keys of a particular S3 bucket and then
|
7
|
+
calls on them the invalidation REST API of Cloudfront.
|
8
|
+
|
9
|
+
## Usage
|
10
|
+
|
11
|
+
`gem install cf-s3-invalidator`
|
12
|
+
|
13
|
+
`cf-s3-inv <AWS-KEY> <AWS-SECRET> <S3-BUCKET-NAME> <CLOUDFRONT-DISTRIBUTION-ID>`
|
data/bin/cf-s3-inv
CHANGED
@@ -1,21 +1,43 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
require '
|
3
|
-
require '
|
4
|
-
require '
|
2
|
+
require 'optparse'
|
3
|
+
require File.dirname(__FILE__)+'/../lib/cloudfront_invalidator'
|
4
|
+
require File.dirname(__FILE__)+'/../lib/s3_loader'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
:
|
13
|
-
|
6
|
+
options = {}
|
7
|
+
optparse = OptionParser.new do |opts|
|
8
|
+
opts.banner = "Usage: #{File.basename(__FILE__)} [options]"
|
9
|
+
opts.separator ""
|
10
|
+
opts.separator "Invalidate an S3-based Cloudfront distribution"
|
11
|
+
opts.separator ""
|
12
|
+
opts.separator "Options:"
|
13
|
+
opts.on("-k", "--key AWS KEY",
|
14
|
+
"Amazon Web Services API key that has access to your S3 and Cloudfront") do |val|
|
15
|
+
options[:key] = val
|
16
|
+
end
|
17
|
+
opts.on("-s", "--secret AWS SECRET",
|
18
|
+
"Amazon Web Services API secret key") do |val|
|
19
|
+
options[:secret] = val
|
20
|
+
end
|
21
|
+
opts.on("-b", "--bucket BUCKET NAME",
|
22
|
+
"S3 bucket name") do |val|
|
23
|
+
options[:bucket] = val
|
24
|
+
end
|
25
|
+
opts.on("-d", "--distribution CLOUDFRONT ID",
|
26
|
+
"Cloudfront distribution id") do |val|
|
27
|
+
options[:distribution] = val
|
28
|
+
end
|
29
|
+
end
|
14
30
|
|
15
|
-
|
16
|
-
|
17
|
-
|
31
|
+
ARGV_ORIGINAL = ARGV.dup
|
32
|
+
optparse.parse!
|
33
|
+
if ARGV_ORIGINAL.length == 0
|
34
|
+
puts optparse.help
|
35
|
+
exit
|
18
36
|
end
|
19
37
|
|
20
|
-
|
21
|
-
|
38
|
+
s3_object_keys = S3Loader.new(
|
39
|
+
options[:key], options[:secret]).list_keys(options[:bucket])
|
40
|
+
|
41
|
+
invalidator = CloudfrontInvalidator.new(
|
42
|
+
options[:key], options[:secret], options[:distribution])
|
43
|
+
invalidator.invalidate(s3_object_keys)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'cf-s3-invalidator'
|
3
|
+
s.version = '0.2.0'
|
4
|
+
s.date = '2012-07-03'
|
5
|
+
s.summary = 'A tool for invalidating AWS S3-based Cloudfront distributions'
|
6
|
+
s.description =
|
7
|
+
'This lib fetches the names of all objects on an Amazon Web
|
8
|
+
Services S3 bucket. Then it calls the Cloudfront invalidation REST API on the
|
9
|
+
objects.
|
10
|
+
|
11
|
+
The Cloudfront distribution must be based on the S3 bucket.'
|
12
|
+
s.authors = ['Lauri Lehmijoki']
|
13
|
+
s.email = 'lauri.lehmijoki@iki.fi'
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.require_paths = ['lib']
|
16
|
+
s.executables << 'cf-s3-inv'
|
17
|
+
s.homepage = 'https://github.com/laurilehmijoki/cf-s3-invalidator'
|
18
|
+
|
19
|
+
s.add_dependency 'aws-sdk'
|
20
|
+
end
|
@@ -3,7 +3,7 @@ require 'digest/sha1'
|
|
3
3
|
require 'net/https'
|
4
4
|
require 'base64'
|
5
5
|
|
6
|
-
# Adapted from:
|
6
|
+
# Adapted from:
|
7
7
|
# Confabulus @ http://blog.confabulus.com/2011/05/13/cloudfront-invalidation-from-ruby
|
8
8
|
class CloudfrontInvalidator
|
9
9
|
def initialize(aws_account, aws_secret, distribution)
|
@@ -13,6 +13,7 @@ class CloudfrontInvalidator
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def invalidate(items)
|
16
|
+
items = to_cf_keys(items)
|
16
17
|
date = Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z")
|
17
18
|
digest = Base64.encode64(
|
18
19
|
OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), @aws_secret, date)).strip
|
@@ -44,7 +45,7 @@ class CloudfrontInvalidator
|
|
44
45
|
|
45
46
|
def print_operation_result(http_response, items)
|
46
47
|
success = http_response.code == '201'
|
47
|
-
puts "Invalidating items"
|
48
|
+
puts "Invalidating Cloudfront items"
|
48
49
|
items.each do |item|
|
49
50
|
puts " #{item}"
|
50
51
|
end
|
@@ -52,10 +53,14 @@ class CloudfrontInvalidator
|
|
52
53
|
puts "succeeded"
|
53
54
|
else
|
54
55
|
puts "FAILED, reason:"
|
55
|
-
puts
|
56
|
+
puts http_response.body
|
56
57
|
end
|
57
58
|
end
|
58
59
|
|
60
|
+
def to_cf_keys(s3_keys)
|
61
|
+
s3_keys.map { |s3_key| "/#{s3_key}" }
|
62
|
+
end
|
63
|
+
|
59
64
|
def to_xml(items)
|
60
65
|
items.map{ |item| "<Path>#{item}</Path>" }
|
61
66
|
end
|
data/lib/s3_loader.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'aws-sdk'
|
3
|
+
|
4
|
+
class S3Loader
|
5
|
+
def initialize(key, secret)
|
6
|
+
@s3 = AWS::S3.new(
|
7
|
+
:access_key_id => key,
|
8
|
+
:secret_access_key => secret)
|
9
|
+
end
|
10
|
+
|
11
|
+
def list_keys(bucket_name)
|
12
|
+
s3_objects = []
|
13
|
+
@s3.buckets[bucket_name].objects.each do |object|
|
14
|
+
s3_objects << object.key
|
15
|
+
end
|
16
|
+
s3_objects
|
17
|
+
end
|
18
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cf-s3-invalidator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 2
|
9
9
|
- 0
|
10
|
-
version: 0.
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Lauri Lehmijoki
|
@@ -45,8 +45,13 @@ extensions: []
|
|
45
45
|
extra_rdoc_files: []
|
46
46
|
|
47
47
|
files:
|
48
|
-
-
|
48
|
+
- .gitignore
|
49
|
+
- Gemfile
|
50
|
+
- README.md
|
49
51
|
- bin/cf-s3-inv
|
52
|
+
- cf-s3-invalidator.gemspec
|
53
|
+
- lib/cloudfront_invalidator.rb
|
54
|
+
- lib/s3_loader.rb
|
50
55
|
homepage: https://github.com/laurilehmijoki/cf-s3-invalidator
|
51
56
|
licenses: []
|
52
57
|
|