Skip to content

Commit ececc3d

Browse files
committed
Support placeholder for s3_bucket
Closes: #350 e.g. s3_bucket test_${tag} <buffer tag> @type file path foo </buffer> Signed-off-by: Kentaro Hayashi <[email protected]>
1 parent f957b40 commit ececc3d

File tree

2 files changed

+40
-5
lines changed

2 files changed

+40
-5
lines changed

lib/fluent/plugin/out_s3.rb

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,17 @@ def start
249249

250250
s3_client = Aws::S3::Client.new(options)
251251
@s3 = Aws::S3::Resource.new(client: s3_client)
252-
@bucket = @s3.bucket(@s3_bucket)
253-
254-
check_apikeys if @check_apikey_on_start
255-
ensure_bucket if @check_bucket
256-
ensure_bucket_lifecycle
252+
@s3_bucket_template = @s3_bucket
253+
254+
unless @s3_bucket_template.match?(CHUNK_TAG_PLACEHOLDER_PATTERN)
255+
@bucket = @s3.bucket(@s3_bucket)
256+
check_apikeys if @check_apikey_on_start
257+
ensure_bucket if @check_bucket
258+
ensure_bucket_lifecycle
259+
@dynamic_bucket = false
260+
else
261+
@dynamic_bucket = true
262+
end
257263

258264
super
259265
end
@@ -264,6 +270,12 @@ def format(tag, time, record)
264270
end
265271

266272
def write(chunk)
273+
if @dynamic_bucket
274+
@s3_bucket = extract_placeholders(@s3_bucket_template, chunk)
275+
@bucket = @s3.bucket(@s3_bucket)
276+
ensure_bucket if @check_bucket
277+
ensure_bucket_lifecycle
278+
end
267279
i = 0
268280
metadata = chunk.metadata
269281
previous_path = nil

test/test_out_s3.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,13 @@ def test_configure_with_grant
150150
assert_equal "id='3456789012'", d.instance.grant_write_acp
151151
end
152152

153+
def test_configure_with_s3_bucket_tag
154+
conf = CONFIG.clone
155+
conf.sub!(/s3_bucket test_bucket/, "s3_bucket test_bucket_\${tag}")
156+
d = create_driver(conf)
157+
assert_equal "test_bucket_\${tag}", d.instance.s3_bucket
158+
end
159+
153160
def test_format
154161
d = create_driver
155162

@@ -411,6 +418,22 @@ def test_write_with_custom_s3_object_key_format_containing_hex_random_placeholde
411418
FileUtils.rm_f(s3_local_file_path)
412419
end
413420

421+
def test_write_with_custom_s3_bucket_placeholder
422+
config = CONFIG_TIME_SLICE.gsub(/s3_bucket test_bucket/,"s3_bucket test_bucket_\${tag}")
423+
config << "<buffer tag>\n@type file\npath tmp\n</buffer>"
424+
425+
setup_mocks(true)
426+
427+
d = create_time_sliced_driver(config)
428+
time = event_time("2011-01-02 13:14:15 UTC")
429+
d.run(default_tag: "test") do
430+
d.feed(time, {"a"=>1})
431+
d.feed(time, {"a"=>2})
432+
end
433+
434+
assert_equal "test_bucket_test", d.instance.s3_bucket
435+
end
436+
414437
class MockResponse
415438
attr_reader :data
416439

0 commit comments

Comments
 (0)