funktor 0.2.1 → 0.2.2

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.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +35 -0
  3. data/.gitignore +2 -2
  4. data/Gemfile.lock +2 -2
  5. data/funktor.gemspec +1 -1
  6. data/lib/funktor.rb +0 -1
  7. data/lib/funktor/cli/bootstrap.rb +7 -7
  8. data/lib/funktor/cli/init.rb +80 -26
  9. data/lib/funktor/cli/templates/{handlers → app/handlers}/incoming_job_handler.rb +0 -0
  10. data/lib/funktor/cli/templates/{handlers/active_job_handler.rb → app/handlers/work_queue_handler.rb} +0 -0
  11. data/lib/funktor/cli/templates/{workers → app/workers}/hello_worker.rb +0 -0
  12. data/lib/funktor/cli/templates/config/environment.yml +4 -2
  13. data/lib/funktor/cli/templates/{function_definitions → config/function_definitions}/incoming_job_handler.yml +1 -1
  14. data/lib/funktor/cli/templates/config/function_definitions/work_queue_handler.yml +11 -0
  15. data/lib/funktor/cli/templates/config/funktor.yml +13 -8
  16. data/lib/funktor/cli/templates/{iam_permissions → config/iam_permissions}/incoming_job_queue.yml +0 -0
  17. data/lib/funktor/cli/templates/{iam_permissions → config/iam_permissions}/ssm.yml +0 -0
  18. data/lib/funktor/cli/templates/{iam_permissions/active_job_queue.yml → config/iam_permissions/work_queue.yml} +1 -1
  19. data/lib/funktor/cli/templates/config/package.yml +3 -2
  20. data/lib/funktor/cli/templates/{resources → config/resources}/cloudwatch_dashboard.yml +3 -3
  21. data/lib/funktor/cli/templates/{resources → config/resources}/incoming_job_queue.yml +0 -0
  22. data/lib/funktor/cli/templates/{resources → config/resources}/incoming_job_queue_user.yml +0 -0
  23. data/lib/funktor/cli/templates/config/resources/work_queue.yml +22 -0
  24. data/lib/funktor/cli/templates/funktor_init.yml.tt +72 -0
  25. data/lib/funktor/cli/templates/package.json +8 -1
  26. data/lib/funktor/cli/templates/serverless.yml +19 -12
  27. data/lib/funktor/incoming_job_handler.rb +11 -1
  28. data/lib/funktor/job.rb +4 -0
  29. data/lib/funktor/version.rb +1 -1
  30. data/lib/funktor/worker.rb +9 -0
  31. metadata +16 -18
  32. data/lib/funktor/cli/templates/function_definitions/active_job_handler.yml +0 -11
  33. data/lib/funktor/cli/templates/funktor.yml.tt +0 -51
  34. data/lib/funktor/cli/templates/resources/active_job_queue.yml +0 -22
  35. data/lib/funktor/deploy/cli.rb +0 -42
  36. data/lib/funktor/deploy/serverless.rb +0 -60
  37. data/lib/funktor/deploy/serverless_templates/serverless.yml +0 -156
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 154286564dee4cc895ef3515dcacfa515a91ecde743862e36c833d6db0389447
4
- data.tar.gz: e1786a3bdda966cd7d1fdda07ae3faf12f3ec2ca27b51506257520b3d13b02dd
3
+ metadata.gz: 38d383dcdafdb71a93c3ab881ec7772e8694fe0a8ca913a11a27ab634b068349
4
+ data.tar.gz: 92e17fab7ca35700c1721dbd9f674d14a1dd8a033486ed1af9d65236cad305cc
5
5
  SHA512:
6
- metadata.gz: c6b7de2400aceac0dcad12d2ad4093a07be595a120f88c58eddf7fa63f3a353e7637c47963cca8e79263b1ec29838ee5c26147a0e924cc7508092ac968e104b2
7
- data.tar.gz: c5cf1bdea5c9ad86415d7da9350b28699900b623a05d4860ecfb11c77daa773fbdd4b1c33a166cfa7c7025a238c268d3748b8a9b9989043e0f29cae6a8446d99
6
+ metadata.gz: 1643f95d5f02f83272c2304e6c22cda5c91bb39f4f109cd4d363d9b667294679dbfa4634962162193dd9c2ea90da57f21048a41d2b5710a80f19c91631136f8d
7
+ data.tar.gz: 559c5693bf8a958b22e0b6b189f72ca43d758701498ccb85c52c3cf3a9e7c2b148d26d17efdea72089328e393c1ad671b3d03b6f8dcee1ac39498fc6cf6f7535
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ main ]
13
+ pull_request:
14
+ branches: [ main ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.6', '2.7', '3.0']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Run tests
35
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -10,6 +10,6 @@
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
12
 
13
- # The funktor dir isn't a real part of the gem, it's where things
13
+ # The funktor app dir isn't a real part of the gem, it's where things
14
14
  # get generated as I'm testing the gem locally. It doesn't need to be in git.
15
- /funktor/
15
+ /myapp-funktor/
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- funktor (0.2.1)
4
+ funktor (0.2.2)
5
5
  activesupport
6
6
  aws-sdk-sqs (~> 1.37)
7
7
  thor
@@ -41,7 +41,7 @@ GEM
41
41
  minitest (5.14.4)
42
42
  public_suffix (4.0.6)
43
43
  rake (12.3.3)
44
- rexml (3.2.4)
44
+ rexml (3.2.5)
45
45
  rspec (3.10.0)
46
46
  rspec-core (~> 3.10.0)
47
47
  rspec-expectations (~> 3.10.0)
data/funktor.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
 
32
32
  spec.add_dependency 'aws-sdk-sqs', '~> 1.37'
33
33
  spec.add_dependency "activesupport" # TODO - Can we build our own verison of cattr_accessor to avoid this?
34
- spec.add_dependency "thor" # TODO - Can we build our own verison of cattr_accessor to avoid this?
34
+ spec.add_dependency "thor" # Thor drives the CLI
35
35
 
36
36
  spec.add_development_dependency 'simplecov'
37
37
  spec.add_development_dependency 'webmock'
data/lib/funktor.rb CHANGED
@@ -11,7 +11,6 @@ require 'json'
11
11
 
12
12
  module Funktor
13
13
  class Error < StandardError; end
14
- # Your code goes here...
15
14
 
16
15
  def self.configure_job_pusher
17
16
  yield self
@@ -3,16 +3,15 @@ module Funktor
3
3
  class Bootstrap < Thor::Group
4
4
  include Thor::Actions
5
5
 
6
+ argument :name, :type => :string, :desc => "The name of the app to initialize"
7
+
6
8
  class_option :file, :aliases => "-f",
7
9
  :type => :string, :desc => "The bootstrap file to generate.",
8
- :default => "funktor.yml"
9
- class_option :directory, :aliases => "-d",
10
- :type => :string, :desc => "The directory to initialize",
11
- :default => "funktor"
10
+ :default => "funktor_init.yml"
12
11
 
13
12
  desc <<~DESC
14
13
  Description:
15
- Bootstrap a new funktor application by generating a funktor.yml file."
14
+ Bootstrap a new funktor application by generating a funktor_init.yml file."
16
15
  DESC
17
16
 
18
17
  def self.source_root
@@ -20,13 +19,14 @@ module Funktor
20
19
  end
21
20
 
22
21
  def funktor_yml
22
+ # TODO - Should we camelize the app name before writing it into the config? (CloudFormation names get weird with underscores and dashes.)
23
23
  puts funktor_file_target
24
- template "templates/funktor.yml", funktor_file_target
24
+ template "templates/funktor_init.yml", funktor_file_target
25
25
  end
26
26
 
27
27
  private
28
28
  def funktor_file_target
29
- File.join options[:directory], options[:file]
29
+ File.join name, options[:file]
30
30
  end
31
31
 
32
32
  end
@@ -1,14 +1,21 @@
1
+ require 'yaml'
2
+ require 'active_support/core_ext/string/inflections'
3
+
1
4
  module Funktor
2
5
  module CLI
3
6
  class Init < Thor::Group
4
7
  include Thor::Actions
5
8
 
6
- class_option :framework, :aliases => "-f",
9
+ attr_accessor :work_queue_name
10
+ attr_accessor :work_queue_config
11
+
12
+ class_option :deployment_framework, :aliases => "-d",
7
13
  :type => :string, :desc => "The deployment/provisioning framework to use.",
8
14
  :default => "serverless"
9
- class_option :directory, :aliases => "-d",
10
- :type => :string, :desc => "The directory to initialize",
11
- :default => "funktor"
15
+
16
+ class_option :file, :aliases => "-f",
17
+ :type => :string, :desc => "The funktor init file.",
18
+ :default => "funktor.yml"
12
19
 
13
20
  desc <<~DESC
14
21
  Description:
@@ -20,59 +27,106 @@ module Funktor
20
27
  end
21
28
 
22
29
  def self.destination_root
23
- options[:directory]
30
+ name
24
31
  end
25
32
 
26
33
  def serverless_yml
27
- template "serverless.yml", File.join(options[:directory], "serverless.yml")
34
+ template "serverless.yml", File.join("serverless.yml")
28
35
  end
29
36
 
30
37
  def funktor_config_yml
31
- #template "funktor_config.yml", File.join(options[:directory], "funktor_config.yml")
32
- template File.join("config", "funktor.yml"), File.join(options[:directory], "config", "funktor.yml")
33
- template File.join("config", "ruby_layer.yml"), File.join(options[:directory], "config", "ruby_layer.yml")
34
- template File.join("config", "package.yml"), File.join(options[:directory], "config", "package.yml")
35
- template File.join("config", "environment.yml"), File.join(options[:directory], "config", "environment.yml")
38
+ #template "funktor_config.yml", File.join("funktor_config.yml")
39
+ template File.join("config", "funktor.yml"), File.join("config", "funktor.yml")
40
+ template File.join("config", "ruby_layer.yml"), File.join("config", "ruby_layer.yml")
41
+ template File.join("config", "package.yml"), File.join("config", "package.yml")
42
+ template File.join("config", "environment.yml"), File.join("config", "environment.yml")
36
43
  end
37
44
 
38
45
  def package_json
39
- template "package.json", File.join(options[:directory], "package.json")
46
+ template "package.json", File.join("package.json")
40
47
  end
41
48
 
42
49
  def gemfile
43
- template "Gemfile", File.join(options[:directory], "Gemfile")
50
+ template "Gemfile", File.join("Gemfile")
44
51
  end
45
52
 
46
53
  def gitignore
47
- template "gitignore", File.join(options[:directory], ".gitignore")
54
+ template "gitignore", File.join(".gitignore")
48
55
  end
49
56
 
50
57
  def resources
51
- template File.join("resources", "incoming_job_queue.yml"), File.join(options[:directory], "resources", "incoming_job_queue.yml")
52
- template File.join("resources", "incoming_job_queue_user.yml"), File.join(options[:directory], "resources", "incoming_job_queue_user.yml")
53
- template File.join("resources", "active_job_queue.yml"), File.join(options[:directory], "resources", "active_job_queue.yml")
54
- template File.join("resources", "cloudwatch_dashboard.yml"), File.join(options[:directory], "resources", "cloudwatch_dashboard.yml")
58
+ template File.join("config", "resources", "incoming_job_queue.yml"), File.join("config", "resources", "incoming_job_queue.yml")
59
+ template File.join("config", "resources", "incoming_job_queue_user.yml"), File.join("config", "resources", "incoming_job_queue_user.yml")
60
+ # TODO - Figure out how to make the dashboard aware of various queues...
61
+ template File.join("config", "resources", "cloudwatch_dashboard.yml"), File.join("config", "resources", "cloudwatch_dashboard.yml")
62
+ queues.each do |queue_details|
63
+ @work_queue_name = queue_details.keys.first
64
+ @work_queue_config = queue_details.values.first
65
+ template File.join("config", "resources", "work_queue.yml"), File.join("config", "resources", "#{work_queue_name.underscore}_queue.yml")
66
+ end
55
67
  end
56
68
 
57
69
  def iam_permissions
58
- template File.join("iam_permissions", "ssm.yml"), File.join(options[:directory], "iam_permissions", "ssm.yml")
59
- template File.join("iam_permissions", "incoming_job_queue.yml"), File.join(options[:directory], "iam_permissions", "incoming_job_queue.yml")
60
- template File.join("iam_permissions", "active_job_queue.yml"), File.join(options[:directory], "iam_permissions", "active_job_queue.yml")
70
+ template File.join("config", "iam_permissions", "ssm.yml"), File.join("config", "iam_permissions", "ssm.yml")
71
+ template File.join("config", "iam_permissions", "incoming_job_queue.yml"), File.join("config", "iam_permissions", "incoming_job_queue.yml")
72
+ queues.each do |queue_details|
73
+ @work_queue_name = queue_details.keys.first
74
+ @work_queue_config = queue_details.values.first
75
+ template File.join("config", "iam_permissions", "work_queue.yml"), File.join("config", "iam_permissions", "#{work_queue_name.underscore}_queue.yml")
76
+ end
61
77
  end
62
78
 
63
79
  def function_definitions
64
- template File.join("function_definitions", "active_job_handler.yml"), File.join(options[:directory], "function_definitions", "active_job_handler.yml")
65
- template File.join("function_definitions", "incoming_job_handler.yml"), File.join(options[:directory], "function_definitions", "incoming_job_handler.yml")
80
+ template File.join("config", "function_definitions", "incoming_job_handler.yml"), File.join("config", "function_definitions", "incoming_job_handler.yml")
81
+ queues.each do |queue_details|
82
+ @work_queue_name = queue_details.keys.first
83
+ @work_queue_config = queue_details.values.first
84
+ template File.join("config", "function_definitions", "work_queue_handler.yml"), File.join("config", "function_definitions", "#{work_queue_name.underscore}_queue_handler.yml")
85
+ end
66
86
  end
67
87
 
68
88
  def lambda_handlers
69
- template File.join("handlers", "active_job_handler.rb"), File.join(options[:directory], "handlers", "active_job_handler.rb")
70
- template File.join("handlers", "incoming_job_handler.rb"), File.join(options[:directory], "handlers", "incoming_job_handler.rb")
89
+ template File.join("app", "handlers", "incoming_job_handler.rb"), File.join("app", "handlers", "incoming_job_handler.rb")
90
+ queues.each do |queue_details|
91
+ @work_queue_name = queue_details.keys.first
92
+ @work_queue_config = queue_details.values.first
93
+ template File.join("app", "handlers", "work_queue_handler.rb"), File.join("app", "handlers", "#{work_queue_name.underscore}_queue_handler.rb")
94
+ end
71
95
  end
72
96
 
73
97
  def workers
74
- template File.join("workers", "hello_worker.rb"), File.join(options[:directory], "workers", "hello_worker.rb")
98
+ template File.join("app", "workers", "hello_worker.rb"), File.join("app", "workers", "hello_worker.rb")
99
+ end
100
+
101
+ private
102
+ def funktor_config
103
+ @funktor_config ||= YAML.load_file options[:file]
104
+ end
105
+
106
+ def name
107
+ funktor_config["appName"]
108
+ end
109
+
110
+ def runtime
111
+ funktor_config["runtime"]
75
112
  end
113
+
114
+ def queues
115
+ funktor_config["queues"]
116
+ end
117
+
118
+ def queue_names
119
+ funktor_config["queues"].map{|queue_details| queue_details.keys.first }
120
+ end
121
+
122
+ def work_queue_name
123
+ @work_queue_name
124
+ end
125
+
126
+ def work_queue_config
127
+ @work_queue_config
128
+ end
129
+
76
130
  end
77
131
  end
78
132
  end
@@ -1,4 +1,6 @@
1
1
  FUNKTOR_INCOMING_JOB_QUEUE:
2
2
  Ref: IncomingJobQueue
3
- FUNKTOR_ACTIVE_JOB_QUEUE:
4
- Ref: ActiveJobQueue
3
+ <%- queue_names.each do |queue_name| -%>
4
+ FUNKTOR_<%= queue_name.underscore.upcase %>_QUEUE:
5
+ Ref: <%= queue_name.camelize %>Queue
6
+ <%- end -%>
@@ -1,4 +1,4 @@
1
- handler: handlers/incoming_job_handler.call
1
+ handler: app/handlers/incoming_job_handler.call
2
2
  timeout: ${self:custom.funktor.incomingJobHandler.timeout, 30}
3
3
  reservedConcurrency: ${self:custom.funktor.incomingJobHandler.reservedConcurrency, null}
4
4
  provisionedConcurrency: ${self:custom.funktor.incomingJobHandler.provisionedConcurrency, null}
@@ -0,0 +1,11 @@
1
+ handler: app/handlers/<%= work_queue_name.underscore %>_queue_handler.call
2
+ timeout: ${self:custom.funktor.<%= work_queue_name.camelize %>QueueHandler.timeout, 900}
3
+ reservedConcurrency: ${self:custom.funktor.<%= work_queue_name.camelize %>QueueHandler.reservedConcurrency, null}
4
+ provisionedConcurrency: ${self:custom.funktor.<%= work_queue_name.camelize %>QueueHandler.provisionedConcurrency, null}
5
+ memorySize: ${self:custom.funktor.<%= work_queue_name.camelize %>QueueHandler.memorySize, 256}
6
+ events:
7
+ - sqs:
8
+ arn:
9
+ Fn::GetAtt:
10
+ - <%= work_queue_name.camelize %>Queue
11
+ - Arn
@@ -3,7 +3,7 @@ incomingJobHandler:
3
3
  # to a handler at one time, so you'll want this to be at least 10x the maximum time you
4
4
  # expect to spend for one message. The incoming job handler usually will be pretty fast,
5
5
  # but we default to a high number here to allow for the times when things go weird.
6
- timeout: 900
6
+ timeout: 300
7
7
  # reservedConcurrency represents the maximum number of concurrent executions.
8
8
  # For the incoming job handler you probably don't want to limit it because you
9
9
  # want to get things onto work queues as quickly as possible.
@@ -17,12 +17,13 @@ incomingJobHandler:
17
17
  # but if you're seeing large delays at this stage it might help to bump it up.
18
18
  memorySize: 256
19
19
 
20
- activeJobHandler:
20
+ <%- queue_names.each do |queue_name| -%>
21
+ <%= queue_name.camelize %>QueueHandler:
21
22
  # timeout is how long the handler can possibly run. Up to 10 messages may be delivered
22
23
  # to a handler at one time, so you'll want this to be at least 10x the maximum time you
23
24
  # expect to spend for one message. The active job handler may be slow if your jobs are
24
25
  # doing a lot of work, so we default to the maximum here.
25
- timeout: 900
26
+ timeout: 300 # TODO pull this (and other values) from funktor_init.yml
26
27
  # reservedConcurrency represents the maximum number of concurrent executions.
27
28
  # For the active job handler you may want to limit it if you have resource limitations
28
29
  # like database connections that you need to avoid exhausting.
@@ -36,16 +37,20 @@ activeJobHandler:
36
37
  # required to actually do your jobs. You can choose an even higher number to increase
37
38
  # the available CPU to make the jobs run faster.
38
39
  memorySize: 256
40
+ <%- end -%>
41
+
39
42
 
40
43
 
41
44
 
42
45
  # You shouldn't need to mess with these under most circumstances. But you could if you want to change
43
46
  # the name of some of your resources in AWS.
44
47
  incomingJobQueueName: ${self:service}-${self:custom.stage}-incoming-jobs
48
+ incomingDeadJobQueueName: ${self:service}-${self:custom.stage}-incoming-dead
45
49
  incomingJobQueueAccessPolicyName: ${self:service}-${self:custom.stage}-incoming-job-queue-access
46
- incomingDeadJobQueueName: ${self:service}-${self:custom.stage}-incoming-dead-jobs
47
- activeJobQueueName: ${self:service}-${self:custom.stage}-active-jobs
48
- activityQueueName: ${self:service}-${self:custom.stage}-activity
49
- activityDeadQueueName: ${self:service}-${self:custom.stage}-activity-dead
50
- deadJobQueueName: ${self:service}-${self:custom.stage}-dead-jobs
51
50
  dashboardName: ${self:service}-${self:custom.stage}-dashboard
51
+ <%- queue_names.each do |queue_name| -%>
52
+ <%= queue_name.camelize %>QueueName: ${self:service}-${self:custom.stage}-<%= queue_name.underscore.dasherize %>
53
+ <%= queue_name.camelize %>DeadJobQueueName: ${self:service}-${self:custom.stage}-<%= queue_name.underscore.dasherize %>-dead
54
+ <%- end -%>
55
+
56
+
@@ -5,4 +5,4 @@ Action:
5
5
  - sqs:SendMessage
6
6
  - sqs:GetQueueAttributes
7
7
  Resource:
8
- - "Fn::GetAtt": [ ActiveJobQueue, Arn ]
8
+ - "Fn::GetAtt": [ <%= work_queue_name.camelize %>Queue, Arn ]
@@ -1,8 +1,9 @@
1
+ # TODO - Figure out how to allow individual packaging to work out of the box.
2
+ individually: false
1
3
  include:
2
4
  - Gemfile
3
5
  - Gemfile.lock
4
- - handlers/**
5
- - workers/**
6
+ - app/**
6
7
  # Evertyting is excluded by default with serverless-ruby-layer, but you could use
7
8
  # the lines below to exlude files that are inside an include path.
8
9
  #exclude:
@@ -40,10 +40,10 @@ Resources:
40
40
  "type": "metric",
41
41
  "properties": {
42
42
  "metrics": [
43
- [ "AWS/SQS", "NumberOfMessagesReceived", "QueueName", "${self:custom.funktor.activeJobQueueName}", { "label": "Received" } ],
43
+ [ "AWS/SQS", "NumberOfMessagesReceived", "QueueName", "${self:custom.funktor.DefaultQueueName}", { "label": "Received" } ],
44
44
  [ ".", "NumberOfMessagesDeleted", ".", ".", { "label": "Handled" } ],
45
- [ "AWS/Lambda", "Invocations", "FunctionName", "${self:service}-${self:provider.stage}-activeJobHandler", "Resource", "${self:service}-${self:provider.stage}-activeJobHandler", { "label": "Handler Invocations" } ],
46
- [ "AWS/SQS", "ApproximateNumberOfMessagesVisible", "QueueName", "${self:custom.funktor.activeJobQueueName}", { "label": "Pending?" } ],
45
+ [ "AWS/Lambda", "Invocations", "FunctionName", "${self:service}-${self:provider.stage}-DefaultQueueHandler", "Resource", "${self:service}-${self:provider.stage}-DefaultQueueHandler", { "label": "Handler Invocations" } ],
46
+ [ "AWS/SQS", "ApproximateNumberOfMessagesVisible", "QueueName", "${self:custom.funktor.DefaultQueueName}", { "label": "Pending?" } ],
47
47
  [ ".", "ApproximateNumberOfMessagesNotVisible", ".", ".", { "label": "Backlog?" } ],
48
48
  [ ".", "NumberOfMessagesSent", ".", ".", { "label": "Sent" } ],
49
49
  [ ".", "ApproximateNumberOfMessagesDelayed", ".", ".", { "label": "Delayed" } ]
@@ -0,0 +1,22 @@
1
+ Resources:
2
+ <%= work_queue_name.camelize %>Queue:
3
+ Type: AWS::SQS::Queue
4
+ Properties:
5
+ QueueName: ${self:custom.funktor.<%= work_queue_name.camelize %>QueueName}
6
+ VisibilityTimeout: 300
7
+ RedrivePolicy:
8
+ deadLetterTargetArn:
9
+ "Fn::GetAtt": [ <%= work_queue_name.camelize %>DeadLetterQueue, Arn ]
10
+ maxReceiveCount: 5
11
+ <%= work_queue_name.camelize %>DeadLetterQueue:
12
+ Type: AWS::SQS::Queue
13
+ Properties:
14
+ QueueName: ${self:custom.funktor.<%= work_queue_name.camelize %>DeadJobQueueName}
15
+
16
+ Outputs:
17
+ <%= work_queue_name.camelize %>QueueUrl:
18
+ Value:
19
+ Ref: <%= work_queue_name.camelize %>Queue
20
+ <%= work_queue_name.camelize %>DeadLetterQueueUrl:
21
+ Value:
22
+ Ref: <%= work_queue_name.camelize %>DeadLetterQueue
@@ -0,0 +1,72 @@
1
+ # ℹ️ WARNING: This file doesn't control anything directly. It's used to allow you to set/maintain config options in a central place.
2
+ # When you make changes to this file you should run `funktor init` again to propagate the changes to the 'active' configuration files.
3
+ appName: <%= name %>
4
+ runtime: ruby2.7
5
+
6
+ # These values will be applied to any funktor handlers that don't specify custom values.
7
+ # TODO - These still need to be wired up to do anything.
8
+ handler_defaults:
9
+ # timeout is how long the handler can possibly run. Up to 10 messages may be delivered
10
+ # to a handler at one time, so you'll want this to be at least 10x the maximum time you
11
+ # expect to spend for one message. We default to a high number here to allow for the
12
+ # times when things go weird.
13
+ timeout: 900
14
+
15
+ # reservedConcurrency represents the maximum number of concurrent executions.
16
+ # Usually you'll want to leave this as null so that handlers can scale infinitely
17
+ # (within your account limits). If you need to restrict concurrency to prevent
18
+ # resource exhaustion you should do it at the queue level.
19
+ reservedConcurrency: null
20
+
21
+ # provisionedConcurrency represents the number of lambda functions that will always
22
+ # be available. You probably want to set this on individual queues if you're going
23
+ # to use it.
24
+ provisionedConcurrency: null
25
+
26
+ # Use memory_size to adjust the reousrces (both memory and CPU) available.
27
+ # We default to 256 as a reasonable trade off on saving money but getting
28
+ # reasonable performance.
29
+ memorySize: 256
30
+
31
+ # You can set the batch size. Max of 10_000 for normal queues, 10 for FIFO.
32
+ batchSize: 10
33
+
34
+ # How many seconds should AWS wait for a batch to fill up before executing lambda?
35
+ # For immediate execution set the batch size to 1.
36
+ maximumBatchingWindow : 1
37
+
38
+ # Visibility timeout should only come into play in the case of Funktor errors.
39
+ # Application level errors should be handled by Funktor retry mechanisms.
40
+ # The visibility timeout should be at least as long as the function timeout, and up to 6 times larger.
41
+ visibilityTimeout: 900
42
+
43
+ # Set log rentention to save money
44
+ logRetentionInDays: 30
45
+
46
+ # Incoming Job Handler
47
+ # TODO - These still need to be wired up to do anything.
48
+ incoming_job_handler:
49
+ # If your jobs are bursty AND time-sensitive you might want to have some lambdas pre-provisioned
50
+ # to quickly handle jobs at the beginning of a burst. Uncomment the line below if so.
51
+ # provisionedConcurrency: 4
52
+
53
+
54
+ # TODO - These still need to be wired up to do anything.
55
+ queues:
56
+ - default:
57
+ # Set queue specific config options here
58
+ # memorySize: 512
59
+ # TODO - Is it advisable to use FIFO queuues with Funktor?
60
+ # TODO - Maybe this isn't really even supported by CloudFormation?
61
+ # fifo: false
62
+ - singleThread:
63
+ reservedConcurrency: 1
64
+
65
+ # TODO - Maybe this shouldn't be surfaced this early?
66
+ # TODO - This still needs to be wired up to do anything.
67
+ package:
68
+ patterns:
69
+ - Gemfile
70
+ - Gemfile.lock
71
+ - app/**
72
+ - config/**
@@ -1 +1,8 @@
1
- {"name":"serverless-sub","description":"","version":"0.1.0","devDependencies":{"serverless-ruby-layer":"^1.4.0"}}
1
+ {
2
+ "name":"<%= name %>",
3
+ "description":"",
4
+ "version":"0.1.0",
5
+ "devDependencies":{
6
+ "serverless-ruby-layer":"^1.4.0"
7
+ }
8
+ }
@@ -12,7 +12,7 @@
12
12
  # Happy Coding!
13
13
 
14
14
  # The name of your service. All your AWS resources will contain this name.
15
- service: yourapp-funktor
15
+ service: <%= name %>
16
16
 
17
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
18
  configValidationMode: error
@@ -22,13 +22,16 @@ frameworkVersion: '2'
22
22
 
23
23
  provider:
24
24
  name: aws
25
- runtime: ruby2.7
25
+ runtime: <%= runtime %>
26
26
  lambdaHashingVersion: 20201221
27
27
  environment: ${file(config/environment.yml)}
28
+ versionFunctions: false # Reduces the amount of storage used since all Lambdas together are limited to 75GB
28
29
  iamRoleStatements:
29
- - ${file(iam_permissions/ssm.yml)}
30
- - ${file(iam_permissions/active_job_queue.yml)}
31
- - ${file(iam_permissions/incoming_job_queue.yml)}
30
+ - ${file(config/iam_permissions/ssm.yml)}
31
+ - ${file(config/iam_permissions/incoming_job_queue.yml)}
32
+ <%- queue_names.each do |queue_name| -%>
33
+ - ${file(config/iam_permissions/<%= queue_name.underscore %>_queue.yml)}
34
+ <%- end -%>
32
35
 
33
36
 
34
37
  custom:
@@ -41,14 +44,18 @@ custom:
41
44
  package: ${file(config/package.yml)}
42
45
 
43
46
  functions:
44
- incomingJobHandler: ${file(function_definitions/incoming_job_handler.yml)}
45
- activeJobHandler: ${file(function_definitions/active_job_handler.yml)}
47
+ incomingJobHandler: ${file(config/function_definitions/incoming_job_handler.yml)}
48
+ <%- queue_names.each do |queue_name| -%>
49
+ <%= queue_name.camelize %>QueueHandler: ${file(config/function_definitions/<%= queue_name.underscore %>_queue_handler.yml)}
50
+ <%- end -%>
46
51
 
47
52
  resources:
48
- - ${file(resources/active_job_queue.yml)}
49
- - ${file(resources/incoming_job_queue.yml)}
50
- - ${file(resources/incoming_job_queue_user.yml)}
51
- - ${file(resources/cloudwatch_dashboard.yml)}
53
+ - ${file(config/resources/incoming_job_queue.yml)}
54
+ - ${file(config/resources/incoming_job_queue_user.yml)}
55
+ - ${file(config/resources/cloudwatch_dashboard.yml)}
56
+ <%- queue_names.each do |queue_name| -%>
57
+ - ${file(config/resources/<%= queue_name.underscore %>_queue.yml)}
58
+ <%- end -%>
52
59
 
53
60
  plugins:
54
- - /Users/jgreen/projects/serverless-ruby-layer
61
+ - serverless-ruby-layer
@@ -1,4 +1,5 @@
1
1
  require 'aws-sdk-sqs'
2
+ require 'active_support/core_ext/string/inflections'
2
3
 
3
4
  module Funktor
4
5
  class IncomingJobHandler
@@ -26,10 +27,19 @@ module Funktor
26
27
  ENV['FUNKTOR_ACTIVE_JOB_QUEUE']
27
28
  end
28
29
 
30
+ def queue_for_job(job)
31
+ queue_name = job.queue || 'default'
32
+ queue_constant = "FUNKTOR_#{queue_name.underscore.upcase}_QUEUE"
33
+ puts "queue_constant = #{queue_constant}"
34
+ puts "ENV value = #{ENV[queue_constant]}"
35
+ ENV[queue_constant] || ENV['FUNKTOR_DEFAULT_QUEUE']
36
+ end
37
+
29
38
  def push_to_active_job_queue(job)
39
+ puts "job = #{job.to_json}"
30
40
  sqs_client.send_message({
31
41
  # TODO : How to get this URL...
32
- queue_url: active_job_queue,
42
+ queue_url: queue_for_job(job),
33
43
  message_body: job.to_json,
34
44
  delay_seconds: job.delay
35
45
  })
data/lib/funktor/job.rb CHANGED
@@ -10,6 +10,10 @@ module Funktor
10
10
  @job_data ||= Funktor.parse_json(job_string)
11
11
  end
12
12
 
13
+ def queue
14
+ job_data["queue"]
15
+ end
16
+
13
17
  def worker_class_name
14
18
  job_data["worker"]
15
19
  end
@@ -1,3 +1,3 @@
1
1
  module Funktor
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -28,6 +28,10 @@ module Funktor::Worker
28
28
  get_funktor_options[:queue_url]
29
29
  end
30
30
 
31
+ def custom_queue
32
+ get_funktor_options[:queue]
33
+ end
34
+
31
35
  def queue_url
32
36
  # TODO : Should this default to FUNKTOR_ACTIVE_JOB_QUEUE?
33
37
  # Depends how e handle this in pro...?
@@ -73,10 +77,15 @@ module Funktor::Worker
73
77
  @client ||= Aws::SQS::Client.new
74
78
  end
75
79
 
80
+ def work_queue
81
+ (self.custom_queue || 'default').to_s
82
+ end
83
+
76
84
  def build_job_payload(job_id, delay, *worker_params)
77
85
  {
78
86
  worker: self.name,
79
87
  worker_params: worker_params,
88
+ queue: self.work_queue,
80
89
  job_id: job_id,
81
90
  delay: delay,
82
91
  funktor_options: get_funktor_options
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: funktor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Green
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-04 00:00:00.000000000 Z
11
+ date: 2021-06-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-sqs
@@ -89,6 +89,7 @@ executables:
89
89
  extensions: []
90
90
  extra_rdoc_files: []
91
91
  files:
92
+ - ".github/workflows/ruby.yml"
92
93
  - ".gitignore"
93
94
  - ".rspec"
94
95
  - ".travis.yml"
@@ -114,29 +115,26 @@ files:
114
115
  - lib/funktor/cli/generate/work_queue.rb
115
116
  - lib/funktor/cli/init.rb
116
117
  - lib/funktor/cli/templates/Gemfile
118
+ - lib/funktor/cli/templates/app/handlers/incoming_job_handler.rb
119
+ - lib/funktor/cli/templates/app/handlers/work_queue_handler.rb
120
+ - lib/funktor/cli/templates/app/workers/hello_worker.rb
117
121
  - lib/funktor/cli/templates/config/environment.yml
122
+ - lib/funktor/cli/templates/config/function_definitions/incoming_job_handler.yml
123
+ - lib/funktor/cli/templates/config/function_definitions/work_queue_handler.yml
118
124
  - lib/funktor/cli/templates/config/funktor.yml
125
+ - lib/funktor/cli/templates/config/iam_permissions/incoming_job_queue.yml
126
+ - lib/funktor/cli/templates/config/iam_permissions/ssm.yml
127
+ - lib/funktor/cli/templates/config/iam_permissions/work_queue.yml
119
128
  - lib/funktor/cli/templates/config/package.yml
129
+ - lib/funktor/cli/templates/config/resources/cloudwatch_dashboard.yml
130
+ - lib/funktor/cli/templates/config/resources/incoming_job_queue.yml
131
+ - lib/funktor/cli/templates/config/resources/incoming_job_queue_user.yml
132
+ - lib/funktor/cli/templates/config/resources/work_queue.yml
120
133
  - lib/funktor/cli/templates/config/ruby_layer.yml
121
- - lib/funktor/cli/templates/function_definitions/active_job_handler.yml
122
- - lib/funktor/cli/templates/function_definitions/incoming_job_handler.yml
123
- - lib/funktor/cli/templates/funktor.yml.tt
134
+ - lib/funktor/cli/templates/funktor_init.yml.tt
124
135
  - lib/funktor/cli/templates/gitignore
125
- - lib/funktor/cli/templates/handlers/active_job_handler.rb
126
- - lib/funktor/cli/templates/handlers/incoming_job_handler.rb
127
- - lib/funktor/cli/templates/iam_permissions/active_job_queue.yml
128
- - lib/funktor/cli/templates/iam_permissions/incoming_job_queue.yml
129
- - lib/funktor/cli/templates/iam_permissions/ssm.yml
130
136
  - lib/funktor/cli/templates/package.json
131
- - lib/funktor/cli/templates/resources/active_job_queue.yml
132
- - lib/funktor/cli/templates/resources/cloudwatch_dashboard.yml
133
- - lib/funktor/cli/templates/resources/incoming_job_queue.yml
134
- - lib/funktor/cli/templates/resources/incoming_job_queue_user.yml
135
137
  - lib/funktor/cli/templates/serverless.yml
136
- - lib/funktor/cli/templates/workers/hello_worker.rb
137
- - lib/funktor/deploy/cli.rb
138
- - lib/funktor/deploy/serverless.rb
139
- - lib/funktor/deploy/serverless_templates/serverless.yml
140
138
  - lib/funktor/fake_job_queue.rb
141
139
  - lib/funktor/incoming_job_handler.rb
142
140
  - lib/funktor/job.rb
@@ -1,11 +0,0 @@
1
- handler: handlers/active_job_handler.call
2
- timeout: ${self:custom.funktor.activeJobHandler.timeout, 900}
3
- reservedConcurrency: ${self:custom.funktor.activeJobHandler.reservedConcurrency, null}
4
- provisionedConcurrency: ${self:custom.funktor.activeJobHandler.provisionedConcurrency, null}
5
- memorySize: ${self:custom.funktor.activeJobHandler.memorySize, 256}
6
- events:
7
- - sqs:
8
- arn:
9
- Fn::GetAtt:
10
- - ActiveJobQueue
11
- - Arn
@@ -1,51 +0,0 @@
1
- # ℹ️ WARNING: This file doesn't control anything directly. It's used to allow you to set/maintain config options in a central place.
2
- # When you make changes to this file you should run `funktor init` again to propagate the changes to the 'active' configuration files.
3
- runtime: ruby2.7
4
-
5
- # Incoming Job Handler
6
- incoming_job_handler:
7
- # Use memory_size to adjust the reousrces (both memory and CPU) available
8
- # memory_size: 512
9
- timeout_in_seconds: 20 # This handler might have to handle several incoming jobs at once
10
- # WARNING : You probably don't want to limit concurrency on incoming jobs.
11
- # concurrency: 100
12
-
13
- # Delayed Job Activator
14
- delayed_job_activator:
15
- # Use memory_size to adjust the reousrces (both memory and CPU) available
16
- # memory_size: 512
17
- execution_schedule: rate(1 minute)
18
- activation_window_in_seconds: 120 # Activate any jobs scheduled for the next two minutes
19
- timeout_in_seconds: 300 # Allow an activation job to run for up to 5 minutes
20
- concurrency: 1
21
-
22
-
23
- queues:
24
- default:
25
- # Use memory_size to adjust the reousrces (both memory and CPU) available
26
- # memory_size: 512
27
- # You can set the batch size. Max of 10_000 for normal queues, 10 for FIFO.
28
- # batch_size: 10
29
- # How many seconds should AWS wait for a batch to fill up before executing lambda?
30
- # For immediate execution set the batch size to 1.
31
- # maximumBatchingWindow : 1
32
- # A single handler can receive up to batch_size jobs at a time. Make sure timeout is long enough.
33
- timeout_in_seconds: 300
34
- # You might want to limit concurrency of executing jobs to stay within resource limits (like DB connections).
35
- # concurrency: 10
36
- # Visibility timeout should only come into play in the case of Funktor errors.
37
- # Application level errors should be handled by Funktor retry mechanisms.
38
- # The visibility timeout should be at least as long as the function timeout, and up to 6 times larger.
39
- # visibility_timeout: 300
40
- # TODO - Is it advisable to use FIFO queuues with Funktor?
41
- # TODO - Maybe this isn't really even supported by CloudFormation?
42
- # fifo: false
43
-
44
- # TODO - Maybe this is handled in the Dockerfile?
45
- package:
46
- patterns:
47
- - Gemfile
48
- - Gemfile.lock
49
- - ../app/**
50
- - ../config/**
51
- - ../lambda_handlers/**
@@ -1,22 +0,0 @@
1
- Resources:
2
- ActiveJobQueue:
3
- Type: AWS::SQS::Queue
4
- Properties:
5
- QueueName: ${self:custom.funktor.activeJobQueueName}
6
- VisibilityTimeout: 300
7
- RedrivePolicy:
8
- deadLetterTargetArn:
9
- "Fn::GetAtt": [ ActiveJobDeadLetterQueue, Arn ]
10
- maxReceiveCount: 5
11
- ActiveJobDeadLetterQueue:
12
- Type: AWS::SQS::Queue
13
- Properties:
14
- QueueName: ${self:custom.funktor.deadJobQueueName}
15
-
16
- Outputs:
17
- ActiveJobQueueUrl:
18
- Value:
19
- Ref: ActiveJobQueue
20
- ActiveJobDeadLetterQueueUrl:
21
- Value:
22
- Ref: ActiveJobDeadLetterQueue
@@ -1,42 +0,0 @@
1
- require 'optparse'
2
- require 'funktor/deploy/serverless'
3
-
4
- module Funktor
5
- module Deploy
6
- class CLI
7
- attr_reader :options
8
- def initialize
9
- @options = {
10
- verbose: false,
11
- file: 'funktor.yml',
12
- tmp_dir_prefix: '.funktor',
13
- stage: 'dev'
14
- }
15
- end
16
-
17
- def parse(argv = ARGV)
18
- OptionParser.new do |opts|
19
- opts.on('-v', '--verbose', 'Display verbose output') do |verbose|
20
- options[:verbose] = verbose
21
- end
22
- opts.on('-f', '--file=FILE', 'The path to the funktor.yml file to deploy') do |file|
23
- options[:file] = file
24
- end
25
- opts.on('-t', '--tmp_dir_prefix=TMP_DIR_PREFIX', 'The prefix for the tmp dir. The stage will be appended.') do |tmp_dir_prefix|
26
- options[:tmp_dir_prefix] = tmp_dir_prefix
27
- end
28
- opts.on('-s', '--stage=STAGE', 'The stage to deploy to. Defaults to "dev"') do |stage|
29
- options[:stage] = stage
30
- end
31
- opts.on('-h') { puts opts; exit }
32
- opts.parse!(argv)
33
- end
34
- end
35
-
36
- def run
37
- Funktor::Deploy::Serverless.new(**options).call
38
- end
39
- end
40
- end
41
- end
42
-
@@ -1,60 +0,0 @@
1
- require 'yaml'
2
-
3
- module Funktor
4
- module Deploy
5
- class Serverless
6
- attr_accessor :file, :tmp_dir_prefix, :verbose, :stage
7
- def initialize(file:, tmp_dir_prefix:, verbose:, stage:)
8
- @file = file
9
- @tmp_dir_prefix = tmp_dir_prefix
10
- @verbose = verbose
11
- @stage = stage
12
- end
13
-
14
- def call
15
- #puts "deploying file #{file} via tmp_dir_prefix #{tmp_dir_prefix} for stage #{stage}"
16
- make_tmp_dir
17
- create_serverless_file
18
- end
19
-
20
- def funktor_data
21
- @funktor_data ||= squash_hash(YAML.load_file(file))
22
- end
23
-
24
- def squash_hash(hsh, stack=[])
25
- hsh.reduce({}) do |res, (key, val)|
26
- next_stack = [ *stack, key ]
27
- if val.is_a?(Hash)
28
- next res.merge(squash_hash(val, next_stack))
29
- end
30
- res.merge(next_stack.join(".").to_sym => val)
31
- end
32
- end
33
-
34
- def make_tmp_dir
35
- FileUtils.mkdir_p tmp_dir
36
- end
37
-
38
- def tmp_dir
39
- "#{tmp_dir_prefix}_#{stage}"
40
- end
41
-
42
- def create_serverless_file
43
- #puts "funktor_data = "
44
- #puts funktor_data
45
- template_source = File.open(serverless_file_source).read
46
- file_content = template_source % funktor_data
47
- File.open(serverless_file_destination, 'w') { |file| file.write(file_content) }
48
- end
49
-
50
- def serverless_file_source
51
- File.expand_path("../serverless_templates/serverless.yml", __FILE__)
52
- end
53
-
54
- def serverless_file_destination
55
- File.join tmp_dir, 'serverless.yml'
56
- end
57
- end
58
- end
59
- end
60
-
@@ -1,156 +0,0 @@
1
- # WARNING : You probably don't want to mess with this file directly.
2
- service: %{stack_name}
3
- # app and org for use with dashboard.serverless.com
4
- #app: your-app-name
5
- #org: your-org-name
6
-
7
- frameworkVersion: '2'
8
-
9
- provider:
10
- name: aws
11
- runtime: %{runtime}
12
- lambdaHashingVersion: 20201221
13
- ecr:
14
- images:
15
- funktorimage:
16
- path: ./
17
- # TODO : Expose buildArgs via funktor.yml?
18
- buildArgs:
19
- BUNDLE_GEM__FURY__IO: ${env:BUNDLE_GEM__FURY__IO}
20
- # TODO : Expose environment to funktor.yml?
21
- environment:
22
- FUNKTOR_INCOMING_JOB_QUEUE:
23
- Ref: IncomingJobQueue
24
- FUNKTOR_ACTIVE_JOB_QUEUE:
25
- Ref: ActiveJobQueue
26
- FUNKTOR_DELAYED_JOB_TABLE:
27
- Ref: DelayedJobTable
28
- delayedJobTable:
29
- Ref: DelayedJobTable
30
- iamRoleStatements:
31
- - Effect: Allow
32
- Action:
33
- - ssm:Get*
34
- Resource:
35
- - '*' # TODO : This should probably be more selective...
36
- - Effect: Allow
37
- Action:
38
- - sqs:ReceiveMessage
39
- - sqs:DeleteMessage
40
- - sqs:SendMessage
41
- - sqs:GetQueueAttributes
42
- Resource:
43
- - "Fn::GetAtt": [ ActiveJobQueue, Arn ]
44
- - Effect: Allow
45
- Action:
46
- - sqs:ReceiveMessage
47
- - sqs:DeleteMessage
48
- - sqs:SendMessage
49
- - sqs:GetQueueAttributes
50
- Resource:
51
- - "Fn::GetAtt": [ IncomingJobQueue, Arn ]
52
- - Effect: Allow
53
- Action:
54
- - sqs:ReceiveMessage
55
- - sqs:DeleteMessage
56
- - sqs:SendMessage
57
- - sqs:GetQueueAttributes
58
- Resource:
59
- - "Fn::GetAtt": [ ActivityQueue, Arn ]
60
- - Effect: Allow
61
- Action:
62
- - dynamodb:PutItem
63
- - dynamodb:DeleteItem
64
- Resource:
65
- - "Fn::GetAtt": [ DelayedJobTable, Arn ]
66
- - Effect: Allow
67
- Action:
68
- - dynamodb:*
69
- Resource:
70
- - "Fn::GetAtt": [ StatsTable, Arn ]
71
- - Effect: Allow
72
- Action:
73
- - dynamodb:Query
74
- Resource:
75
- Fn::Join:
76
- - ""
77
- - - "Fn::GetAtt": [ DelayedJobTable, Arn ]
78
- - "/index/performAtIndex"
79
-
80
- custom:
81
- # Our stage is based on what is passed in when running serverless
82
- # commands. Or fallsback to what we have set in the provider section.
83
- stage: ${opt:stage, 'dev'}
84
- incomingJobQueueName: ${self:service}-${self:custom.stage}-incoming-jobs
85
- incomingJobQueueAccessPolicyName: ${self:service}-${self:custom.stage}-incoming-job-queue-access
86
- incomingDeadJobQueueName: ${self:service}-${self:custom.stage}-incoming-dead-jobs
87
- activeJobQueueName: ${self:service}-${self:custom.stage}-active-jobs
88
- activityQueueName: ${self:service}-${self:custom.stage}-activity
89
- activityDeadQueueName: ${self:service}-${self:custom.stage}-activity-dead
90
- deadJobQueueName: ${self:service}-${self:custom.stage}-dead-jobs
91
- delayedJobTableName: ${self:service}-${self:custom.stage}-delayed-jobs
92
- statsTableName: ${self:service}-${self:custom.stage}-stats
93
- dashboardName: ${self:service}-${self:custom.stage}-dashboard
94
-
95
- # you can define service wide environment variables here
96
- # environment:
97
- # variable1: value1
98
-
99
- functions:
100
- # TODO - How could other functions be passed in from funktor.yml?
101
- #random_job_generator:
102
- ##handler: lambda_handlers/random_job_generator.RandomJobGenerator.call
103
- #image:
104
- #name: funktorimage
105
- #command:
106
- #- lambda_handlers/random_job_generator.RandomJobGenerator.call
107
- #timeout: 170
108
- #reservedConcurrency: 0
109
- #events:
110
- #- schedule: rate(1 minute)
111
-
112
- delayed_job_activator:
113
- image:
114
- name: funktorimage
115
- command:
116
- - lambda_handlers/delayed_job_activator.call
117
- timeout: %{delayed_job_activator.timeout_in_seconds}
118
- # TODO - handle memory and concurrency
119
- #reservedConcurrency: 1
120
- events:
121
- - schedule: %{delayed_job_activator.execution_schedule}
122
-
123
- incoming_job_handler:
124
- image:
125
- name: funktorimage
126
- command:
127
- - lambda_handlers/incoming_job_handler.call
128
- timeout: %{incoming_job_handler.timeout_in_seconds}
129
- events:
130
- - sqs:
131
- arn:
132
- Fn::GetAtt:
133
- - IncomingJobQueue
134
- - Arn
135
-
136
- # TODO - We need one of these per work queue
137
- active_job_handler:
138
- image:
139
- name: funktorimage
140
- command:
141
- - lambda_handlers/active_job_handler.call
142
- timeout: 300
143
- events:
144
- - sqs:
145
- arn:
146
- Fn::GetAtt:
147
- - ActiveJobQueue
148
- - Arn
149
-
150
- # you can add CloudFormation resource templates here
151
- resources:
152
- - ${file(resources/sqs-queue.yml)}
153
- - ${file(resources/sqs-incoming-user.yml)}
154
- - ${file(resources/dynamodb-table.yml)}
155
- - ${file(resources/cloudfront-dashboard.yml)}
156
-