Skip to content

Commit 8d8927d

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 8d8927d

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-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: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,22 @@ 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_element(
155+
'ROOT', '', {
156+
'@type' => 's3',
157+
's3_bucket' => 's3-${tag}'
158+
}, [
159+
config_element(
160+
'buffer', 'tag,time', {
161+
'@type' => 'file',
162+
'path' => 'tmp'
163+
}
164+
)])
165+
d = create_driver(conf)
166+
assert_equal "s3-\${tag}", d.instance.s3_bucket
167+
end
168+
153169
def test_format
154170
d = create_driver
155171

@@ -411,6 +427,30 @@ def test_write_with_custom_s3_object_key_format_containing_hex_random_placeholde
411427
FileUtils.rm_f(s3_local_file_path)
412428
end
413429

430+
def test_write_with_custom_s3_bucket_placeholder
431+
conf = config_element(
432+
'ROOT', '', {
433+
'@type' => 's3',
434+
's3_bucket' => 's3-${tag}',
435+
}, [
436+
config_element(
437+
'buffer', 'tag,time', {
438+
'@type' => 'file',
439+
'path' => 'tmp'
440+
}
441+
)])
442+
setup_mocks(true)
443+
444+
d = create_time_sliced_driver(conf)
445+
time = event_time("2011-01-02 13:14:15 UTC")
446+
d.run(default_tag: "test") do
447+
d.feed(time, {"a"=>1})
448+
d.feed(time, {"a"=>2})
449+
end
450+
451+
assert_equal "s3-test", d.instance.s3_bucket
452+
end
453+
414454
class MockResponse
415455
attr_reader :data
416456

0 commit comments

Comments
 (0)