configure-s3-website-ng 3.0.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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 123b9ee34cdac1ba9fd0c83c923c0ffc100ef7a1791bc7af0f8245d808fc8f50
4
+ data.tar.gz: 19a34cd18c1c96ce5e48866092c5831647417fb251340da58112e937d69e3a10
5
+ SHA512:
6
+ metadata.gz: 8fec4eeeafef40128d1f4659d86499ec5ab0040611f64754ffff56b36007c9eb794a5a501540e29d3fbd395da4c139918a9d76e7e7983b21fb2144fb48f000ea
7
+ data.tar.gz: a9fba0235261025ffac457682cb83d4ba71c82fa1839f00c8a46c5dda91cec36fd865e2e8bc6257d73c88735c1c3cc9c5d736c5e2fa20c50083f83eb4259ad8f
data/.gitignore ADDED
@@ -0,0 +1,3 @@
1
+ tmp
2
+ pkg
3
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.0
4
+ - 2.2.0
5
+ - 2.3.0
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (C) 2012 Lauri lehmijoki
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7
+ of the Software, and to permit persons to whom the Software is furnished to do
8
+ so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,280 @@
1
+ # Notice
2
+
3
+ This project is a fork from Lauri Lehmijoki's [configure-s3-website](https://github.com/laurilehmijoki/configure-s3-website). The upstream project [is not actively maintained](https://github.com/laurilehmijoki/configure-s3-website/issues/26#issuecomment-1586534812).
4
+
5
+ The gem has been renamed to configure-s3-website-ng to allow uploading to RubyGems without collisions.
6
+
7
+ The original README follows.
8
+
9
+ # Configure-s3-website
10
+
11
+ [![Build Status](https://secure.travis-ci.org/laurilehmijoki/configure-s3-website.png)](http://travis-ci.org/laurilehmijoki/configure-s3-website)
12
+ [![Gem Version](https://fury-badge.herokuapp.com/rb/configure-s3-website.png)](http://badge.fury.io/rb/configure-s3-website)
13
+
14
+ Configure an AWS S3 bucket to function as a website easily from a command-line interface.
15
+
16
+ The bucket may or may not exist. If the bucket does not exist,
17
+ `configure-s3-website` will create it.
18
+
19
+ For deploying websites to S3, consider using [s3_website](https://github.com/laurilehmijoki/s3_website).
20
+
21
+ ## Install
22
+
23
+ gem install configure-s3-website
24
+
25
+ ## Usage
26
+
27
+ Create a file that contains the name of your AWS profile with access to S3 and the name of the bucket:
28
+
29
+ ```yaml
30
+ profile: name-of-your-aws-profile-with-access
31
+ s3_bucket: name-of-your-bucket
32
+ ```
33
+
34
+ **or** create a file that contains the S3 credentials and the name of the bucket:
35
+
36
+ ```yaml
37
+ s3_id: your-aws-access-key
38
+ s3_secret: your-aws-secret-key
39
+ s3_bucket: name-of-your-bucket
40
+ ```
41
+
42
+ **or** you may omit the `profile` and `s3_id` keys to use the system's default credentials.
43
+ This requires [configuring AWS credentials](http://docs.aws.amazon.com/sdk-for-ruby/v2/developer-guide/setup-config.html#aws-ruby-sdk-setting-credentials).
44
+ Options include [setting environment variables](http://docs.aws.amazon.com/sdk-for-ruby/v2/developer-guide/setup-config.html#aws-ruby-sdk-credentials-environment),
45
+ using a [shared credentials file](http://docs.aws.amazon.com/sdk-for-ruby/v2/developer-guide/setup-config.html#aws-ruby-sdk-credentials-shared),
46
+ or running an [EC2 instance with IAM roles](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#UsingIAMrolesWithAmazonEC2Instances).
47
+
48
+ Save the file (as *config.yml*, for example). Now you are ready to go. Run the
49
+ following command:
50
+
51
+ configure-s3-website --config-file config.yml
52
+
53
+ Congratulations! You now have an S3 bucket that can act as a website server for
54
+ you.
55
+
56
+ ### Deliver your website via CloudFront
57
+
58
+ This gem can create new CloudFront distributions and update existing ones.
59
+
60
+ #### Creating a new distribution
61
+
62
+ `configure-s3-website` can create a CloudFront distribution for you. It will ask
63
+ you whether you want to deliver your website via the CDN. If you answer yes,
64
+ `configure-s3-website` will create a CloudFront distribution that has the
65
+ configured S3 bucket as its origin. In addition, it will add the entry
66
+ `cloudfront_distribution_id: [id-of-the-new-distribution]` into your
67
+ configuration file.
68
+
69
+ CloudFront can be configured in various ways. However, the distribution created
70
+ by `configure-s3-website` uses sensible defaults for an S3-based website and
71
+ thus saves you the burden of figuring out how to configure CloudFront. For
72
+ example, it assumes that your default root object is *index.html*.
73
+
74
+ You can see all the settings this gem applies on the new distribution by running
75
+ the command in verbose mode:
76
+
77
+ configure-s3-website --config-file config.yml --verbose
78
+
79
+ Note that if you already have the key `cloudfront_distribution_id` in your
80
+ configuration file, `configure-s3-website` will not create a new distribution.
81
+ Conversely, if you remove the `cloudfront_distribution_id` key from the file and
82
+ run `configure-s3-website` again, it will create you a new distribution.
83
+
84
+ ##### Creating a new distribution with custom settings
85
+
86
+ If the default settings do not suit you, you can create a new distribution with
87
+ your settings by adding `cloudfront_distribution_config` values into your config
88
+ file. For example:
89
+
90
+ ```yaml
91
+ cloudfront_distribution_config:
92
+ default_cache_behavior:
93
+ min_ttl: 600
94
+ aliases:
95
+ quantity: 1
96
+ items:
97
+ - your.domain.net
98
+ ```
99
+
100
+ See the section below for more information about the valid values of the
101
+ `cloudfront_distribution_config` setting.
102
+
103
+ If you want to, you can look at the distribution settings on the management console
104
+ at <https://console.aws.amazon.com/cloudfront>.
105
+
106
+ #### Updating an existing distribution
107
+
108
+ You can modify an existing CloudFront distribution by defining the id of the
109
+ distribution and the configs you wish to override the defaults with.
110
+
111
+ Let's say your config file contains the following fragment:
112
+
113
+ ```yaml
114
+ cloudfront_distribution_id: AXSAXSSE134
115
+ cloudfront_distribution_config:
116
+ default_cache_behavior:
117
+ min_ttl: 600
118
+ default_root_object: index.json
119
+ ```
120
+
121
+ When you invoke `configure-s3-website`, it will overwrite the default value of
122
+ *default_cache_behavior's* *min_ttl* as well as the default value of
123
+ *default_root_object* setting in the [default distribution configs](#default-distribution-configs).
124
+
125
+ This gem generates `<DistributionConfig>` of the CloudFront REST API. For
126
+ reference, see
127
+ <http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/GetConfig.html#GetConfig_Responses>
128
+ (example) and
129
+ <https://cloudfront.amazonaws.com/doc/2012-07-01/AmazonCloudFrontCommon.xsd>
130
+ (XSD). In other words, When you call `configure-s3-website`, it will turn the values of your
131
+ `cloudfront_distribution_config` into XML, include them in the
132
+ `<DistributionConfig>` element and send them to the CloudFront REST API.
133
+
134
+ The YAML keys in the config file will be turned into CloudFront REST API XML
135
+ with the same logic as in [configuring redirects](#configuring-redirects).
136
+
137
+ Having the distribution settings in the config file is handy, because it allows
138
+ you to store most (in many cases all) website deployment settings in one file.
139
+
140
+ #### Default distribution configs
141
+
142
+ Below is the default CloudFront distribution config. It is built based on the
143
+ API version 2012-07-01 of [DistributionConfig Complex
144
+ Type](http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html).
145
+
146
+ ```ruby
147
+ {
148
+ 'caller_reference' => 'configure-s3-website gem [generated-timestamp]',
149
+ 'default_root_object' => 'index.html',
150
+ 'logging' => {
151
+ 'enabled' => 'false',
152
+ 'include_cookies' => 'false',
153
+ 'bucket' => '',
154
+ 'prefix' => ''
155
+ },
156
+ 'enabled' => 'true',
157
+ 'comment' => 'Created by the configure-s3-website gem',
158
+ 'aliases' => {
159
+ 'quantity' => '0'
160
+ },
161
+ 'default_cache_behavior' => {
162
+ 'target_origin_id' => '[generated-string]',
163
+ 'trusted_signers' => {
164
+ 'enabled' => 'false',
165
+ 'quantity' => '0'
166
+ },
167
+ 'forwarded_values' => {
168
+ 'query_string' => 'true',
169
+ 'cookies' => {
170
+ 'forward' => 'all'
171
+ }
172
+ },
173
+ 'viewer_protocol_policy' => 'allow-all',
174
+ 'min_ttl' => '86400'
175
+ },
176
+ 'cache_behaviors' => {
177
+ 'quantity' => '0'
178
+ },
179
+ 'price_class' => 'PriceClass_All'
180
+ }
181
+ ```
182
+
183
+ ### Specifying a non-standard S3 endpoint
184
+
185
+ By default, `configure-s3-website` creates the S3 website into the US Standard
186
+ region.
187
+
188
+ If you want to create the website into another region, add into the
189
+ configuration file a row like this:
190
+
191
+ s3_endpoint: EU
192
+
193
+ The valid *s3_endpoint* values consist of the [S3 location constraint
194
+ values](http://docs.amazonwebservices.com/general/latest/gr/rande.html#s3_region).
195
+
196
+
197
+ ### Specifying non-standard index or error documents
198
+
199
+ By default, `configure-s3-website` uses `index.html` for the index document and `error.html` for the error document.
200
+
201
+ You can override either or both of these defaults like this:
202
+
203
+ index_document: default.html
204
+ error_document: 404.html
205
+
206
+ You can specify the name of any document in the bucket.
207
+
208
+
209
+ ### Configuring redirects
210
+
211
+ You can configure redirects on your S3 website by adding `routing_rules` into
212
+ the config file.
213
+
214
+ Here is an example:
215
+
216
+ ````yaml
217
+ routing_rules:
218
+ - condition:
219
+ key_prefix_equals: blog/some_path
220
+ redirect:
221
+ host_name: blog.example.com
222
+ replace_key_prefix_with: some_new_path/
223
+ http_redirect_code: 301
224
+ ````
225
+
226
+ You can use any routing rule property that the [REST
227
+ API](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html)
228
+ supports. All you have to do is to replace the uppercase letter in AWS XML with
229
+ an underscore and an undercase version of the same letter. For example,
230
+ `KeyPrefixEquals` becomes `key_prefix_equals` in the config file.
231
+
232
+ Apply the rules by invoking `configure-s3-website --config [your-config-file]`
233
+ on the command-line interface. You can verify the results by looking at your
234
+ bucket on the [S3 console](https://console.aws.amazon.com/s3/home).
235
+
236
+ ## How does `configure-s3-website` work?
237
+
238
+ `configure-s3-website` uses the AWS REST API of S3 for creating and modifying
239
+ the bucket. In brief, it does the following things:
240
+
241
+ 1. Create a bucket for you (if it does not yet exist)
242
+ 2. Add the website configuration on the bucket via the [website REST
243
+ API](http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html)
244
+ 3. Make the bucket **readable to the whole world**
245
+ 4. Apply the redirect (a.k.a routing) rules on the bucket website
246
+
247
+ When interacting with CloudFront, `configure-s3-website` uses the [POST
248
+ Distribution](http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/CreateDistribution.html),
249
+ [GET
250
+ Distribution](http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/GetDistribution.html) and [PUT Distribution Config](http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/PutConfig.html) APIs.
251
+
252
+ ### Running headlessly
253
+
254
+ Use the `--headless` option to run without user interaction. If you add the
255
+ `--autocreate-cloudfront-dist` option, `configure-s3-website` will automatically
256
+ create a CloudFront distribution for your S3 website.
257
+
258
+ ## Development
259
+
260
+ * This project uses [Semantic Versioning](http://semver.org)
261
+
262
+ ## Credit
263
+
264
+ Created by Lauri Lehmijoki.
265
+
266
+ Big thanks to the following contributors (in alphabetical order):
267
+
268
+ * SlawD
269
+ * Steve Schwartz
270
+ * Toby Marsden
271
+
272
+ ## Supported Ruby versions
273
+
274
+ The file `.travis.yml` defines the officially supported Ruby versions. This gem
275
+ might work on other versions as well, but they are not covered with continuous
276
+ integration.
277
+
278
+ ## License
279
+
280
+ See the file LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ desc "Build the project"
5
+ task :default => 'test'
6
+
7
+ desc "Run tests"
8
+ task :test do
9
+ sh "bundle exec rspec"
10
+ end
11
+
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
+
5
+ require 'optparse'
6
+ require 'configure-s3-website'
7
+
8
+ options, optparse = ConfigureS3Website::CLI.optparse_and_options
9
+
10
+ optparse.parse!
11
+
12
+ ConfigureS3Website::Runner.run(options)
data/changelog.md ADDED
@@ -0,0 +1,157 @@
1
+ # Changelog
2
+
3
+ This project uses [Semantic Versioning](http://semver.org).
4
+
5
+ ## 2.3.0
6
+
7
+ * Add support for default credentials providers
8
+
9
+ ## 2.2.0
10
+
11
+ * Convert `http_error_code_returned_equals` value to string
12
+
13
+ ## 2.1.0
14
+
15
+ * Add ability to use an AWS profile instead of explicit `s3_id` and `s3_secret`
16
+
17
+ ## 2.0.0
18
+
19
+ ### Breaking changes
20
+
21
+ The CloudFront integration now uses the official Ruby AWS
22
+ SDK. As a consequence, the accepted format of the
23
+ `cloudfront_distribution_config` is slightly different.
24
+
25
+ Below are some examples of changes that you have to perform, depending on the
26
+ contents of your `cloudfront_distribution_config` setting.
27
+
28
+ * Rename `min_TTL` -> `min_ttl`
29
+ * Change
30
+
31
+ ```yaml
32
+ aliases:
33
+ quantity: 1
34
+ items:
35
+ CNAME: my.site.net
36
+ ```
37
+
38
+ to
39
+
40
+ ```yaml
41
+ aliases:
42
+ quantity: 1
43
+ items:
44
+ - my.site.net
45
+ ```
46
+
47
+ * There might be other incompatible settings in your old configuration, but
48
+ should them exist, the AWS SDK client will print you a helpful error and then
49
+ safely exit. If this happens, just fix the problems that the CloudFront client
50
+ reports and try again.
51
+
52
+ Also, the arrays in hashes are now merged:
53
+
54
+ ```
55
+ source = {:x => [{:y => 1}]}
56
+ dest = {:x => [{:z => 2}]}
57
+ # merge...
58
+ Results: {:x => [{:y => 1, :z => 2}]}
59
+ ```
60
+
61
+ With the help of array merging, given your config file contains the following
62
+ setting:
63
+
64
+ ```yaml
65
+ cloudfront_distribution_config:
66
+ origins:
67
+ items:
68
+ - origin_path: /subfolder
69
+ ```
70
+
71
+ ... `configure-s3-website` will include the `origin_path` setting within the
72
+ properties of the first element in the `items` array of your distribution
73
+ settings.
74
+
75
+ ## 1.7.5
76
+
77
+ * Fix CreateBucket broken in 1.7.4
78
+
79
+ ## 1.7.4
80
+
81
+ * Support all AWS regions
82
+
83
+ ## 1.7.3
84
+
85
+ * see <https://github.com/laurilehmijoki/configure-s3-website/pull/13>
86
+
87
+ ## 1.7.2
88
+
89
+ * See <https://github.com/laurilehmijoki/configure-s3-website/pull/11>
90
+
91
+ ## 1.7.1
92
+
93
+ * Change CloudFront `OriginProtocolPolicy` to `http-only`
94
+
95
+ See <https://github.com/laurilehmijoki/s3_website/issues/152> for discussion.
96
+
97
+ ## 1.7.0
98
+
99
+ * Add eu-central-1 Region
100
+
101
+ ## 1.6.0
102
+
103
+ * Add switches `--headless` and `--autocreate-cloudfront-dist`
104
+
105
+ ## 1.5.5
106
+
107
+ * Fix bug that prevented creating new CloudFront distributions in the EU region
108
+
109
+ ## 1.5.4
110
+
111
+ * Remove usage of the deprecated OpenSSL::Digest::Digest
112
+
113
+ ## 1.5.3
114
+
115
+ * Do not override ERB code when adding CloudFront dist
116
+
117
+ ## 1.5.2
118
+
119
+ * Support location constraint eu-west-1
120
+
121
+ ## 1.5.1
122
+
123
+ * Use the S3 website domain as the Cloudfront origin
124
+
125
+ Replace `S3OriginConfig` with `CustomOriginConfig`. This solves the issue
126
+ https://github.com/laurilehmijoki/configure-s3-website/issues/6.
127
+
128
+ ## 1.5.0
129
+
130
+ * Add support for custom index and error documents
131
+
132
+ ## 1.4.0
133
+
134
+ * Allow the user to store his CloudFront settings in the config file
135
+ * Support updating configs of an existing CloudFront distribution
136
+ * Support creating of new distros with custom CloudFront configs
137
+
138
+ ## 1.3.0
139
+
140
+ * Create a CloudFront distro if the user wants to deliver his S3 website via the
141
+ CDN
142
+
143
+ ## 1.2.0
144
+
145
+ * Support configuring redirects on the S3 website
146
+
147
+ ## 1.1.2
148
+
149
+ * Use UTC time when signing requests
150
+
151
+ ## 1.1.1
152
+
153
+ * Do not send the location constraint XML when using the standard region
154
+
155
+ ## 1.1.0
156
+
157
+ * Add support for non-standard AWS regions
@@ -0,0 +1,23 @@
1
+ require File.join([File.dirname(__FILE__),'lib','configure-s3-website','version.rb'])
2
+ spec = Gem::Specification.new do |s|
3
+ s.name = 'configure-s3-website-ng'
4
+ s.version = ConfigureS3Website::VERSION
5
+ s.author = ['Ingelabs', 'Lauri Lehmijoki']
6
+ s.email = 'info@ingelabs.com'
7
+ s.homepage = 'https://github.com/ingelabs/configure-s3-website'
8
+ s.platform = Gem::Platform::RUBY
9
+ s.summary = 'Fork of configure-s3-website - Configure your AWS S3 bucket to function as a web site'
10
+ s.bindir = 'bin'
11
+
12
+ s.add_dependency 'deep_merge', '~> 1.0.0'
13
+ s.add_dependency 'aws-sdk', '~> 2'
14
+
15
+ s.add_development_dependency 'rspec', '~> 3'
16
+ s.add_development_dependency 'rspec-expectations', '~> 3'
17
+ s.add_development_dependency 'rake', '~> 0.9.0'
18
+
19
+ s.files = `git ls-files`.split("\n")
20
+ s.test_files = `git ls-files -- {spec}/*`.split("\n")
21
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
22
+ s.require_paths = ["lib"]
23
+ end
@@ -0,0 +1,43 @@
1
+ module ConfigureS3Website
2
+ class CLI
3
+ def self.optparse_and_options
4
+ options = {}
5
+ optparse = OptionParser.new do |opts|
6
+ opts.banner = banner
7
+ opts.on('--headless',
8
+ 'Run without interaction from the user. See the --autocreate-cloudfront-dist for more info.') do
9
+ options[:headless] = true
10
+ end
11
+ opts.on('--autocreate-cloudfront-dist',
12
+ 'When running with --headless, automatically create a CloudFront distribution for your S3 website.') do
13
+ options['autocreate-cloudfront-dist'] = true
14
+ end
15
+ opts.on('-f', '--config-file FILE',
16
+ 'Pick credentials and the S3 bucket name from a config file') do
17
+ |yaml_file_path|
18
+ options[:config_source] =
19
+ ConfigureS3Website::FileConfigSource.new yaml_file_path
20
+ end
21
+ opts.on('-v', '--verbose', 'Print more stuff') do
22
+ options[:verbose] = true
23
+ end
24
+ opts.on('--help', 'Display this screen') do
25
+ puts opts
26
+ exit
27
+ end
28
+ end
29
+ [options, optparse]
30
+ end
31
+
32
+ private
33
+
34
+ def self.banner
35
+ %|Usage: #{File.basename(__FILE__)} arguments
36
+
37
+ Configure your S3 bucket to function as a web site
38
+
39
+ Arguments:
40
+ |
41
+ end
42
+ end
43
+ end