lamby_updated 5.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,155 @@
1
+ require 'aws-sdk-ssm'
2
+
3
+ module Lamby
4
+ class SsmParameterStore
5
+
6
+ MAX_RESULTS = 10
7
+
8
+ Param = Struct.new :name, :env, :value
9
+
10
+ attr_reader :path, :params
11
+
12
+ class << self
13
+
14
+ def dotenv(path)
15
+ new(path).get!.to_dotenv
16
+ end
17
+
18
+ def get!(path)
19
+ parts = path[1..-1].split('/')
20
+ env = parts.pop
21
+ path = "/#{parts.join('/')}"
22
+ param = new(path).get!.params.detect do |p|
23
+ p.env == env
24
+ end
25
+ param&.value
26
+ end
27
+
28
+ end
29
+
30
+ def initialize(path, options = {})
31
+ @path = path
32
+ @params = []
33
+ @options = options
34
+ end
35
+
36
+ def to_env(overwrite: true)
37
+ params.each do |param|
38
+ overwrite ? ENV[param.env] = param.value : ENV[param.env] ||= param.value
39
+ end
40
+ end
41
+
42
+ def to_dotenv
43
+ File.open(dotenv_file, 'a') { |f| f.write(dotenv_contents) }
44
+ end
45
+
46
+ def get!
47
+ get_all!
48
+ get_history! unless label.to_s.empty?
49
+ self
50
+ end
51
+
52
+ def label
53
+ ENV['LAMBY_SSM_PARAMS_LABEL'] || @options[:label]
54
+ end
55
+
56
+ def client
57
+ @client ||= begin
58
+ options = @options[:client_options] || {}
59
+ Aws::SSM::Client.new(options)
60
+ end
61
+ end
62
+
63
+
64
+ private
65
+
66
+ def dotenv_file
67
+ @options[:dotenv_file] || ENV['LAMBY_SSM_PARAMS_FILE'] || Rails.root.join(".env.#{Rails.env}")
68
+ end
69
+
70
+ def dotenv_contents
71
+ params.each_with_object('') do |param, contents|
72
+ line = "#{param.env}=#{param.value}\n"
73
+ contents << line
74
+ end
75
+ end
76
+
77
+ # Path
78
+
79
+ def get_all!
80
+ return params if @got_all
81
+ get_parse_all
82
+ while @all_response.next_token do get_parse_all end
83
+ @got_all = true
84
+ params
85
+ end
86
+
87
+ def get_parse_all
88
+ get_all
89
+ parse_all
90
+ end
91
+
92
+ def get_all
93
+ @all_response = client.get_parameters_by_path(get_all_options)
94
+ end
95
+
96
+ def get_all_options
97
+ { path: path,
98
+ recursive: true,
99
+ with_decryption: true,
100
+ max_results: MAX_RESULTS
101
+ }.tap { |options|
102
+ token = @all_response&.next_token
103
+ options[:next_token] = token if token
104
+ }
105
+ end
106
+
107
+ def parse_all
108
+ @all_response.parameters.each do |p|
109
+ env = p.name.split('/').last
110
+ params << Param.new(p.name, env, p.value)
111
+ end
112
+ end
113
+
114
+ # History
115
+
116
+ def get_history!
117
+ return params if @got_history
118
+ params.each do |param|
119
+ name = param.name
120
+ get_parse_history(name)
121
+ while @hist_response.next_token do get_parse_history(name) end
122
+ end
123
+ @got_history = true
124
+ params
125
+ end
126
+
127
+ def get_parse_history(name)
128
+ get_history(name)
129
+ parse_history(name)
130
+ end
131
+
132
+ def get_history(name)
133
+ @hist_response = client.get_parameter_history(get_history_options(name))
134
+ end
135
+
136
+ def get_history_options(name)
137
+ { name: name,
138
+ with_decryption: true,
139
+ max_results: MAX_RESULTS
140
+ }.tap { |options|
141
+ token = @hist_response&.next_token
142
+ options[:next_token] = token if token
143
+ }
144
+ end
145
+
146
+ def parse_history(name)
147
+ @hist_response.parameters.each do |p|
148
+ next unless p.labels.include? label
149
+ param = params.detect { |param| param.name == name }
150
+ param.value = p.value
151
+ end
152
+ end
153
+
154
+ end
155
+ end
@@ -0,0 +1,19 @@
1
+ namespace :lamby do
2
+ task :proxy_server => [:environment] do
3
+ require 'webrick'
4
+ port = ENV['LAMBY_PROXY_PORT'] || 3000
5
+ bind = ENV['LAMBY_PROXY_BIND'] || '0.0.0.0'
6
+ Rack::Handler::WEBrick.run Lamby::ProxyServer.new, Port: port, BindAddress: bind
7
+ end
8
+
9
+ task :proxy_server_puma => [:environment] do
10
+ port = ENV['LAMBY_PROXY_PORT'] || 3000
11
+ host = ENV['LAMBY_PROXY_BIND'] || '0.0.0.0'
12
+ lamby_proxy = Lamby::ProxyServer.new
13
+ maybe_later = MaybeLater::Middleware.new(lamby_proxy)
14
+ server = Puma::Server.new(maybe_later)
15
+ server.add_tcp_listener host, port
16
+ puts "Starting Puma server on #{host}:#{port}..."
17
+ server.run.join
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ module Lamby
2
+ VERSION = '5.2.1'
3
+ end
data/lib/lamby.rb ADDED
@@ -0,0 +1,53 @@
1
+ require 'lamby/logger'
2
+ require 'rack'
3
+ require 'base64'
4
+ require 'lambda-console-ruby'
5
+ require 'lamby/version'
6
+ require 'lamby/config'
7
+ require 'lamby/rack'
8
+ require 'lamby/rack_alb'
9
+ require 'lamby/rack_rest'
10
+ require 'lamby/rack_http'
11
+ require 'lamby/debug'
12
+ require 'lamby/cold_start_metrics'
13
+ require 'lamby/handler'
14
+
15
+ if defined?(Rails)
16
+ require 'rails/railtie'
17
+ require 'lamby/railtie'
18
+ end
19
+
20
+ module Lamby
21
+
22
+ extend self
23
+
24
+ def cmd(event:, context:)
25
+ handler(config.rack_app, event, context)
26
+ ensure
27
+ config.handled_proc.call(event, context)
28
+ end
29
+
30
+ def handler(app, event, context, options = {})
31
+ Handler.call(app, event, context, options)
32
+ end
33
+
34
+ def config
35
+ Lamby::Config.config
36
+ end
37
+
38
+ autoload :SsmParameterStore, 'lamby/ssm_parameter_store'
39
+ autoload :ProxyContext, 'lamby/proxy_context'
40
+ autoload :ProxyServer, 'lamby/proxy_server'
41
+
42
+ end
43
+
44
+ # Add signal traps for clean exit
45
+ Signal.trap("TERM") do
46
+ puts "Received SIGTERM, exiting gracefully..."
47
+ exit!(0) # exit! ensures no exception is raised
48
+ end
49
+
50
+ Signal.trap("INT") do
51
+ puts "Received SIGINT, exiting gracefully..."
52
+ exit!(0) # exit! ensures no exception is raised
53
+ end
data/vendor/.keep ADDED
File without changes
metadata ADDED
@@ -0,0 +1,233 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lamby_updated
3
+ version: !ruby/object:Gem::Version
4
+ version: 5.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Ken Collins
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-06-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: lambda-console-ruby
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: aws-sdk-ssm
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest-focus
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: mocha
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: timecop
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: webrick
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Simple Rails & AWS Lambda Integration using Rack and various utilities.
168
+ email:
169
+ - ken@metaskills.net
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".devcontainer/Dockerfile"
175
+ - ".devcontainer/devcontainer.json"
176
+ - ".github/workflows/test.yml"
177
+ - ".gitignore"
178
+ - CHANGELOG.md
179
+ - CODE_OF_CONDUCT.md
180
+ - Gemfile
181
+ - Gemfile.lock
182
+ - LICENSE.txt
183
+ - README.md
184
+ - Rakefile
185
+ - bin/bootstrap
186
+ - bin/console
187
+ - bin/setup
188
+ - bin/test
189
+ - bin/update
190
+ - images/social.png
191
+ - images/social2.png
192
+ - lamby.gemspec
193
+ - lib/lamby.rb
194
+ - lib/lamby/cold_start_metrics.rb
195
+ - lib/lamby/config.rb
196
+ - lib/lamby/debug.rb
197
+ - lib/lamby/handler.rb
198
+ - lib/lamby/logger.rb
199
+ - lib/lamby/proxy_context.rb
200
+ - lib/lamby/proxy_server.rb
201
+ - lib/lamby/rack.rb
202
+ - lib/lamby/rack_alb.rb
203
+ - lib/lamby/rack_http.rb
204
+ - lib/lamby/rack_rest.rb
205
+ - lib/lamby/railtie.rb
206
+ - lib/lamby/ssm_parameter_store.rb
207
+ - lib/lamby/tasks.rake
208
+ - lib/lamby/version.rb
209
+ - vendor/.keep
210
+ homepage: https://github.com/rails-lambda/lamby
211
+ licenses:
212
+ - MIT
213
+ metadata: {}
214
+ post_install_message:
215
+ rdoc_options: []
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ required_rubygems_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ requirements: []
229
+ rubygems_version: 3.5.5
230
+ signing_key:
231
+ specification_version: 4
232
+ summary: Simple Rails & AWS Lambda Integration using Rack
233
+ test_files: []