fog-aws 3.13.0 → 3.14.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab92d854133f8f95eaba87c66785ece83b06a57407d1bf627fe11c13d4e33f32
4
- data.tar.gz: 39cfdea2adfae9a873d4530fba16913c68883fd523bd26aa3319e551de6b4292
3
+ metadata.gz: c8af574874772df5b7a7e51819b23f554543472c6cef0b4ff86addac3b0c24b7
4
+ data.tar.gz: f5171df32eec2c204d27ce7ac7ef361d5b7bc9c0761b6b95efd347b977deb97c
5
5
  SHA512:
6
- metadata.gz: d32989087bd5bd8081a8a2b1247d1699314f5c2ea8e3be5ce2d7086c7a918b29468afd34f7ef279cc49d42c92f3907cadb82744cbf99a2828d117733ac1cea83
7
- data.tar.gz: ae8d28913f81216fbfbbb6336794fde5809e5f779ec6ea812e064b0d2accc4d1acb199895a579901ad67f6e02a878ead320b8ec438029d7fba1b51f0f4ea416a
6
+ metadata.gz: 0526c83e1825435460136d7afa5f2467e88de9171ed64fcbe0fc75871ffd2564435b310f54585de0e24e2dbb38d36fa969952c0da98787e6d43fb8128950ad36
7
+ data.tar.gz: b9282f04b1b59446ab5781154932461d9230e6ef58dde2d573dd8bc488722faa02e54b77a376bda9e1ab8391a673c44bd975f24be9e1ade9ec7b30f1b817c70f
data/CHANGELOG.md CHANGED
@@ -1,6 +1,26 @@
1
1
  # Changelog
2
2
 
3
- ## [v3.13.0](https://github.com/fog/fog-aws/tree/v3.12.0) (2022-02-12)
3
+ ## [v3.14.0](https://github.com/fog/fog-aws/tree/v3.14.0) (2022-05-09)
4
+
5
+ [Full Changelog](https://github.com/fog/fog-aws/compare/v3.13.0...HEAD)
6
+
7
+ **Closed issues:**
8
+
9
+ - Add a special note to the documentation around the danger of using directory.get [\#633](https://github.com/fog/fog-aws/issues/633)
10
+
11
+ **Merged pull requests:**
12
+
13
+ - RDD tags issue in AWS GovCloud Account regions. [\#643](https://github.com/fog/fog-aws/pull/643) ([svavhal](https://github.com/svavhal))
14
+ - Create codeql.yml [\#641](https://github.com/fog/fog-aws/pull/641) ([naveensrinivasan](https://github.com/naveensrinivasan))
15
+ - chore\(deps\): Included dependency review [\#640](https://github.com/fog/fog-aws/pull/640) ([naveensrinivasan](https://github.com/naveensrinivasan))
16
+ - Bump actions/stale from 4 to 5 [\#639](https://github.com/fog/fog-aws/pull/639) ([dependabot[bot]](https://github.com/apps/dependabot))
17
+ - Set permissions for GitHub actions [\#638](https://github.com/fog/fog-aws/pull/638) ([naveensrinivasan](https://github.com/naveensrinivasan))
18
+ - Add option to control IAM credential refresh [\#637](https://github.com/fog/fog-aws/pull/637) ([gl-gh-hchouraria](https://github.com/gl-gh-hchouraria))
19
+ - Add warning messages around directories.get [\#636](https://github.com/fog/fog-aws/pull/636) ([orrin-naylor-instacart](https://github.com/orrin-naylor-instacart))
20
+ - Bump actions/checkout from 2.4.0 to 3 [\#632](https://github.com/fog/fog-aws/pull/632) ([dependabot[bot]](https://github.com/apps/dependabot))
21
+ - Add Ruby 3.1 to the CI matrix [\#631](https://github.com/fog/fog-aws/pull/631) ([petergoldstein](https://github.com/petergoldstein))
22
+
23
+ ## [v3.13.0](https://github.com/fog/fog-aws/tree/v3.13.0) (2022-02-13)
4
24
 
5
25
  [Full Changelog](https://github.com/fog/fog-aws/compare/v3.12.0...v3.13.0)
6
26
 
data/README.md CHANGED
@@ -98,6 +98,7 @@ file = directory.files.create(key: 'user/1/Gemfile', body: File.open('Gemfile'),
98
98
  directory = s3.directories.get('gaudi-portal-dev', prefix: 'user/1/')
99
99
  directory.files
100
100
  ```
101
+ **Warning!** `s3.directories.get` retrieves and caches meta data for the first 10,000 objects in the bucket, which can be very expensive. When possible use `s3.directories.new`.
101
102
 
102
103
  #### Generating a URL for a file:
103
104
 
@@ -105,6 +106,48 @@ directory.files
105
106
  directory.files.new(key: 'user/1/Gemfile').url(Time.now + 60)
106
107
  ```
107
108
 
109
+ ##### Controlling credential refresh time with IAM authentication
110
+
111
+ When using IAM authentication with
112
+ [temporary security credentials](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html),
113
+ generated S3 pre-signed URLs
114
+ [only last as long as the temporary credential](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html).
115
+
116
+ Generating the URLs in the following manner will return a URL
117
+ that will not last as long as its requested expiration time if
118
+ the remainder of the authentication token lifetime was shorter.
119
+
120
+ ```ruby
121
+ s3 = Fog::Storage.new(provider: 'AWS', use_iam_auth: true)
122
+ directory = s3.directories.get('gaudi-portal-dev', prefix: 'user/1/')
123
+
124
+ directory.files.new(key: 'user/1/Gemfile').url(Time.now + 60)
125
+ ```
126
+
127
+ By default the temporary credentials in use are refreshed only within the last
128
+ 15 seconds of its expiration time. The URL requested with 60 seconds lifetime
129
+ using the above example will only remain valid for 15 seconds in the worst case.
130
+
131
+ The problem can be avoided by refreshing the token early and often,
132
+ by setting configuration `aws_credentials_refresh_threshold_seconds` (default: 15)
133
+ which controls the time when the refresh must occur. It is expressed in seconds
134
+ before the temporary credential's expiration time.
135
+
136
+ The following example can ensure pre-signed URLs last as long as 60 seconds
137
+ by automatically refreshing the credentials when its remainder lifetime
138
+ is lower than 60 seconds:
139
+
140
+ ```ruby
141
+ s3 = Fog::Storage.new(
142
+ provider: 'AWS',
143
+ use_iam_auth: true,
144
+ aws_credentials_refresh_threshold_seconds: 60
145
+ )
146
+ directory = s3.directories.get('gaudi-portal-dev', prefix: 'user/1/')
147
+
148
+ directory.files.new(key: 'user/1/Gemfile').url(Time.now + 60)
149
+ ```
150
+
108
151
  #### Copying a file
109
152
 
110
153
  ```ruby
@@ -123,10 +123,17 @@ module Fog
123
123
 
124
124
  private
125
125
 
126
+ # When defined, 'aws_credentials_refresh_threshold_seconds' controls
127
+ # when the credential needs to be refreshed, expressed in seconds before
128
+ # the current credential's expiration time
129
+ def credentials_refresh_threshold
130
+ @aws_credentials_refresh_threshold_seconds || 15
131
+ end
132
+
126
133
  def credentials_expired?
127
134
  @use_iam_profile &&
128
135
  (!@aws_credentials_expire_at ||
129
- (@aws_credentials_expire_at && Fog::Time.now > @aws_credentials_expire_at - 15)) #new credentials become available from around 5 minutes before expiration time
136
+ (@aws_credentials_expire_at && Fog::Time.now > @aws_credentials_expire_at - credentials_refresh_threshold)) #new credentials become available from around 5 minutes before expiration time
130
137
  end
131
138
 
132
139
  def refresh_credentials
@@ -11,6 +11,7 @@ module Fog
11
11
  load(data)
12
12
  end
13
13
 
14
+ # Warning! This retrieves and caches meta data for the first 10,000 objects in the bucket, which can be very expensive. When possible use directories.new
14
15
  def get(key, options = {})
15
16
  remap_attributes(options, {
16
17
  :delimiter => 'delimiter',
@@ -12,28 +12,30 @@ module Fog
12
12
  # * body<~Hash>:
13
13
  def add_tags_to_resource(rds_id, tags)
14
14
  keys = tags.keys.sort
15
- values = keys.map {|key| tags[key]}
15
+ values = keys.map { |key| tags[key] }
16
+ resource_name = "arn:aws:rds:#{@region}:#{owner_id}:db:#{rds_id}"
17
+ %w[us-gov-west-1 us-gov-east-1].include?(@region) ? resource_name.insert(7, '-us-gov') : resource_name
16
18
  request({
17
- 'Action' => 'AddTagsToResource',
18
- 'ResourceName' => "arn:aws:rds:#{@region}:#{owner_id}:db:#{rds_id}",
19
- :parser => Fog::Parsers::AWS::RDS::Base.new,
20
- }.merge(Fog::AWS.indexed_param('Tags.member.%d.Key', keys)).
21
- merge(Fog::AWS.indexed_param('Tags.member.%d.Value', values)))
19
+ 'Action' => 'AddTagsToResource',
20
+ 'ResourceName' => resource_name,
21
+ :parser => Fog::Parsers::AWS::RDS::Base.new
22
+ }.merge(Fog::AWS.indexed_param('Tags.member.%d.Key', keys))
23
+ .merge(Fog::AWS.indexed_param('Tags.member.%d.Value', values)))
22
24
  end
23
25
  end
24
26
 
25
27
  class Mock
26
28
  def add_tags_to_resource(rds_id, tags)
27
29
  response = Excon::Response.new
28
- if server = self.data[:servers][rds_id]
29
- self.data[:tags][rds_id].merge! tags
30
+ if server = data[:servers][rds_id]
31
+ data[:tags][rds_id].merge! tags
30
32
  response.status = 200
31
33
  response.body = {
32
- "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id }
34
+ 'ResponseMetadata' => { 'RequestId' => Fog::AWS::Mock.request_id }
33
35
  }
34
36
  response
35
37
  else
36
- raise Fog::AWS::RDS::NotFound.new("DBInstance #{rds_id} not found")
38
+ raise Fog::AWS::RDS::NotFound, "DBInstance #{rds_id} not found"
37
39
  end
38
40
  end
39
41
  end
@@ -11,11 +11,14 @@ module Fog
11
11
  # ==== Returns
12
12
  # * response<~Excon::Response>:
13
13
  # * body<~Hash>:
14
+
14
15
  def list_tags_for_resource(rds_id)
16
+ resource_name = "arn:aws:rds:#{@region}:#{owner_id}:db:#{rds_id}"
17
+ %w[us-gov-west-1 us-gov-east-1].include?(@region) ? resource_name.insert(7, '-us-gov') : resource_name
15
18
  request(
16
- 'Action' => 'ListTagsForResource',
17
- 'ResourceName' => "arn:aws:rds:#{@region}:#{owner_id}:db:#{rds_id}",
18
- :parser => Fog::Parsers::AWS::RDS::TagListParser.new
19
+ 'Action' => 'ListTagsForResource',
20
+ 'ResourceName' => resource_name,
21
+ :parser => Fog::Parsers::AWS::RDS::TagListParser.new
19
22
  )
20
23
  end
21
24
  end
@@ -23,15 +26,15 @@ module Fog
23
26
  class Mock
24
27
  def list_tags_for_resource(rds_id)
25
28
  response = Excon::Response.new
26
- if server = self.data[:servers][rds_id]
29
+ if server = data[:servers][rds_id]
27
30
  response.status = 200
28
31
  response.body = {
29
- "ListTagsForResourceResult" =>
30
- {"TagList" => self.data[:tags][rds_id]}
32
+ 'ListTagsForResourceResult' =>
33
+ { 'TagList' => data[:tags][rds_id] }
31
34
  }
32
35
  response
33
36
  else
34
- raise Fog::AWS::RDS::NotFound.new("DBInstance #{rds_id} not found")
37
+ raise Fog::AWS::RDS::NotFound, "DBInstance #{rds_id} not found"
35
38
  end
36
39
  end
37
40
  end
@@ -11,11 +11,12 @@ module Fog
11
11
  # * response<~Excon::Response>:
12
12
  # * body<~Hash>:
13
13
  def remove_tags_from_resource(rds_id, keys)
14
+ resource_name = "arn:aws:rds:#{@region}:#{owner_id}:db:#{rds_id}"
15
+ %w[us-gov-west-1 us-gov-east-1].include?(@region) ? resource_name.insert(7, '-us-gov') : resource_name
14
16
  request(
15
- { 'Action' => 'RemoveTagsFromResource',
16
- 'ResourceName' => "arn:aws:rds:#{@region}:#{owner_id}:db:#{rds_id}",
17
- :parser => Fog::Parsers::AWS::RDS::Base.new,
18
- }.merge(Fog::AWS.indexed_param('TagKeys.member.%d', keys))
17
+ { 'Action' => 'RemoveTagsFromResource',
18
+ 'ResourceName' => resource_name,
19
+ :parser => Fog::Parsers::AWS::RDS::Base.new }.merge(Fog::AWS.indexed_param('TagKeys.member.%d', keys))
19
20
  )
20
21
  end
21
22
  end
@@ -23,15 +24,15 @@ module Fog
23
24
  class Mock
24
25
  def remove_tags_from_resource(rds_id, keys)
25
26
  response = Excon::Response.new
26
- if server = self.data[:servers][rds_id]
27
- keys.each {|key| self.data[:tags][rds_id].delete key}
27
+ if server = data[:servers][rds_id]
28
+ keys.each { |key| data[:tags][rds_id].delete key }
28
29
  response.status = 200
29
30
  response.body = {
30
- "ResponseMetadata"=>{ "RequestId"=> Fog::AWS::Mock.request_id }
31
+ 'ResponseMetadata' => { 'RequestId' => Fog::AWS::Mock.request_id }
31
32
  }
32
33
  response
33
34
  else
34
- raise Fog::AWS::RDS::NotFound.new("DBInstance #{rds_id} not found")
35
+ raise Fog::AWS::RDS::NotFound, "DBInstance #{rds_id} not found"
35
36
  end
36
37
  end
37
38
  end
@@ -46,7 +46,7 @@ module Fog
46
46
  ]
47
47
 
48
48
  requires :aws_access_key_id, :aws_secret_access_key
49
- recognizes :endpoint, :region, :host, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :path_style, :acceleration, :instrumentor, :instrumentor_name, :aws_signature_version, :enable_signature_v4_streaming, :virtual_host, :cname, :max_put_chunk_size, :max_copy_chunk_size
49
+ recognizes :endpoint, :region, :host, :port, :scheme, :persistent, :use_iam_profile, :aws_session_token, :aws_credentials_expire_at, :path_style, :acceleration, :instrumentor, :instrumentor_name, :aws_signature_version, :enable_signature_v4_streaming, :virtual_host, :cname, :max_put_chunk_size, :max_copy_chunk_size, :aws_credentials_refresh_threshold_seconds
50
50
 
51
51
  secrets :aws_secret_access_key, :hmac
52
52
 
@@ -500,6 +500,8 @@ module Fog
500
500
  end
501
501
 
502
502
  def setup_credentials(options)
503
+ @aws_credentials_refresh_threshold_seconds = options[:aws_credentials_refresh_threshold_seconds]
504
+
503
505
  @aws_access_key_id = options[:aws_access_key_id]
504
506
  @aws_secret_access_key = options[:aws_secret_access_key]
505
507
  @aws_session_token = options[:aws_session_token]
@@ -577,6 +579,8 @@ module Fog
577
579
 
578
580
 
579
581
  def setup_credentials(options)
582
+ @aws_credentials_refresh_threshold_seconds = options[:aws_credentials_refresh_threshold_seconds]
583
+
580
584
  @aws_access_key_id = options[:aws_access_key_id]
581
585
  @aws_secret_access_key = options[:aws_secret_access_key]
582
586
  @aws_session_token = options[:aws_session_token]
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module AWS
3
- VERSION = "3.13.0"
3
+ VERSION = "3.14.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.13.0
4
+ version: 3.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-02-13 00:00:00.000000000 Z
12
+ date: 2022-05-09 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler