fluent-plugin-dynamodb-streams-alt 0.0.1

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1b1ecb2264004dcf4737cec8caec76d795da171f815b027adcc37be4c6995bc6
4
+ data.tar.gz: e972c964f192073a9d2658f62de298fc6da0088e41b8af523df4c1d9b334da33
5
+ SHA512:
6
+ metadata.gz: a6e5587e0fd2e51aac0c7889335c53607051241f81a82e85ef2580396a183533664b5105e244b4acc8ecd5af09afc5e246e3f6efcc4f1f55e376cba1fce53691
7
+ data.tar.gz: d9763dbc4a0b51b363c4e10153c9f5c08c1f2ebc241f2aa50add8d9a7f3398354db870a8574c5589e42a7b366895019846ed231e676c5dd2393941237056ac78
data/.gitignore ADDED
@@ -0,0 +1,14 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.bundle
11
+ *.so
12
+ *.o
13
+ *.a
14
+ mkmf.log
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.5.3
4
+ - 2.4
5
+ - 2.3
6
+ - 2.2
7
+ - 2.1
8
+ before_script:
9
+ - bundle exec dynamodb-local -inMemory &
10
+ - sleep 5
11
+ script:
12
+ - bundle exec rake test
13
+ - bundle exec rake build
14
+ after_script:
15
+ - '[ ${TRAVIS_EVENT_TYPE} != "pull_request" ] && [ ${TRAVIS_BRANCH} = "master" ] && bundle exec codeclimate-test-reporter'
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ gem "codeclimate-test-reporter", require: nil
7
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2015 Takumi Sakamoto
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # fluent-plugin-dynamodb-streams-alt
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/fluent-plugin-dynamodb-streams-alt.svg)](http://badge.fury.io/rb/fluent-plugin-dynamodb-streams-alt)
4
+ [![Build Status](https://travis-ci.org/takus/fluent-plugin-dynamodb-streams-alt.svg?branch=master)](https://travis-ci.org/takus/fluent-plugin-dynamodb-streams-alt)
5
+ [![Test Coverage](https://codeclimate.com/github/takus/fluent-plugin-dynamodb-streams-alt/badges/coverage.svg)](https://codeclimate.com/github/takus/fluent-plugin-dynamodb-streams-alt/coverage)
6
+ [![Code Climate](https://codeclimate.com/github/takus/fluent-plugin-dynamodb-streams-alt/badges/gpa.svg)](https://codeclimate.com/github/takus/fluent-plugin-dynamodb-streams-alt)
7
+ [![Codacy Badge](https://api.codacy.com/project/badge/grade/a9fc76d35c8d4175bcb23e5c4b38fb85)](https://www.codacy.com/app/takus/fluent-plugin-dynamodb-streams-alt)
8
+
9
+ Fluentd input plugin for [AWS DynamoDB Streams](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html).
10
+
11
+ ## Preparation
12
+
13
+ Create IAM user with a policy like the following.
14
+
15
+ ```
16
+ {
17
+ "Version": "2012-10-17",
18
+ "Statement": [
19
+ {
20
+ "Effect": "Allow",
21
+ "Action": [
22
+ "dynamodb:GetRecords",
23
+ "dynamodb:GetShardIterator",
24
+ "dynamodb:DescribeStream",
25
+ "dynamodb:ListStreams"
26
+ ],
27
+ "Resource": "*"
28
+ }
29
+ ]
30
+ }
31
+ ```
32
+
33
+ Or define `aws_key_id` and `aws_sec_key` in your config file.
34
+
35
+ ## Installation
36
+
37
+ Add this line to your application's Gemfile:
38
+
39
+ ```ruby
40
+ gem 'fluent-plugin-dynamodb-streams-alt'
41
+ ```
42
+
43
+ And then execute:
44
+
45
+ $ bundle
46
+
47
+ Or install it yourself as:
48
+
49
+ $ gem install fluent-plugin-dynamodb-streams-alt
50
+
51
+ ## Configuration
52
+
53
+ ```apache
54
+ <source>
55
+ type dynamodb_streams
56
+ #aws_key_id AWS_ACCESS_KEY_ID
57
+ #aws_sec_key AWS_SECRET_ACCESS_KEY
58
+ #aws_region AWS_DEFAULT_REGION
59
+ stream_arn arn:aws:dynamodb:ap-northeast-1:000000000000:table/table_name/stream/2015-01-01T00:00:00.000
60
+ pos_file /var/lib/fluent/dynamodb_streams_table_name
61
+ fetch_interval 1
62
+ fetch_size 1
63
+ </source>
64
+ ```
65
+
66
+ - `tag`: Fluentd tag.
67
+ - `stream_arn`: DynamoDB Streams ARN.
68
+ - `pos_file`: File to store last sequence number.
69
+ - `fetch_interval`: The interval to fetch records in seconds. Default is 1 sec.
70
+ - `fetch_size`: The maximum number of records fetches in each iteration. Default is 1.
71
+
72
+ ## Output
73
+
74
+ ```javascript
75
+ {
76
+ "aws_region": "ap-northeast-1",
77
+ "event_source": "aws:dynamodb",
78
+ "event_version": "1.0",
79
+ "event_id": "dfbdf4fe-6f2b-4b34-9b17-4b8caae561fa",
80
+ "event_name": "INSERT",
81
+ "dynamodb": {
82
+ "stream_view_type": "NEW_AND_OLD_IMAGES",
83
+ "sequence_number": "000000000000000000001",
84
+ "size_bytes": 14,
85
+ "keys": {
86
+ "key": "value2"
87
+ },
88
+ "old_image": {
89
+ "key": "value1"
90
+ },
91
+ "new_image": {
92
+ "key": "value2"
93
+ }
94
+ }
95
+ }
96
+ ```
97
+
98
+ ## TODO
99
+
100
+ - store sequence number to DynamoDB
101
+ - fetch records from each shards concurrently
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+
5
+ Rake::TestTask.new(:test) do |test|
6
+ test.libs << 'test'
7
+ test.test_files = FileList['test/plugin/*.rb']
8
+ end
9
+
@@ -0,0 +1,22 @@
1
+ <source>
2
+ type dynamodb_streams
3
+ tag stream
4
+ aws_region ddblocal
5
+ stream_arn "#{ENV['STREAM_ARN']}"
6
+ </source>
7
+
8
+ # Only pass MODIFY event
9
+ <filter stream>
10
+ type grep
11
+ regexp1 event_name MODIFY
12
+ </filter>
13
+
14
+ # Only keep new_image
15
+ <filter stream>
16
+ type jq
17
+ jq '.dynamodb|{new_image:.new_image}'
18
+ </filter>
19
+
20
+ <match stream>
21
+ type stdout
22
+ </match>
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "fluent-plugin-dynamodb-streams-alt"
7
+ spec.version = "0.0.1"
8
+ spec.authors = ["krishna ramanathan"]
9
+ spec.email = ["krishna@amnic.com"]
10
+ spec.summary = %q{Amazon DynamoDB Streams input plugin for Fluentd}
11
+ spec.description = %q{forked from cosmo0920/fluent-plugin-dynamodb-streams-alt}
12
+ spec.homepage = "https://github.com/amnickrishna/fluent-plugin-dynamodb-streams-alt"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -z`.split("\x0")
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+
20
+ spec.add_dependency "fluentd", [">= 0.10.58", "< 2"]
21
+ spec.add_dependency "aws-sdk", '~> 2'
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.7"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "test-unit", ">= 3.1.0"
26
+ spec.add_development_dependency "dynamodb-local"
27
+ end
@@ -0,0 +1,215 @@
1
+ require 'aws-sdk-dynamodbstreams'
2
+ require 'bigdecimal'
3
+ require 'fluent/plugin/input'
4
+
5
+ module Fluent::Plugin
6
+ class DynamoDBStreamsInput < Input
7
+ Fluent::Plugin.register_input('dynamodb_streams', self)
8
+
9
+ helpers :timer
10
+
11
+ def initialize
12
+ super
13
+ end
14
+
15
+ config_param :tag, :string
16
+ config_param :aws_key_id, :string, :default => nil, :secret => true
17
+ config_param :aws_sec_key, :string, :default => nil, :secret => true
18
+ config_param :aws_region, :string, :default => "ap-northeast-1"
19
+ config_param :stream_arn, :string
20
+ config_param :fetch_interval, :time, :default => 1
21
+ config_param :fetch_size, :integer, :default => 1
22
+ config_param :pos_file, :string, :default => nil
23
+
24
+ def configure(conf)
25
+ super
26
+
27
+ if @aws_region == "ddblocal"
28
+ @aws_region = "ap-northeast-1" # dummy settings
29
+ @stream_endpoint = "http://localhost:8000"
30
+ else
31
+ @stream_endpoint = "https://streams.dynamodb.#{@aws_region}.amazonaws.com"
32
+ end
33
+
34
+ unless @pos_file
35
+ log.warn "dynamodb-streams: 'pos_file PATH' parameter is not set to a 'dynamodb-streams' source."
36
+ log.warn "dynamodb-streams: this parameter is highly recommended to save the position to resume."
37
+ end
38
+ end
39
+
40
+ def start
41
+ super
42
+
43
+ unless @pos_file
44
+ @pos_memory = {}
45
+ end
46
+
47
+ options = {}
48
+ options[:region] = @aws_region if @aws_region
49
+ options[:credentials] = Aws::Credentials.new(@aws_key_id, @aws_sec_key) if @aws_key_id && @aws_sec_key
50
+ options[:endpoint] = @stream_endpoint
51
+ @client = Aws::DynamoDBStreams::Client.new(options)
52
+
53
+ @iterator = {}
54
+
55
+ timer_execute(:in_dynamodb_streams_timer, @fetch_interval, &method(:run))
56
+ end
57
+
58
+ def shutdown
59
+ super
60
+ end
61
+
62
+ def run
63
+ get_shards.each do |s|
64
+ if s.sequence_number_range.ending_sequence_number
65
+ remove_sequence(s.shard_id)
66
+ next
67
+ end
68
+
69
+ set_iterator(s.shard_id) unless @iterator.key? s.shard_id
70
+
71
+ resp = @client.get_records({
72
+ shard_iterator: @iterator[s.shard_id],
73
+ limit: @fetch_size,
74
+ })
75
+
76
+ resp.records.each do |r|
77
+ begin
78
+ emit(r)
79
+ rescue => e
80
+ log.error "dynamodb-streams: error has occoured.", error: e.message, error_class: e.class
81
+ end
82
+ save_sequence(s.shard_id, r.dynamodb.sequence_number)
83
+ end
84
+
85
+ if resp.next_shard_iterator
86
+ @iterator[s.shard_id] = resp.next_shard_iterator
87
+ else
88
+ @iterator.delete s.shard_id
89
+ end
90
+ end
91
+ end
92
+
93
+ def get_shards()
94
+ shards = []
95
+
96
+ last_shard_id = nil
97
+ begin
98
+ s = @client.describe_stream({
99
+ stream_arn: @stream_arn,
100
+ exclusive_start_shard_id: last_shard_id,
101
+ }).stream_description
102
+
103
+ shards = shards + s.shards
104
+
105
+ if s.last_evaluated_shard_id == last_shard_id then
106
+ break
107
+ end
108
+ last_shard_id = s.last_evaluated_shard_id
109
+ end while last_shard_id
110
+
111
+ shards
112
+ end
113
+
114
+ def set_iterator(shard_id)
115
+ if load_sequence(shard_id)
116
+ @iterator[shard_id] = @client.get_shard_iterator({
117
+ stream_arn: @stream_arn,
118
+ shard_id: shard_id,
119
+ shard_iterator_type: "AFTER_SEQUENCE_NUMBER",
120
+ sequence_number: load_sequence(shard_id),
121
+ }).shard_iterator
122
+ else
123
+ @iterator[shard_id] = @client.get_shard_iterator({
124
+ stream_arn: @stream_arn,
125
+ shard_id: shard_id,
126
+ shard_iterator_type: "TRIM_HORIZON",
127
+ }).shard_iterator
128
+ end
129
+ end
130
+
131
+ def load_sequence(shard_id)
132
+ if @pos_file
133
+ return nil unless File.exist?("#{@pos_file}.#{shard_id}")
134
+ File.read("#{@pos_file}.#{shard_id}").chomp
135
+ else
136
+ return nil unless @pos_memory[shard_id]
137
+ @pos_memory[shard_id]
138
+ end
139
+ end
140
+
141
+ def save_sequence(shard_id, sequence)
142
+ if @pos_file
143
+ open("#{@pos_file}.#{shard_id}", 'w') do |f|
144
+ f.write sequence
145
+ end
146
+ else
147
+ @pos_memory[shard_id] = sequence
148
+ end
149
+ sequence
150
+ end
151
+
152
+ def remove_sequence(shard_id)
153
+ if @pos_file
154
+ return unless File.exist?("#{@pos_file}.#{shard_id}")
155
+ File.unlink("#{@pos_file}.#{shard_id}")
156
+ else
157
+ @pos_memory[shard_id] = nil
158
+ end
159
+ end
160
+
161
+ def emit(r)
162
+ record = {
163
+ "aws_region" => r.aws_region,
164
+ "event_source" => r.event_source,
165
+ "event_version" => r.event_version,
166
+ "event_id" => r.event_id,
167
+ "event_name" => r.event_name,
168
+ "dynamodb" => {
169
+ "stream_view_type" => r.dynamodb.stream_view_type,
170
+ "sequence_number" => r.dynamodb.sequence_number,
171
+ "size_bytes" => r.dynamodb.size_bytes,
172
+ }
173
+ }
174
+ record["dynamodb"]["keys"] = dynamodb_to_hash(r.dynamodb.keys) if r.dynamodb.keys
175
+ record["dynamodb"]["old_image"] = dynamodb_to_hash(r.dynamodb.old_image) if r.dynamodb.old_image
176
+ record["dynamodb"]["new_image"] = dynamodb_to_hash(r.dynamodb.new_image) if r.dynamodb.new_image
177
+ router.emit(@tag, Fluent::Engine.now, record)
178
+ end
179
+
180
+ def dynamodb_to_hash(hash)
181
+ hash.each do |k, v|
182
+ # delete binary attributes
183
+ if v.b || v.bs
184
+ hash.delete(k)
185
+ else
186
+ hash[k] = format_attribute_value(v)
187
+ end
188
+ end
189
+ return hash
190
+ end
191
+
192
+ def format_attribute_value(v)
193
+ if v.m
194
+ return dynamodb_to_hash(v.m)
195
+ elsif v.l
196
+ return v.l.map {|i| format_attribute_value(i) }
197
+ elsif v.ns
198
+ return v.ns.map {|i| BigDecimal.new(i).to_i }
199
+ elsif v.ss
200
+ return v.ss
201
+ elsif v.null
202
+ return null
203
+ elsif v.bool
204
+ return v.bool
205
+ elsif v.n
206
+ return BigDecimal.new(v.n).to_i
207
+ elsif v.s
208
+ return v.s
209
+ else
210
+ log.warn "dynamodb-streams: unknown attribute value."
211
+ end
212
+ end
213
+
214
+ end
215
+ end
@@ -0,0 +1,86 @@
1
+ require "test_helper"
2
+
3
+ class DynamoDBStreamsInputTest < Test::Unit::TestCase
4
+ include DynamoDBStreamsTestHelper
5
+
6
+ def setup
7
+ Fluent::Test.setup
8
+ end
9
+
10
+ def test_configure
11
+ d = create_driver(
12
+ %[
13
+ tag streams
14
+ aws_key_id test_key_id
15
+ aws_sec_key test_sec_key
16
+ aws_region ap-northeast-1
17
+ stream_arn arn:aws:dynamodb:ap-northeast-1:123456789012:table/fluent-plugin-dynamodb-streams-alt/stream/2015-09-01T00:00:00.000
18
+ pos_file /tmp/fluent-plugin-dynamodb-streams-alt.pos
19
+ fetch_interval 5
20
+ fetch_size 100
21
+ ]
22
+ )
23
+
24
+ assert_equal 'test_key_id', d.instance.aws_key_id
25
+ assert_equal 'test_sec_key', d.instance.aws_sec_key
26
+ assert_equal 'ap-northeast-1', d.instance.aws_region
27
+ assert_equal 'arn:aws:dynamodb:ap-northeast-1:123456789012:table/fluent-plugin-dynamodb-streams-alt/stream/2015-09-01T00:00:00.000', d.instance.stream_arn
28
+ assert_equal '/tmp/fluent-plugin-dynamodb-streams-alt.pos', d.instance.pos_file
29
+ assert_equal 5.0, d.instance.fetch_interval
30
+ assert_equal 100, d.instance.fetch_size
31
+ end
32
+
33
+ def test_emit
34
+ delete_table
35
+ create_table
36
+
37
+ time_ms = (Time.now.to_f * 1000).floor
38
+
39
+ d = create_driver(
40
+ %[
41
+ tag test
42
+ aws_key_id dummy
43
+ aws_sec_key dummy
44
+ aws_region ddblocal
45
+ stream_arn #{@stream_arn}
46
+ ]
47
+ )
48
+
49
+ d.run(expect_emits: 2) do
50
+ put_records([
51
+ {key:"k1", timestamp:time_ms, bool:true, hash:{k:"v"}, l:[{k:"v"}], ns:[1,2,3], ss:["1","2","3"]},
52
+ {key:"k2", timestamp:time_ms},
53
+ ])
54
+ end
55
+
56
+ emits = d.events
57
+
58
+ assert_equal(2, emits.size)
59
+
60
+ assert_equal("test", emits[0][0])
61
+ assert_equal(
62
+ {"key" => "k1", "timestamp" => time_ms, "bool" => true, "hash" => {"k" => "v"}, "l" => [{"k" => "v"}], "ns" => [1,2,3], "ss" => ["1","2","3"]},
63
+ emits[0][2]["dynamodb"]["new_image"],
64
+ )
65
+
66
+ assert_equal("test", emits[1][0])
67
+ assert_equal({"key" => "k2", "timestamp" => time_ms}, emits[1][2]["dynamodb"]["new_image"])
68
+
69
+ assert_equal("ddblocal", emits[0][2]["aws_region"])
70
+ assert_true(emits[0][2]["event_id"].size > 0)
71
+ assert_equal("aws:dynamodb", emits[0][2]["event_source"])
72
+ assert_true(emits[0][2]["event_version"].size > 0)
73
+ assert_equal("INSERT", emits[0][2]["event_name"])
74
+ assert_true(emits[0][2]["dynamodb"]["sequence_number"].size > 0)
75
+ assert_equal("NEW_AND_OLD_IMAGES", emits[0][2]["dynamodb"]["stream_view_type"])
76
+ assert_equal(78, emits[0][2]["dynamodb"]["size_bytes"])
77
+
78
+ delete_table
79
+ end
80
+
81
+ private
82
+ def create_driver(conf = CONFIG)
83
+ Fluent::Test::Driver::Input.new(Fluent::Plugin::DynamoDBStreamsInput).configure(conf)
84
+ end
85
+
86
+ end
@@ -0,0 +1,65 @@
1
+ require 'fluent/test'
2
+ require 'fluent/test/driver/input'
3
+ require 'fluent/plugin/in_dynamodb_streams'
4
+ require 'aws-sdk-dynamodb'
5
+ require 'aws-sdk-dynamodbstreams'
6
+
7
+ module DynamoDBStreamsTestHelper
8
+
9
+ TEST_TABLE_NAME = "in_dynamodb_streams"
10
+
11
+ private
12
+ def dynamodb
13
+ @ddb ||= Aws::DynamoDB::Client.new(
14
+ region: 'ap-northeast-1',
15
+ access_key_id: 'dummy',
16
+ secret_access_key: 'dummy',
17
+ endpoint: 'http://localhost:8000',
18
+ )
19
+ end
20
+
21
+ def create_table
22
+ @stream_arn = dynamodb.create_table({
23
+ table_name: TEST_TABLE_NAME,
24
+ key_schema: [
25
+ {
26
+ attribute_name: "key",
27
+ key_type: "HASH",
28
+ }
29
+ ],
30
+ attribute_definitions: [
31
+ {
32
+ attribute_name: "key",
33
+ attribute_type: "S",
34
+ }
35
+ ],
36
+ provisioned_throughput: {
37
+ read_capacity_units: 1,
38
+ write_capacity_units: 1,
39
+ },
40
+ stream_specification: {
41
+ stream_enabled: true,
42
+ stream_view_type: "NEW_AND_OLD_IMAGES",
43
+ }
44
+ }).table_description.latest_stream_arn
45
+ end
46
+
47
+ def put_records(records)
48
+ records.each do |r|
49
+ dynamodb.put_item(
50
+ table_name: TEST_TABLE_NAME,
51
+ item: r,
52
+ )
53
+ end
54
+ end
55
+
56
+ def delete_table
57
+ dynamodb.list_tables.table_names.each do |t|
58
+ if t == TEST_TABLE_NAME
59
+ dynamodb.delete_table({
60
+ table_name: TEST_TABLE_NAME,
61
+ })
62
+ end
63
+ end
64
+ end
65
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-dynamodb-streams-alt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - krishna ramanathan
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.10.58
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '2'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 0.10.58
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '2'
33
+ - !ruby/object:Gem::Dependency
34
+ name: aws-sdk
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bundler
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.7'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.7'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rake
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '10.0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '10.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: test-unit
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: 3.1.0
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: 3.1.0
89
+ - !ruby/object:Gem::Dependency
90
+ name: dynamodb-local
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: forked from cosmo0920/fluent-plugin-dynamodb-streams-alt
104
+ email:
105
+ - krishna@amnic.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - ".gitignore"
111
+ - ".travis.yml"
112
+ - Gemfile
113
+ - LICENSE.txt
114
+ - README.md
115
+ - Rakefile
116
+ - example/fluentd.conf
117
+ - fluent-plugin-dynamodb-streams.gemspec
118
+ - lib/fluent/plugin/in_dynamodb_streams.rb
119
+ - test/plugin/in_dynamodb_streams.rb
120
+ - test/test_helper.rb
121
+ homepage: https://github.com/amnickrishna/fluent-plugin-dynamodb-streams-alt
122
+ licenses:
123
+ - MIT
124
+ metadata: {}
125
+ post_install_message:
126
+ rdoc_options: []
127
+ require_paths:
128
+ - lib
129
+ required_ruby_version: !ruby/object:Gem::Requirement
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ requirements: []
140
+ rubygems_version: 3.0.3
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Amazon DynamoDB Streams input plugin for Fluentd
144
+ test_files:
145
+ - test/plugin/in_dynamodb_streams.rb
146
+ - test/test_helper.rb