Repository navigation
Expand file tree
/
Copy pathapi.rb
More file actions
93 lines (76 loc) 路 2.38 KB
/
Copy pathapi.rb
File metadata and controls
93 lines (76 loc) 路 2.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module LambdaPunch
# Interface to Lambda's Extensions API using simple `Net::HTTP` calls.
#
# Lambda Extensions API
# https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html
#
class Api
EXTENSION_NAME = 'lambdapunch'
include Singleton
class << self
def register!
instance.register!
end
def loop
instance.loop
end
end
def register!
return if @registered
uri = URI.parse "#{base_uri}/register"
http = Net::HTTP.new uri.host, uri.port
request = Net::HTTP::Post.new uri.request_uri
request['Content-Type'] = 'application/vnd.aws.lambda.extension+json'
request['Lambda-Extension-Name'] = EXTENSION_NAME
request.body = %q|{"events":["INVOKE","SHUTDOWN"]}|
http.request(request).tap do |r|
logger.debug "Api#register! => #{r.class.name.inspect}, body: #{r.body}"
@registered = true
@extension_id = r.each_header.to_h['lambda-extension-identifier']
logger.debug "Api::ExtensionId => #{@extension_id}"
end
end
def loop
resp = event_next
event_payload = JSON.parse(resp.body)
case event_payload['eventType']
when 'INVOKE' then invoke(event_payload)
when 'SHUTDOWN' then shutdown
else
event_type_error(event_payload)
end
end
private
def event_next
uri = URI.parse "#{base_uri}/event/next"
http = Net::HTTP.new uri.host, uri.port
request = Net::HTTP::Get.new uri.request_uri
request['Content-Type'] = 'application/vnd.aws.lambda.extension+json'
request['Lambda-Extension-Identifier'] = @extension_id
http.request(request).tap do |r|
logger.debug "Api#event_next => #{r.class.name.inspect}, body: #{r.body}"
end
end
def invoke(event_payload)
logger.debug "Api#invoke => #{JSON.dump(event_payload)}" if logger.debug?
Worker.call(event_payload)
end
def shutdown
logger.info 'Api#shutdown...'
DRb.stop_service rescue true
exit
end
private
def base_uri
"http://#{ENV['AWS_LAMBDA_RUNTIME_API']}/2020-01-01/extension"
end
def logger
LambdaPunch.logger
end
def event_type_error(event_payload)
message = "Unknown event type: #{event_payload['eventType'].inspect}"
logger.fatal(message)
raise EventTypeError.new(message)
end
end
end