fluent-plugin-s3 1.7.1 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe9afa0a2351dfffc6ea9afa0c2f3598a29b19a55fbfa22f58f3d17b606a3113
4
- data.tar.gz: e5813910a178d16ed61c2a8782e2adeb394d0d256acfbcfdbead05069d789163
3
+ metadata.gz: 1450176cd690d79412b7522ce8e67163c2f3c9c1f87941e57d6b3f3410bdf330
4
+ data.tar.gz: ee66229b8cd65ef2507feb5229d54322ed2f076e2daefb3f32e3b0e2ba47c634
5
5
  SHA512:
6
- metadata.gz: e3ca35df25975b7b57244c88d3145ab8fb5521054b863e030846a867bae6cbc9a69343f586f01b3a29d233eea787cf0ab540ff77edc0423d583394e29a192a7c
7
- data.tar.gz: d46deabb1425e03250c9bc24578ad8dacef71cc445335ac9e4122b11c6ad91cf7a73f92b63d3688848ff35d427cb6371777f0011c94c45a898a6063edc1e3d9c
6
+ metadata.gz: f0428c1da0ef734a65d86aec878374636cf4bfd10ed2ab06578d3d8a9cc8ee607e62b4a85c05144599dec2167995dbd836b70cb7cfb66f38fc38d5e82dc1073a
7
+ data.tar.gz: bb4d7820ff8fa7fa3e58092b69fc78bb4804d92854206fb61c4efa21b415519eff682cf64763a9ec237f30f8997ab20b0b395bb8f1f17a8c88a9c63b3381b02b
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ Release 1.7.2 - 2022/10/19
2
+
3
+ * in_s3: Add `event_bridge_mode` parameter
4
+ * out_s3: Fix `s3_object_key_format` check to allow `%{hex_random}` as well as `%{uuid_flush}` or `${chunk_id}`
5
+
1
6
  Release 1.7.1 - 2022/07/15
2
7
 
3
8
  * in_s3: Add `match_regexp` parameter to selectively download S3 files based on the object key
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.7.1
1
+ 1.7.2
data/docs/howto.md CHANGED
@@ -7,7 +7,7 @@ downstream processors to better identify the source of a given record.
7
7
 
8
8
  # IAM Policy
9
9
 
10
- The following is an example for a IAM policy needed to write to an s3 bucket (matches my-s3bucket/logs, my-s3bucket-test, etc.).
10
+ The following is an example for a IAM policy needed to write to an s3 bucket (matches my-s3bucket/logs, my-s3bucket/test, etc.).
11
11
 
12
12
  {
13
13
  "Version": "2012-10-17",
data/docs/input.md CHANGED
@@ -101,3 +101,7 @@ The long polling interval. Default is 20.
101
101
  ### retry_error_interval
102
102
 
103
103
  Interval to retry polling SQS if polling unsuccessful, in seconds. Default is 300.
104
+
105
+ ### event_bridge_mode
106
+ When true, Amazon S3 Event Notification should be configured using the EventBridge integration. Default is false.
107
+ See [Configure S3 event notification using EventBridge](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventBridge.html) for additional information.
@@ -110,6 +110,8 @@ module Fluent::Plugin
110
110
  config_param :wait_time_seconds, :integer, default: 20
111
111
  desc "Polling error retry interval."
112
112
  config_param :retry_error_interval, :integer, default: 300
113
+ desc "Event bridge mode"
114
+ config_param :event_bridge_mode, :bool, default: false
113
115
  end
114
116
 
115
117
  desc "Tag string"
@@ -205,10 +207,9 @@ module Fluent::Plugin
205
207
  begin
206
208
  body = Yajl.load(message.body)
207
209
  log.debug(body)
208
- next unless body["Records"] # skip test queue
210
+ next unless is_valid_queue(body) # skip test queue
209
211
  if @match_regexp
210
- s3 = body["Records"].first["s3"]
211
- raw_key = s3["object"]["key"]
212
+ raw_key = get_raw_key(body)
212
213
  key = CGI.unescape(raw_key)
213
214
  next unless @match_regexp.match?(key)
214
215
  end
@@ -226,6 +227,24 @@ module Fluent::Plugin
226
227
  end
227
228
  end
228
229
 
230
+ def is_valid_queue(body)
231
+ if @sqs.event_bridge_mode
232
+ log.debug("checking for eventbridge property")
233
+ !!body["detail"]
234
+ else
235
+ log.debug("checking for Records property")
236
+ !!body["Records"]
237
+ end
238
+ end
239
+
240
+ def get_raw_key(body)
241
+ if @sqs.event_bridge_mode
242
+ body["detail"]["object"]["key"]
243
+ else
244
+ body["Records"].first["s3"]["object"]["key"]
245
+ end
246
+ end
247
+
229
248
  def setup_credentials
230
249
  options = {}
231
250
  credentials_options = {}
@@ -318,8 +337,7 @@ module Fluent::Plugin
318
337
  end
319
338
 
320
339
  def process(body)
321
- s3 = body["Records"].first["s3"]
322
- raw_key = s3["object"]["key"]
340
+ raw_key = get_raw_key(body)
323
341
  key = CGI.unescape(raw_key)
324
342
 
325
343
  io = @bucket.object(key).get.body
@@ -471,8 +471,8 @@ module Fluent::Plugin
471
471
  end
472
472
 
473
473
  is_working_on_parallel = @buffer_config.flush_thread_count > 1 || system_config.workers > 1
474
- if is_working_on_parallel && ['${chunk_id}', '%{uuid_flush}'].none? { |key| @s3_object_key_format.include?(key) }
475
- log.warn "No ${chunk_id} or %{uuid_flush} in s3_object_key_format with multiple flush threads or multiple workers. Recommend to set ${chunk_id} or %{uuid_flush} to avoid data lost by object conflict"
474
+ if is_working_on_parallel && ['${chunk_id}', '%{uuid_flush}', '%{hex_random}'].none? { |key| @s3_object_key_format.include?(key) }
475
+ log.warn "No ${chunk_id}, %{uuid_flush} or %{hex_random} in s3_object_key_format with multiple flush threads or multiple workers. Recommend to set ${chunk_id}, %{uuid_flush} or %{hex_random} to avoid data lost by object conflict"
476
476
  end
477
477
  end
478
478
 
data/test/test_in_s3.rb CHANGED
@@ -166,9 +166,9 @@ buffer_type memory
166
166
  aws_key_id sqs_test_key_id
167
167
  </sqs>
168
168
  EOS
169
- create_driver(conf)
170
- }
171
- end
169
+ create_driver(conf)
170
+ }
171
+ end
172
172
 
173
173
  def test_sqs_with_invalid_aws_keys_missing_key_id
174
174
  assert_raise(Fluent::ConfigError, "sqs/aws_key_id or sqs/aws_sec_key is missing") {
@@ -677,4 +677,50 @@ EOS
677
677
  d.run {}
678
678
  end
679
679
  end
680
+
681
+ def test_event_bridge_mode
682
+ setup_mocks
683
+ d = create_driver("
684
+ aws_key_id test_key_id
685
+ aws_sec_key test_sec_key
686
+ s3_bucket test_bucket
687
+ buffer_type memory
688
+ check_apikey_on_start false
689
+ store_as text
690
+ format none
691
+ <sqs>
692
+ event_bridge_mode true
693
+ queue_name test_queue
694
+ queue_owner_aws_account_id 123456789123
695
+ </sqs>
696
+ ")
697
+
698
+ s3_object = stub(Object.new)
699
+ s3_response = stub(Object.new)
700
+ s3_response.body { StringIO.new("aaa") }
701
+ s3_object.get { s3_response }
702
+ @s3_bucket.object(anything).at_least(1) { s3_object }
703
+
704
+ body = {
705
+ "detail" => {
706
+ "object" => {
707
+ "key" => "test_key"
708
+ }
709
+ }
710
+ }
711
+
712
+ message = Struct::StubMessage.new(1, 1, Yajl.dump(body))
713
+ @sqs_poller.get_messages(anything, anything) do |config, stats|
714
+ config.before_request.call(stats) if config.before_request
715
+ stats.request_count += 1
716
+ if stats.request_count >= 1
717
+ d.instance.instance_variable_set(:@running, false)
718
+ end
719
+ [message]
720
+ end
721
+ d.run(expect_emits: 1)
722
+ events = d.events
723
+ assert_equal({ "message" => "aaa" }, events.first[2])
724
+ end
725
+
680
726
  end
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.7.1
4
+ version: 1.7.2
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: 2022-07-15 00:00:00.000000000 Z
12
+ date: 2022-10-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd