fluent-plugin-s3 1.2.1 → 1.3.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 +4 -4
- data/ChangeLog +4 -0
- data/README.md +81 -7
- data/VERSION +1 -1
- data/fluent-plugin-s3.gemspec +2 -2
- data/lib/fluent/plugin/in_s3.rb +25 -0
- data/lib/fluent/plugin/out_s3.rb +26 -1
- data/test/test_in_s3.rb +2 -0
- data/test/test_out_s3.rb +29 -0
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 01721ed2077803f70f07f527930897219b5572c9e316f9b558cd225182562971
|
4
|
+
data.tar.gz: 3c7868ecd16e92e3430f3ea8c1a585f8ed1cfc7dc22ecc6c6cfe1d75c3f36a9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d56e3bd45a7813319ccc63cee70cf664989e832151a0d1f8757b4329ff96405e39211e1dfe14a51cb2523274ab9bdf6e2d087b8ba4e4c3fa790d963986f7f5f0
|
7
|
+
data.tar.gz: b06b219b31ef293b15c200d5824f34600a15075626f6ac3591e54ce3ceb7b214fa0c90fc4b683629a3b6c9de2a5fc1f93a6be93a038f9acf301db14b8bb96e2c
|
data/ChangeLog
CHANGED
data/README.md
CHANGED
@@ -93,6 +93,51 @@ is set to 3600 seconds.
|
|
93
93
|
A unique identifier that is used by third parties when assuming roles in
|
94
94
|
their customers' accounts.
|
95
95
|
|
96
|
+
### web_identity_credentials
|
97
|
+
|
98
|
+
Similar to the assume_role_credentials, but for usage in EKS.
|
99
|
+
|
100
|
+
<match *>
|
101
|
+
@type s3
|
102
|
+
|
103
|
+
<web_identity_credentials>
|
104
|
+
role_arn ROLE_ARN
|
105
|
+
role_session_name ROLE_SESSION_NAME
|
106
|
+
web_identity_token_file AWS_WEB_IDENTITY_TOKEN_FILE
|
107
|
+
</web_identity_credentials>
|
108
|
+
</match>
|
109
|
+
|
110
|
+
See also:
|
111
|
+
|
112
|
+
* [Using IAM Roles - AWS Identity and Access
|
113
|
+
Management](http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html)
|
114
|
+
* [IAM Roles For Service Accounts](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts-technical-overview.html)
|
115
|
+
* [Aws::STS::Client](http://docs.aws.amazon.com/sdkforruby/api/Aws/STS/Client.html)
|
116
|
+
* [Aws::AssumeRoleWebIdentityCredentials](https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/AssumeRoleWebIdentityCredentials.html)
|
117
|
+
|
118
|
+
**role_arn (required)**
|
119
|
+
|
120
|
+
The Amazon Resource Name (ARN) of the role to assume.
|
121
|
+
|
122
|
+
**role_session_name (required)**
|
123
|
+
|
124
|
+
An identifier for the assumed role session.
|
125
|
+
|
126
|
+
**web_identity_token_file (required)**
|
127
|
+
|
128
|
+
The absolute path to the file on disk containing the OIDC token
|
129
|
+
|
130
|
+
**policy**
|
131
|
+
|
132
|
+
An IAM policy in JSON format.
|
133
|
+
|
134
|
+
**duration_seconds**
|
135
|
+
|
136
|
+
The duration, in seconds, of the role session. The value can range from
|
137
|
+
900 seconds (15 minutes) to 43200 seconds (12 hours). By default, the value
|
138
|
+
is set to 3600 seconds.
|
139
|
+
|
140
|
+
|
96
141
|
### instance_profile_credentials
|
97
142
|
|
98
143
|
Retrieve temporary security credentials via HTTP request. This is useful on
|
@@ -165,7 +210,7 @@ Defaults to 'default' or `[ENV]('AWS_PROFILE')`.
|
|
165
210
|
|
166
211
|
### v1.0 style
|
167
212
|
|
168
|
-
With fluentd v1
|
213
|
+
With fluentd v1 and fluent-plugin-s3 v1.0.0 or later, use new buffer configuration to dynamic parameters.
|
169
214
|
|
170
215
|
<match pattern>
|
171
216
|
@type s3
|
@@ -248,7 +293,9 @@ recommend using `s3_region` instead of `s3_endpoint`.
|
|
248
293
|
**s3_endpoint**
|
249
294
|
|
250
295
|
endpoint for S3 compatible services. For example, Riak CS based storage or
|
251
|
-
something. This option
|
296
|
+
something. This option is deprecated for AWS S3, use `s3_region` instead.
|
297
|
+
|
298
|
+
See also AWS article: [Working with Regions](https://aws.amazon.com/blogs/developer/working-with-regions/).
|
252
299
|
|
253
300
|
**enable_transfer_acceleration**
|
254
301
|
|
@@ -297,6 +344,13 @@ You can configure the length of string with a
|
|
297
344
|
`hex_random_length` parameter (Default: 4).
|
298
345
|
|
299
346
|
The default format is `%{path}%{time_slice}_%{index}.%{file_extension}`.
|
347
|
+
In addition, you can use [buffer placeholders](https://docs.fluentd.org/configuration/buffer-section#placeholders) in this parameter,
|
348
|
+
so you can embed tag, time and record value like below:
|
349
|
+
|
350
|
+
s3_object_key_format %{path}/events/%Y%m%d/${tag}_%{index}.%{file_extension}
|
351
|
+
<buffer tag,time>
|
352
|
+
# buffer parameters...
|
353
|
+
</buffer>
|
300
354
|
|
301
355
|
For instance, using the example configuration above, actual object keys on S3
|
302
356
|
will be something like:
|
@@ -352,7 +406,7 @@ See `Use your compression algorithm` section for adding another format.
|
|
352
406
|
**`<format>` or format**
|
353
407
|
|
354
408
|
Change one line format in the S3 object. Supported formats are "out_file",
|
355
|
-
"json", "ltsv"
|
409
|
+
"json", "ltsv", "single_value" and other formatter plugins. See also [official Formatter article](https://docs.fluentd.org/formatter).
|
356
410
|
|
357
411
|
* out_file (default).
|
358
412
|
|
@@ -372,7 +426,14 @@ information to the record by setting "include_tag_key" / "tag_key" and
|
|
372
426
|
"include_time_key" / "time_key" option. If you set following configuration in
|
373
427
|
S3 output:
|
374
428
|
|
375
|
-
|
429
|
+
# v1
|
430
|
+
<format>
|
431
|
+
@type json
|
432
|
+
include_time_key true
|
433
|
+
time_key log_time # default is time
|
434
|
+
</format>
|
435
|
+
# v0.12
|
436
|
+
@format json
|
376
437
|
include_time_key true
|
377
438
|
time_key log_time # default is time
|
378
439
|
|
@@ -431,21 +492,34 @@ uri of proxy environment.
|
|
431
492
|
**path**
|
432
493
|
|
433
494
|
path prefix of the files on S3. Default is "" (no prefix).
|
495
|
+
[buffer placeholder](https://docs.fluentd.org/configuration/buffer-section#placeholders) is supported,
|
496
|
+
so you can embed tag, time and record value like below.
|
434
497
|
|
435
|
-
|
498
|
+
path logs/%Y%m%d/${tag}/
|
499
|
+
<buffer tag,time>
|
500
|
+
# buffer parameters...
|
501
|
+
</buffer>
|
502
|
+
|
503
|
+
**buffer_path (for v0.12)**
|
436
504
|
|
437
505
|
path prefix of the files to buffer logs.
|
438
506
|
|
439
|
-
|
507
|
+
This parameter is for v0.12. Use `<buffer>`'s `path` in v1.
|
508
|
+
|
509
|
+
**time_slice_format(for v0.12)**
|
440
510
|
|
441
511
|
Format of the time used as the file name. Default is '%Y%m%d'. Use
|
442
512
|
'%Y%m%d%H' to split files hourly.
|
443
513
|
|
444
|
-
|
514
|
+
This parameter is for v0.12. Use buffer placeholder for `path` / `s3_object_key_format` in v1.
|
515
|
+
|
516
|
+
**time_slice_wait(for v0.12)**
|
445
517
|
|
446
518
|
The time to wait old logs. Default is 10 minutes. Specify larger value if
|
447
519
|
old logs may reach.
|
448
520
|
|
521
|
+
This parameter is for v0.12. Use `<buffer>`'s `timekey_wait` in v1.
|
522
|
+
|
449
523
|
**utc**
|
450
524
|
|
451
525
|
Use UTC instead of local time.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
data/fluent-plugin-s3.gemspec
CHANGED
@@ -17,8 +17,8 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.require_paths = ['lib']
|
18
18
|
|
19
19
|
gem.add_dependency "fluentd", [">= 0.14.22", "< 2"]
|
20
|
-
gem.add_dependency "aws-sdk-s3", "~> 1.
|
21
|
-
gem.add_dependency "aws-sdk-sqs", "~> 1.
|
20
|
+
gem.add_dependency "aws-sdk-s3", "~> 1.60"
|
21
|
+
gem.add_dependency "aws-sdk-sqs", "~> 1.23"
|
22
22
|
gem.add_development_dependency "rake", ">= 0.9.2"
|
23
23
|
gem.add_development_dependency "test-unit", ">= 3.0.8"
|
24
24
|
gem.add_development_dependency "test-unit-rr", ">= 1.0.3"
|
data/lib/fluent/plugin/in_s3.rb
CHANGED
@@ -42,6 +42,20 @@ module Fluent::Plugin
|
|
42
42
|
desc "A unique identifier that is used by third parties when assuming roles in their customers' accounts."
|
43
43
|
config_param :external_id, :string, default: nil
|
44
44
|
end
|
45
|
+
# See the following link for additional params that could be added:
|
46
|
+
# https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS/Client.html#assume_role_with_web_identity-instance_method
|
47
|
+
config_section :web_identity_credentials, multi: false do
|
48
|
+
desc "The Amazon Resource Name (ARN) of the role to assume"
|
49
|
+
config_param :role_arn, :string # required
|
50
|
+
desc "An identifier for the assumed role session"
|
51
|
+
config_param :role_session_name, :string #required
|
52
|
+
desc "The absolute path to the file on disk containing the OIDC token"
|
53
|
+
config_param :web_identity_token_file, :string #required
|
54
|
+
desc "An IAM policy in JSON format"
|
55
|
+
config_param :policy, :string, default: nil
|
56
|
+
desc "The duration, in seconds, of the role session (900-43200)"
|
57
|
+
config_param :duration_seconds, :integer, default: nil
|
58
|
+
end
|
45
59
|
config_section :instance_profile_credentials, multi: false do
|
46
60
|
desc "Number of times to retry when retrieving credentials"
|
47
61
|
config_param :retries, :integer, default: nil
|
@@ -202,6 +216,17 @@ module Fluent::Plugin
|
|
202
216
|
credentials_options[:client] = Aws::STS::Client.new(:region => @s3_region)
|
203
217
|
end
|
204
218
|
options[:credentials] = Aws::AssumeRoleCredentials.new(credentials_options)
|
219
|
+
when @web_identity_credentials
|
220
|
+
c = @web_identity_credentials
|
221
|
+
credentials_options[:role_arn] = c.role_arn
|
222
|
+
credentials_options[:role_session_name] = c.role_session_name
|
223
|
+
credentials_options[:web_identity_token_file] = c.web_identity_token_file
|
224
|
+
credentials_options[:policy] = c.policy if c.policy
|
225
|
+
credentials_options[:duration_seconds] = c.duration_seconds if c.duration_seconds
|
226
|
+
if @s3_region
|
227
|
+
credentials_options[:client] = Aws::STS::Client.new(:region => @s3_region)
|
228
|
+
end
|
229
|
+
options[:credentials] = Aws::AssumeRoleWebIdentityCredentials.new(credentials_options)
|
205
230
|
when @instance_profile_credentials
|
206
231
|
c = @instance_profile_credentials
|
207
232
|
credentials_options[:retries] = c.retries if c.retries
|
data/lib/fluent/plugin/out_s3.rb
CHANGED
@@ -40,6 +40,20 @@ module Fluent::Plugin
|
|
40
40
|
desc "A unique identifier that is used by third parties when assuming roles in their customers' accounts."
|
41
41
|
config_param :external_id, :string, default: nil, secret: true
|
42
42
|
end
|
43
|
+
# See the following link for additional params that could be added:
|
44
|
+
# https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/STS/Client.html#assume_role_with_web_identity-instance_method
|
45
|
+
config_section :web_identity_credentials, multi: false do
|
46
|
+
desc "The Amazon Resource Name (ARN) of the role to assume"
|
47
|
+
config_param :role_arn, :string # required
|
48
|
+
desc "An identifier for the assumed role session"
|
49
|
+
config_param :role_session_name, :string #required
|
50
|
+
desc "The absolute path to the file on disk containing the OIDC token"
|
51
|
+
config_param :web_identity_token_file, :string #required
|
52
|
+
desc "An IAM policy in JSON format"
|
53
|
+
config_param :policy, :string, default: nil
|
54
|
+
desc "The duration, in seconds, of the role session (900-43200)"
|
55
|
+
config_param :duration_seconds, :integer, default: nil
|
56
|
+
end
|
43
57
|
config_section :instance_profile_credentials, multi: false do
|
44
58
|
desc "Number of times to retry when retrieving credentials"
|
45
59
|
config_param :retries, :integer, default: nil
|
@@ -175,7 +189,7 @@ module Fluent::Plugin
|
|
175
189
|
end
|
176
190
|
|
177
191
|
unless @index_format =~ /^%(0\d*)?[dxX]$/
|
178
|
-
raise Fluent::ConfigError, "index_format parameter should follow `%[flags][width]type`. `0` is the only supported flag, and is mandatory if width is specified. `d`, `x` and `X` are supported types"
|
192
|
+
raise Fluent::ConfigError, "index_format parameter should follow `%[flags][width]type`. `0` is the only supported flag, and is mandatory if width is specified. `d`, `x` and `X` are supported types"
|
179
193
|
end
|
180
194
|
|
181
195
|
if @reduced_redundancy
|
@@ -460,6 +474,17 @@ module Fluent::Plugin
|
|
460
474
|
credentials_options[:client] = Aws::STS::Client.new(region: @s3_region)
|
461
475
|
end
|
462
476
|
options[:credentials] = Aws::AssumeRoleCredentials.new(credentials_options)
|
477
|
+
when @web_identity_credentials
|
478
|
+
c = @web_identity_credentials
|
479
|
+
credentials_options[:role_arn] = c.role_arn
|
480
|
+
credentials_options[:role_session_name] = c.role_session_name
|
481
|
+
credentials_options[:web_identity_token_file] = c.web_identity_token_file
|
482
|
+
credentials_options[:policy] = c.policy if c.policy
|
483
|
+
credentials_options[:duration_seconds] = c.duration_seconds if c.duration_seconds
|
484
|
+
if @s3_region
|
485
|
+
credentials_options[:client] = Aws::STS::Client.new(:region => @s3_region)
|
486
|
+
end
|
487
|
+
options[:credentials] = Aws::AssumeRoleWebIdentityCredentials.new(credentials_options)
|
463
488
|
when @instance_profile_credentials
|
464
489
|
c = @instance_profile_credentials
|
465
490
|
credentials_options[:retries] = c.retries if c.retries
|
data/test/test_in_s3.rb
CHANGED
@@ -11,6 +11,7 @@ require 'fluent/plugin/in_s3'
|
|
11
11
|
require 'test/unit/rr'
|
12
12
|
require 'zlib'
|
13
13
|
require 'fileutils'
|
14
|
+
require 'ostruct'
|
14
15
|
|
15
16
|
include Fluent::Test::Helpers
|
16
17
|
|
@@ -152,6 +153,7 @@ EOS
|
|
152
153
|
|
153
154
|
def setup_mocks
|
154
155
|
@s3_client = stub(Aws::S3::Client.new(stub_responses: true))
|
156
|
+
stub(@s3_client).config { OpenStruct.new({region: "us-east-1"}) }
|
155
157
|
mock(Aws::S3::Client).new(anything).at_least(0) { @s3_client }
|
156
158
|
@s3_resource = mock(Aws::S3::Resource.new(client: @s3_client))
|
157
159
|
mock(Aws::S3::Resource).new(client: @s3_client) { @s3_resource }
|
data/test/test_out_s3.rb
CHANGED
@@ -10,6 +10,7 @@ require 'zlib'
|
|
10
10
|
require 'fileutils'
|
11
11
|
require 'timecop'
|
12
12
|
require 'uuidtools'
|
13
|
+
require 'ostruct'
|
13
14
|
|
14
15
|
include Fluent::Test::Helpers
|
15
16
|
|
@@ -427,6 +428,7 @@ EOC
|
|
427
428
|
|
428
429
|
def setup_mocks(exists_return = false)
|
429
430
|
@s3_client = stub(Aws::S3::Client.new(stub_responses: true))
|
431
|
+
stub(@s3_client).config { OpenStruct.new({region: "us-east-1"}) }
|
430
432
|
# aws-sdk-s3 calls Client#put_object inside Object#put
|
431
433
|
mock(@s3_client).put_object(anything).at_least(0) { MockResponse.new({}) }
|
432
434
|
mock(Aws::S3::Client).new(anything).at_least(0) { @s3_client }
|
@@ -464,6 +466,7 @@ EOC
|
|
464
466
|
|
465
467
|
def setup_mocks_hardened_policy()
|
466
468
|
@s3_client = stub(Aws::S3::Client.new(:stub_responses => true))
|
469
|
+
stub(@s3_client).config { OpenStruct.new({region: "us-east-1"}) }
|
467
470
|
mock(@s3_client).put_object(anything).at_least(0) { MockResponse.new({}) }
|
468
471
|
mock(Aws::S3::Client).new(anything).at_least(0) { @s3_client }
|
469
472
|
@s3_resource = mock(Aws::S3::Resource.new(:client => @s3_client))
|
@@ -564,6 +567,32 @@ EOC
|
|
564
567
|
assert_equal(expected_credentials, credentials)
|
565
568
|
end
|
566
569
|
|
570
|
+
def test_web_identity_credentials
|
571
|
+
expected_credentials = Aws::Credentials.new("test_key", "test_secret")
|
572
|
+
mock(Aws::AssumeRoleWebIdentityCredentials).new(
|
573
|
+
role_arn: "test_arn",
|
574
|
+
role_session_name: "test_session",
|
575
|
+
web_identity_token_file: "test_file",
|
576
|
+
client: anything
|
577
|
+
){
|
578
|
+
expected_credentials
|
579
|
+
}
|
580
|
+
|
581
|
+
config = CONFIG_TIME_SLICE.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
|
582
|
+
config += %[
|
583
|
+
<web_identity_credentials>
|
584
|
+
role_arn test_arn
|
585
|
+
role_session_name test_session
|
586
|
+
web_identity_token_file test_file
|
587
|
+
</web_identity_credentials>
|
588
|
+
]
|
589
|
+
d = create_time_sliced_driver(config)
|
590
|
+
assert_nothing_raised { d.run {} }
|
591
|
+
client = d.instance.instance_variable_get(:@s3).client
|
592
|
+
credentials = client.config.credentials
|
593
|
+
assert_equal(expected_credentials, credentials)
|
594
|
+
end
|
595
|
+
|
567
596
|
def test_instance_profile_credentials
|
568
597
|
expected_credentials = Aws::Credentials.new("test_key", "test_secret")
|
569
598
|
mock(Aws::InstanceProfileCredentials).new({}).returns(expected_credentials)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-s3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-02-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: fluentd
|
@@ -37,28 +37,28 @@ dependencies:
|
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.60'
|
41
41
|
type: :runtime
|
42
42
|
prerelease: false
|
43
43
|
version_requirements: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '1.
|
47
|
+
version: '1.60'
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: aws-sdk-sqs
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '1.
|
54
|
+
version: '1.23'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
57
|
version_requirements: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '1.
|
61
|
+
version: '1.23'
|
62
62
|
- !ruby/object:Gem::Dependency
|
63
63
|
name: rake
|
64
64
|
requirement: !ruby/object:Gem::Requirement
|