@@ -76,8 +76,8 @@ def initialize
76
76
desc "Profile name. Default to 'default' or ENV['AWS_PROFILE']"
77
77
config_param :profile_name , :string , default : nil
78
78
end
79
- desc "S3 bucket name"
80
- config_param :s3_bucket , :string
79
+ desc "S3 bucket name(s) separated by commas in case of multiple bucket names "
80
+ config_param :s3_buckets , :string
81
81
desc "S3 region name"
82
82
config_param :s3_region , :string , default : ENV [ "AWS_REGION" ] || "us-east-1"
83
83
desc "Use 's3_region' instead"
@@ -96,6 +96,8 @@ def initialize
96
96
config_param :queue_name , :string , default : nil
97
97
desc "SQS Owner Account ID"
98
98
config_param :queue_owner_aws_account_id , :string , default : nil
99
+ desc "SQS queue url, when passed it'll not get the queue URL by name & account ID"
100
+ config_param :queue_url , :string , default : nil
99
101
desc "Use 's3_region' instead"
100
102
config_param :endpoint , :string , default : nil
101
103
desc "Skip message deletion"
@@ -106,6 +108,7 @@ def initialize
106
108
config_param :retry_error_interval , :integer , default : 300
107
109
end
108
110
111
+ # Default tag will include input.s3.bucket_name ###Check the function process(body)
109
112
desc "Tag string"
110
113
config_param :tag , :string , default : "input.s3"
111
114
@@ -145,16 +148,29 @@ def start
145
148
s3_client = create_s3_client
146
149
log . debug ( "Succeeded to create S3 client" )
147
150
@s3 = Aws ::S3 ::Resource . new ( client : s3_client )
148
- @bucket = @s3 . bucket ( @s3_bucket )
149
-
150
- raise "#{ @bucket . name } is not found." unless @bucket . exists?
151
+ @buckets = { }
152
+ if ( @s3_buckets . include? ( "," ) )
153
+ splitted_buckets = @s3_buckets . split ( ',' )
154
+ splitted_buckets . each do | bucket |
155
+ @buckets [ bucket ] = @s3 . bucket ( bucket )
156
+ raise "#{ bucket } is not found." unless @buckets [ bucket ] . exists?
157
+ end
158
+ else
159
+ @buckets [ bucket ] = @s3 . bucket ( @s3_buckets )
160
+ raise "#{ bucket } is not found." unless @buckets [ bucket ] . exists?
161
+ end
151
162
152
163
check_apikeys if @check_apikey_on_start
153
164
154
165
sqs_client = create_sqs_client
155
166
log . debug ( "Succeeded to create SQS client" )
156
- response = sqs_client . get_queue_url ( queue_name : @sqs . queue_name , queue_owner_aws_account_id : @sqs . queue_owner_aws_account_id )
157
- sqs_queue_url = response . queue_url
167
+ sqs_queue_url = nil
168
+ if ( @sqs . queue_url . nil? )
169
+ response = sqs_client . get_queue_url ( queue_name : @sqs . queue_name , queue_owner_aws_account_id : @sqs . queue_owner_aws_account_id )
170
+ sqs_queue_url = response . queue_url
171
+ else
172
+ sqs_queue_url = @sqs . queue_url
173
+ end
158
174
log . debug ( "Succeeded to get SQS queue URL" )
159
175
160
176
@poller = Aws ::SQS ::QueuePoller . new ( sqs_queue_url , client : sqs_client )
@@ -279,29 +295,39 @@ def create_sqs_client
279
295
end
280
296
281
297
def check_apikeys
282
- @bucket . objects . first
283
- log . debug ( "Succeeded to verify API keys" )
298
+ @buckets . each do | bucket_name , bucket_object |
299
+ bucket_object . objects . first
300
+ log . debug ( "Succeeded to verify API keys for bucket #{ bucket_name } " )
301
+ end
284
302
rescue => e
285
303
raise "can't call S3 API. Please check your credentials or s3_region configuration. error = #{ e . inspect } "
286
304
end
287
305
288
306
def process ( body )
289
307
s3 = body [ "Records" ] . first [ "s3" ]
290
308
raw_key = s3 [ "object" ] [ "key" ]
309
+ raw_bucket_name = s3 [ "bucket" ] [ "name" ]
291
310
key = CGI . unescape ( raw_key )
292
311
293
- io = @bucket . object ( key ) . get . body
312
+ if ( !@buckets . key? ( raw_bucket_name ) )
313
+ raise "S3 bucket name: #{ raw_bucket_name } returned from SQS was not provided in the input configuration as one of the s3 fluentd sources."
314
+ end
315
+
316
+ io = @buckets [ raw_bucket_name ] . object ( key ) . get . body
294
317
content = @extractor . extract ( io )
295
318
es = Fluent ::MultiEventStream . new
296
319
content . each_line do |line |
297
320
@parser . parse ( line ) do |time , record |
298
321
if @add_object_metadata
299
- record [ 's3_bucket' ] = @s3_bucket
322
+ record [ 's3_bucket' ] = raw_bucket_name
300
323
record [ 's3_key' ] = raw_key
301
324
end
302
325
es . add ( time , record )
303
326
end
304
327
end
328
+ if ( @tag == "input.s3" )
329
+ @tag = "input.s3.#{ raw_bucket_name } "
330
+ end
305
331
router . emit_stream ( @tag , es )
306
332
end
307
333
0 commit comments