funktor 0.4.7 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.tool-versions +2 -0
- data/Gemfile.lock +7 -3
- data/funktor-testapp/.envrc +1 -0
- data/funktor-testapp/.gitignore +7 -0
- data/funktor-testapp/Gemfile +25 -0
- data/funktor-testapp/Gemfile.lock +51 -0
- data/funktor-testapp/app/services/job_flood.rb +38 -0
- data/funktor-testapp/app/workers/audit_worker.rb +49 -0
- data/funktor-testapp/app/workers/greetings_worker.rb +3 -0
- data/funktor-testapp/app/workers/hello_worker.rb +18 -0
- data/funktor-testapp/deploy-dev.sh +5 -0
- data/funktor-testapp/funktor_config/boot.rb +17 -0
- data/funktor-testapp/funktor_config/environment.yml +15 -0
- data/funktor-testapp/funktor_config/function_definitions/default_queue_handler.yml +11 -0
- data/funktor-testapp/funktor_config/function_definitions/incoming_job_handler.yml +11 -0
- data/funktor-testapp/funktor_config/function_definitions/job_activator.yml +8 -0
- data/funktor-testapp/funktor_config/function_definitions/random_job_generator.yml +18 -0
- data/funktor-testapp/funktor_config/function_definitions/single_thread_queue_handler.yml +11 -0
- data/funktor-testapp/funktor_config/funktor.yml +114 -0
- data/funktor-testapp/funktor_config/iam_permissions/activity_table.yml +5 -0
- data/funktor-testapp/funktor_config/iam_permissions/default_queue.yml +8 -0
- data/funktor-testapp/funktor_config/iam_permissions/incoming_job_queue.yml +8 -0
- data/funktor-testapp/funktor_config/iam_permissions/jobs_table.yml +5 -0
- data/funktor-testapp/funktor_config/iam_permissions/jobs_table_secondary_index.yml +8 -0
- data/funktor-testapp/funktor_config/iam_permissions/single_thread_queue.yml +8 -0
- data/funktor-testapp/funktor_config/iam_permissions/ssm.yml +5 -0
- data/funktor-testapp/funktor_config/package.yml +11 -0
- data/funktor-testapp/funktor_config/resources/activity_table.yml +22 -0
- data/funktor-testapp/funktor_config/resources/cloudwatch_dashboard.yml +804 -0
- data/funktor-testapp/funktor_config/resources/default_queue.yml +22 -0
- data/funktor-testapp/funktor_config/resources/incoming_job_queue.yml +22 -0
- data/funktor-testapp/funktor_config/resources/incoming_job_queue_user.yml +26 -0
- data/funktor-testapp/funktor_config/resources/jobs_table.yml +44 -0
- data/funktor-testapp/funktor_config/resources/single_thread_queue.yml +22 -0
- data/funktor-testapp/funktor_config/ruby_layer.yml +11 -0
- data/funktor-testapp/funktor_init.yml +61 -0
- data/funktor-testapp/lambda_event_handlers/default_queue_handler.rb +8 -0
- data/funktor-testapp/lambda_event_handlers/incoming_job_handler.rb +8 -0
- data/funktor-testapp/lambda_event_handlers/job_activator.rb +8 -0
- data/funktor-testapp/lambda_event_handlers/random_job_generator.rb +35 -0
- data/funktor-testapp/lambda_event_handlers/single_thread_queue_handler.rb +8 -0
- data/funktor-testapp/package-lock.json +248 -0
- data/funktor-testapp/package.json +8 -0
- data/funktor-testapp/serverless.yml +65 -0
- data/funktor.gemspec +1 -0
- data/lib/active_job/queue_adapters/funktor_adapter.rb +3 -3
- data/lib/funktor.rb +39 -7
- data/lib/funktor/activity_tracker.rb +102 -0
- data/lib/funktor/cli/bootstrap.rb +0 -1
- data/lib/funktor/cli/init.rb +13 -0
- data/lib/funktor/cli/templates/app/workers/hello_worker.rb +1 -1
- data/lib/funktor/cli/templates/funktor_config/environment.yml +4 -0
- data/lib/funktor/cli/templates/funktor_config/function_definitions/job_activator.yml +8 -0
- data/lib/funktor/cli/templates/funktor_config/funktor.yml +28 -2
- data/lib/funktor/cli/templates/funktor_config/iam_permissions/activity_table.yml +5 -0
- data/lib/funktor/cli/templates/funktor_config/iam_permissions/jobs_table.yml +5 -0
- data/lib/funktor/cli/templates/funktor_config/iam_permissions/jobs_table_secondary_index.yml +8 -0
- data/lib/funktor/cli/templates/funktor_config/resources/activity_table.yml +22 -0
- data/lib/funktor/cli/templates/funktor_config/resources/cloudwatch_dashboard.yml +10 -10
- data/lib/funktor/cli/templates/funktor_config/resources/jobs_table.yml +44 -0
- data/lib/funktor/cli/templates/funktor_init.yml.tt +2 -8
- data/lib/funktor/cli/templates/lambda_event_handlers/job_activator.rb +8 -0
- data/lib/funktor/cli/templates/lambda_event_handlers/work_queue_handler.rb +1 -1
- data/lib/funktor/cli/templates/serverless.yml +2 -2
- data/lib/funktor/counter.rb +4 -1
- data/lib/funktor/incoming_job_handler.rb +52 -12
- data/lib/funktor/job.rb +10 -5
- data/lib/funktor/job_activator.rb +98 -0
- data/lib/funktor/job_pusher.rb +0 -2
- data/lib/funktor/middleware/metrics.rb +8 -3
- data/lib/funktor/testing.rb +49 -47
- data/lib/funktor/version.rb +1 -1
- data/lib/funktor/{active_job_handler.rb → work_queue_handler.rb} +17 -15
- data/lib/funktor/worker.rb +0 -7
- metadata +69 -3
@@ -0,0 +1,65 @@
|
|
1
|
+
# Welcome to Funktor & Serverless!
|
2
|
+
#
|
3
|
+
# This file is the main config file for your service.
|
4
|
+
# It's already configured to run Funktor, you just have to deploy it.
|
5
|
+
#
|
6
|
+
# For more info about Funktor check the wiki:
|
7
|
+
# https://github.com/Octo-Labs/funktor/wiki
|
8
|
+
#
|
9
|
+
# For more about serverless, check their docs:
|
10
|
+
# docs.serverless.com
|
11
|
+
#
|
12
|
+
# Happy Coding!
|
13
|
+
|
14
|
+
# The name of your service. All your AWS resources will contain this name.
|
15
|
+
service: funktor-testapp
|
16
|
+
|
17
|
+
# This causes serverless to throw an error early if the config is bad, instead of waiting for CloudFormation to try and fail to deploy it.
|
18
|
+
configValidationMode: error
|
19
|
+
|
20
|
+
# Pin the serverless framework to the 2.x line
|
21
|
+
frameworkVersion: '2'
|
22
|
+
|
23
|
+
provider:
|
24
|
+
name: aws
|
25
|
+
runtime: ruby2.7
|
26
|
+
lambdaHashingVersion: 20201221
|
27
|
+
environment: ${file(funktor_config/environment.yml)}
|
28
|
+
versionFunctions: false # Reduces the amount of storage used since all Lambdas together are limited to 75GB
|
29
|
+
iamRoleStatements:
|
30
|
+
- ${file(funktor_config/iam_permissions/activity_table.yml)}
|
31
|
+
- ${file(funktor_config/iam_permissions/default_queue.yml)}
|
32
|
+
- ${file(funktor_config/iam_permissions/incoming_job_queue.yml)}
|
33
|
+
- ${file(funktor_config/iam_permissions/ssm.yml)}
|
34
|
+
- ${file(funktor_config/iam_permissions/single_thread_queue.yml)}
|
35
|
+
- ${file(funktor_config/iam_permissions/jobs_table.yml)}
|
36
|
+
- ${file(funktor_config/iam_permissions/jobs_table_secondary_index.yml)}
|
37
|
+
|
38
|
+
|
39
|
+
custom:
|
40
|
+
# Our stage is based on what is passed in when running serverless
|
41
|
+
# commands. Or fallsback to what we have set in the provider section.
|
42
|
+
stage: ${self:provider.stage, 'dev'}
|
43
|
+
funktor: ${file(funktor_config/funktor.yml)}
|
44
|
+
rubyLayer: ${file(funktor_config/ruby_layer.yml)}
|
45
|
+
|
46
|
+
package: ${file(funktor_config/package.yml)}
|
47
|
+
|
48
|
+
functions:
|
49
|
+
IncomingJobHandler: ${file(funktor_config/function_definitions/incoming_job_handler.yml)}
|
50
|
+
DefaultQueueHandler: ${file(funktor_config/function_definitions/default_queue_handler.yml)}
|
51
|
+
JobActivator: ${file(funktor_config/function_definitions/job_activator.yml)}
|
52
|
+
SingleThreadQueueHandler: ${file(funktor_config/function_definitions/single_thread_queue_handler.yml)}
|
53
|
+
RandomJobGenerator: ${file(funktor_config/function_definitions/random_job_generator.yml)}
|
54
|
+
|
55
|
+
resources:
|
56
|
+
- ${file(funktor_config/resources/activity_table.yml)}
|
57
|
+
- ${file(funktor_config/resources/incoming_job_queue_user.yml)}
|
58
|
+
- ${file(funktor_config/resources/cloudwatch_dashboard.yml)}
|
59
|
+
- ${file(funktor_config/resources/default_queue.yml)}
|
60
|
+
- ${file(funktor_config/resources/incoming_job_queue.yml)}
|
61
|
+
- ${file(funktor_config/resources/single_thread_queue.yml)}
|
62
|
+
- ${file(funktor_config/resources/jobs_table.yml)}
|
63
|
+
|
64
|
+
plugins:
|
65
|
+
- serverless-ruby-layer
|
data/funktor.gemspec
CHANGED
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.require_paths = ["lib"]
|
31
31
|
|
32
32
|
spec.add_dependency 'aws-sdk-sqs', '~> 1.37'
|
33
|
+
spec.add_dependency 'aws-sdk-dynamodb', '~> 1.62'
|
33
34
|
spec.add_dependency "activesupport" # TODO - Can we build our own verison of cattr_accessor to avoid this?
|
34
35
|
spec.add_dependency "thor" # Thor drives the CLI
|
35
36
|
|
@@ -39,11 +39,11 @@ module ActiveJob
|
|
39
39
|
include Funktor::Worker
|
40
40
|
|
41
41
|
def perform(job_data)
|
42
|
-
|
42
|
+
Funktor.logger.debug "job_data = #{job_data.class} #{job_data}"
|
43
43
|
if job_data.is_a?(Array)
|
44
|
-
|
44
|
+
Funktor.logger.debug "it's an array"
|
45
45
|
job_data = job_data.first
|
46
|
-
|
46
|
+
Funktor.logger.debug "job_data = #{job_data.class} #{job_data}"
|
47
47
|
end
|
48
48
|
Base.execute job_data
|
49
49
|
end
|
data/lib/funktor.rb
CHANGED
@@ -8,6 +8,8 @@ require 'funktor/logger'
|
|
8
8
|
require 'funktor/worker'
|
9
9
|
require 'funktor/middleware_chain'
|
10
10
|
require 'funktor/incoming_job_handler'
|
11
|
+
require 'funktor/job_activator'
|
12
|
+
require 'funktor/activity_tracker'
|
11
13
|
|
12
14
|
require 'json'
|
13
15
|
|
@@ -33,14 +35,14 @@ module Funktor
|
|
33
35
|
@job_pusher_chain
|
34
36
|
end
|
35
37
|
|
36
|
-
def self.
|
38
|
+
def self.configure_work_queue_handler
|
37
39
|
yield self
|
38
40
|
end
|
39
41
|
|
40
|
-
def self.
|
41
|
-
@
|
42
|
-
yield @
|
43
|
-
@
|
42
|
+
def self.work_queue_handler_middleware
|
43
|
+
@work_queue_handler_chain ||= MiddlewareChain.new
|
44
|
+
yield @work_queue_handler_chain if block_given?
|
45
|
+
@work_queue_handler_chain
|
44
46
|
end
|
45
47
|
|
46
48
|
# TODO - Maybe we don't need this either? Maybe this should be a super dumb thing that also
|
@@ -58,6 +60,18 @@ module Funktor
|
|
58
60
|
@incoming_job_handler_chain
|
59
61
|
end
|
60
62
|
|
63
|
+
# TODO - Does this actually make any sense? Should the JobActivator even know about
|
64
|
+
# jobs/classes? Maybe it should be super dumb and just push JSON blobs around?
|
65
|
+
def self.configure_job_activator
|
66
|
+
yield self
|
67
|
+
end
|
68
|
+
|
69
|
+
def self.job_activator_middleware
|
70
|
+
@job_activator_chain ||= MiddlewareChain.new
|
71
|
+
yield @job_activator_chain if block_given?
|
72
|
+
@job_activator_chain
|
73
|
+
end
|
74
|
+
|
61
75
|
def self.parse_json(string)
|
62
76
|
JSON.parse(string)
|
63
77
|
end
|
@@ -95,13 +109,31 @@ module Funktor
|
|
95
109
|
|
96
110
|
@logger = logger
|
97
111
|
end
|
112
|
+
|
113
|
+
# We have a raw_logger that doesn't add timestamps and what not. This is used to publish
|
114
|
+
# CloudWatch metrics that can be used in dashboards.
|
115
|
+
def self.raw_logger
|
116
|
+
@raw_logger ||= Funktor::Logger.new($stdout, level: options[:log_level], formatter: proc {|severity, datetime, progname, msg|
|
117
|
+
"#{msg}\n"
|
118
|
+
})
|
119
|
+
end
|
120
|
+
|
121
|
+
def self.raw_logger=(raw_logger)
|
122
|
+
if raw_logger.nil?
|
123
|
+
self.raw_logger.level = Logger::FATAL
|
124
|
+
return self.raw_logger
|
125
|
+
end
|
126
|
+
|
127
|
+
@raw_logger = raw_logger
|
128
|
+
end
|
98
129
|
end
|
99
130
|
|
100
|
-
# TODO - Should we require this by default or let people opt in?
|
101
131
|
# TODO - Is it a code smell that we need to include these at the bottom, after
|
102
132
|
# the main Funktor module is defined?
|
133
|
+
#
|
134
|
+
# TODO - Should we require metrics by default or let people opt in?
|
103
135
|
require 'funktor/middleware/metrics'
|
104
136
|
require 'funktor/error_handler'
|
105
|
-
require 'funktor/
|
137
|
+
require 'funktor/work_queue_handler'
|
106
138
|
|
107
139
|
require 'funktor/rails' if defined?(::Rails::Engine)
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'aws-sdk-dynamodb'
|
3
|
+
|
4
|
+
module Funktor
|
5
|
+
class ActivityTracker
|
6
|
+
|
7
|
+
INCR_KEYS = {
|
8
|
+
incoming: 'incoming',
|
9
|
+
queued: 'queued',
|
10
|
+
scheduled: 'scheduled',
|
11
|
+
processingStarted: 'processing',
|
12
|
+
processingComplete: 'complete',
|
13
|
+
processingFailed: 'failed',
|
14
|
+
bailingOut: 'failed',
|
15
|
+
retrying: 'retries',
|
16
|
+
retryActivated: 'queued',
|
17
|
+
scheduledJobActivated: 'queued'
|
18
|
+
#scheduledJobPushedToActive: 'active',
|
19
|
+
#activeJobPushed: 'active',
|
20
|
+
#scheduledJobPushed: 'scheduled'
|
21
|
+
}
|
22
|
+
|
23
|
+
DECR_KEYS = {
|
24
|
+
incoming: nil,
|
25
|
+
queued: nil,
|
26
|
+
scheduled: nil,
|
27
|
+
processingStarted: 'queued',
|
28
|
+
processingComplete: 'processing',
|
29
|
+
processingFailed: nil,
|
30
|
+
bailingOut: 'processing',
|
31
|
+
retrying: 'processing',
|
32
|
+
retryActivated: 'retries',
|
33
|
+
scheduledJobActivated: 'scheduled'
|
34
|
+
#scheduledJobPushedToActive: 'scheduled',
|
35
|
+
#activeJobPushed: nil,
|
36
|
+
#scheduledJobPushed: nil
|
37
|
+
}
|
38
|
+
|
39
|
+
def track(activity, job)
|
40
|
+
Funktor.logger.debug "starting track activity for #{activity}"
|
41
|
+
incrKey = nil || INCR_KEYS[activity.to_sym]
|
42
|
+
decrKey = nil || DECR_KEYS[activity.to_sym]
|
43
|
+
if incrKey
|
44
|
+
increment_key(incrKey)
|
45
|
+
end
|
46
|
+
if decrKey
|
47
|
+
decrement_key(decrKey)
|
48
|
+
end
|
49
|
+
Funktor.logger.debug "ending track activity for #{activity}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def increment_key(key)
|
53
|
+
#put_metric_to_stdout(key, 1)
|
54
|
+
dynamodb_client.update_item({
|
55
|
+
table_name: ENV['FUNKTOR_ACTIVITY_TABLE'],
|
56
|
+
key: { category: 'stat', statName: key },
|
57
|
+
expression_attribute_values:{ ":start": 0, ":inc": 1 },
|
58
|
+
update_expression: "SET stat_value = if_not_exists(stat_value, :start) + :inc",
|
59
|
+
})
|
60
|
+
end
|
61
|
+
|
62
|
+
def decrement_key(key)
|
63
|
+
#put_metric_to_stdout(key, -1)
|
64
|
+
dynamodb_client.update_item({
|
65
|
+
table_name: ENV['FUNKTOR_ACTIVITY_TABLE'],
|
66
|
+
key: { category: 'stat', statName: key },
|
67
|
+
expression_attribute_values:{ ":start": 0, ":inc": 1 },
|
68
|
+
update_expression: "SET stat_value = if_not_exists(stat_value, :start) - :inc",
|
69
|
+
})
|
70
|
+
end
|
71
|
+
|
72
|
+
def dynamodb_client
|
73
|
+
@dynamodb_client ||= ::Aws::DynamoDB::Client.new
|
74
|
+
end
|
75
|
+
|
76
|
+
def put_metric_to_stdout(key, value)
|
77
|
+
data = {
|
78
|
+
"_aws": {
|
79
|
+
"Timestamp": Time.now.strftime('%s%3N').to_i,
|
80
|
+
"CloudWatchMetrics": [
|
81
|
+
{
|
82
|
+
"Namespace": "rails-lambda-experiment",
|
83
|
+
"Dimensions": [["functionVersion"]],
|
84
|
+
"Metrics": [ # CPU, Memory, Duration, etc...
|
85
|
+
{
|
86
|
+
"Name": key,
|
87
|
+
"Unit": "Count"
|
88
|
+
}
|
89
|
+
]
|
90
|
+
}
|
91
|
+
]
|
92
|
+
},
|
93
|
+
"functionVersion": "LATEST",
|
94
|
+
#"count": value,
|
95
|
+
#"requestId": "989ffbf8-9ace-4817-a57c-e4dd734019ee"
|
96
|
+
}
|
97
|
+
data[key] = value
|
98
|
+
puts(data.to_json)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
end
|
@@ -24,7 +24,6 @@ module Funktor
|
|
24
24
|
|
25
25
|
def funktor_yml
|
26
26
|
# TODO - Should we camelize the app name before writing it into the config? (CloudFormation names get weird with underscores and dashes.)
|
27
|
-
puts funktor_file_target
|
28
27
|
template "templates/funktor_init.yml", funktor_file_target
|
29
28
|
end
|
30
29
|
|
data/lib/funktor/cli/init.rb
CHANGED
@@ -65,6 +65,8 @@ module Funktor
|
|
65
65
|
@work_queue_config = queue_details.values.first
|
66
66
|
template File.join("funktor_config", "resources", "work_queue.yml"), File.join("funktor_config", "resources", "#{work_queue_name.underscore}_queue.yml")
|
67
67
|
end
|
68
|
+
template File.join("funktor_config", "resources", "jobs_table.yml"), File.join("funktor_config", "resources", "jobs_table.yml")
|
69
|
+
template File.join("funktor_config", "resources", "activity_table.yml"), File.join("funktor_config", "resources", "activity_table.yml")
|
68
70
|
end
|
69
71
|
|
70
72
|
def iam_permissions
|
@@ -75,10 +77,14 @@ module Funktor
|
|
75
77
|
@work_queue_config = queue_details.values.first
|
76
78
|
template File.join("funktor_config", "iam_permissions", "work_queue.yml"), File.join("funktor_config", "iam_permissions", "#{work_queue_name.underscore}_queue.yml")
|
77
79
|
end
|
80
|
+
template File.join("funktor_config", "iam_permissions", "jobs_table.yml"), File.join("funktor_config", "iam_permissions", "jobs_table.yml")
|
81
|
+
template File.join("funktor_config", "iam_permissions", "jobs_table_secondary_index.yml"), File.join("funktor_config", "iam_permissions", "jobs_table_secondary_index.yml")
|
82
|
+
template File.join("funktor_config", "iam_permissions", "activity_table.yml"), File.join("funktor_config", "iam_permissions", "activity_table.yml")
|
78
83
|
end
|
79
84
|
|
80
85
|
def function_definitions
|
81
86
|
template File.join("funktor_config", "function_definitions", "incoming_job_handler.yml"), File.join("funktor_config", "function_definitions", "incoming_job_handler.yml")
|
87
|
+
template File.join("funktor_config", "function_definitions", "job_activator.yml"), File.join("funktor_config", "function_definitions", "job_activator.yml")
|
82
88
|
queues.each do |queue_details|
|
83
89
|
@work_queue_name = queue_details.keys.first
|
84
90
|
@work_queue_config = queue_details.values.first
|
@@ -88,6 +94,7 @@ module Funktor
|
|
88
94
|
|
89
95
|
def lambda_handlers
|
90
96
|
template File.join("lambda_event_handlers", "incoming_job_handler.rb"), File.join("lambda_event_handlers", "incoming_job_handler.rb")
|
97
|
+
template File.join("lambda_event_handlers", "job_activator.rb"), File.join("lambda_event_handlers", "job_activator.rb")
|
91
98
|
queues.each do |queue_details|
|
92
99
|
@work_queue_name = queue_details.keys.first
|
93
100
|
@work_queue_config = queue_details.values.first
|
@@ -170,6 +177,12 @@ module Funktor
|
|
170
177
|
"null" # When we parse yaml 'null' gets turned to nil, which comes out as an empty string in the template
|
171
178
|
end
|
172
179
|
|
180
|
+
def activator_config_value(config_name)
|
181
|
+
funktor_config.dig("jobActivator", config_name) ||
|
182
|
+
funktor_config.dig("handlerDefaults", config_name) ||
|
183
|
+
"null" # When we parse yaml 'null' gets turned to nil, which comes out as an empty string in the template
|
184
|
+
end
|
185
|
+
|
173
186
|
def queue_config_value(queue_name, config_name)
|
174
187
|
queue_config(queue_name)&.dig(config_name) ||
|
175
188
|
funktor_config.dig("handlerDefaults", config_name) ||
|
@@ -0,0 +1,8 @@
|
|
1
|
+
handler: lambda_event_handlers/job_activator.call
|
2
|
+
timeout: ${self:custom.funktor.JobActivator.timeout, 30}
|
3
|
+
reservedConcurrency: ${self:custom.funktor.JobActivator.reservedConcurrency, null}
|
4
|
+
provisionedConcurrency: ${self:custom.funktor.JobActivator.provisionedConcurrency, null}
|
5
|
+
memorySize: ${self:custom.funktor.JobActivator.memorySize, 256}
|
6
|
+
#reservedConcurrency: 1
|
7
|
+
events:
|
8
|
+
- schedule: rate(1 minute)
|
@@ -21,6 +21,31 @@ IncomingJobHandler:
|
|
21
21
|
visibilityTimeout: <%= incoming_config_value 'visibilityTimeout' %>
|
22
22
|
logRetentionInDays: <%= incoming_config_value 'logRetentionInDays' %>
|
23
23
|
|
24
|
+
JobActivator:
|
25
|
+
# timeout is how long the handler can possibly run. Up to 10 messages may be delivered
|
26
|
+
# to a handler at one time, so you'll want this to be at least 10x the maximum time you
|
27
|
+
# expect to spend for one message. The job activator usually will be pretty fast,
|
28
|
+
# but we default to a high number here to allow for the times when things go weird.
|
29
|
+
timeout: <%= activator_config_value 'timeout' %>
|
30
|
+
# reservedConcurrency represents the maximum number of concurrent executions.
|
31
|
+
# For the job activator you probably don't want to limit it because you
|
32
|
+
# want to get things onto work queues as quickly as possible when they're ready.
|
33
|
+
reservedConcurrency: <%= activator_config_value 'reservedConcurrency' %>
|
34
|
+
# provisionedConcurrency represents the number of lambda functions that will always
|
35
|
+
# be available. For the job activator you probably don't need to set this
|
36
|
+
# since it will be running on a schedule
|
37
|
+
provisionedConcurrency: <%= activator_config_value 'provisionedConcurrency' %>
|
38
|
+
# Use memory_size to adjust the reousrces (both memory and CPU) available.
|
39
|
+
# For the job activator you probably don't need this to be too large,
|
40
|
+
# but if you're seeing large delays at this stage it might help to bump it up.
|
41
|
+
memorySize: <%= activator_config_value 'memorySize' %>
|
42
|
+
batchSize: <%= activator_config_value 'batchSize' %>
|
43
|
+
maximumBatchingWindow: <%= activator_config_value 'maximumBatchingWindow' %>
|
44
|
+
visibilityTimeout: <%= activator_config_value 'visibilityTimeout' %>
|
45
|
+
logRetentionInDays: <%= activator_config_value 'logRetentionInDays' %>
|
46
|
+
|
47
|
+
|
48
|
+
|
24
49
|
<%- queue_names.each do |queue_name| -%>
|
25
50
|
<%= queue_name.camelize %>QueueHandler:
|
26
51
|
# timeout is how long the handler can possibly run. Up to 10 messages may be delivered
|
@@ -61,5 +86,6 @@ DashboardName: ${self:service}-${self:custom.stage}-dashboard
|
|
61
86
|
<%= queue_name.camelize %>DeadJobQueueName: ${self:service}-${self:custom.stage}-<%= queue_name.underscore.dasherize %>-dead
|
62
87
|
<%= queue_name.camelize %>QueueHandlerName: ${self:service}-${self:custom.stage}-<%= queue_name.camelize %>QueueHandler
|
63
88
|
<%- end -%>
|
64
|
-
|
65
|
-
|
89
|
+
JobsTableName: ${self:service}-${self:custom.stage}-jobs
|
90
|
+
ActivityTableName: ${self:service}-${self:custom.stage}-activity
|
91
|
+
JobActivatorName: ${self:service}-${self:custom.stage}-JobActivator
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Resources:
|
2
|
+
ActivityTable:
|
3
|
+
Type: AWS::DynamoDB::Table
|
4
|
+
Properties:
|
5
|
+
# Generate a name based on the stage
|
6
|
+
TableName: ${self:custom.funktor.ActivityTableName}
|
7
|
+
BillingMode: PAY_PER_REQUEST
|
8
|
+
AttributeDefinitions:
|
9
|
+
- AttributeName: category
|
10
|
+
AttributeType: S
|
11
|
+
- AttributeName: statName
|
12
|
+
AttributeType: S
|
13
|
+
KeySchema:
|
14
|
+
- AttributeName: category
|
15
|
+
KeyType: HASH
|
16
|
+
- AttributeName: statName
|
17
|
+
KeyType: RANGE
|
18
|
+
|
19
|
+
Outputs:
|
20
|
+
ActivityTable:
|
21
|
+
Value:
|
22
|
+
Ref: ActivityTable
|