Skip to content

Commit f606a7b

Browse files
authored
Version 3 (#38)
* Version 3 * Update ruby version in CI
1 parent 5da4896 commit f606a7b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+488
-1223
lines changed

.github/workflows/test-on-push-and-pr.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,6 @@ jobs:
1515
- name: Set up ruby
1616
uses: ruby/setup-ruby@v1
1717
with:
18-
ruby-version: 2.7
18+
ruby-version: 3.1
1919
- name: Run 'pr' target
2020
run: make pr

.idea/.gitignore

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/misc.xml

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/modules.xml

+8
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/vcs.xml

+6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

LICENSE

+159-213
Large diffs are not rendered by default.

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ setup-codebuild-agent:
1313

1414
.PHONY: test-smoke
1515
test-smoke: setup-codebuild-agent
16-
CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.1.yml alpine 3.12 2.7
16+
CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.1.yml alpine 3.16 3.1
1717

1818
.PHONY: test-unit
1919
test-unit:

README.md

-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ First step is to choose the base image to be used. The supported Linux OS distri
1919

2020
- Amazon Linux 2
2121
- Alpine
22-
- CentOS
2322
- Debian
2423
- Ubuntu
2524

aws_lambda_ric.gemspec

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2-
31
# frozen_string_literal: true
42

53
lib = File.expand_path('lib', __dir__)
@@ -8,15 +6,15 @@ require './lib/aws_lambda_ric/version'
86

97
Gem::Specification.new do |spec|
108
spec.name = 'aws_lambda_ric'
11-
spec.version = AwsLambdaRuntimeInterfaceClient::VERSION
9+
spec.version = AwsLambdaRIC::VERSION
1210
spec.authors = ['AWS Lambda']
1311

1412
spec.summary = 'AWS Lambda Runtime Interface Client for Ruby'
1513
spec.description = 'The AWS Lambda Ruby Runtime Interface Client implements the Lambda programming model for Ruby.'
1614
spec.homepage = 'https://github.com/aws/aws-lambda-ruby-runtime-interface-client'
1715

1816
spec.license = 'Apache-2.0'
19-
spec.required_ruby_version = '>= 2.5'
17+
spec.required_ruby_version = '>= 3.0'
2018

2119
# Specify which files should be added to the gem when it is released.
2220
spec.files = %w[
@@ -33,8 +31,9 @@ Gem::Specification.new do |spec|
3331
spec.executables = 'aws_lambda_ric'
3432
spec.require_paths = ['lib']
3533

36-
spec.add_development_dependency 'bundler', '>= 2.0'
34+
spec.add_development_dependency 'bundler', '~> 2.0'
3735
spec.add_development_dependency 'minitest', '~> 5.0'
3836
spec.add_development_dependency 'rake', '~> 13.0'
3937
spec.add_development_dependency 'activesupport', '~> 6.0.1'
38+
spec.add_development_dependency 'test-unit', '~> 3.5.5'
4039
end

bin/aws_lambda_ric

+4-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
#! /usr/bin/env ruby
2-
3-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4-
52
# frozen_string_literal: true
63

74
require 'bundler/setup'
8-
require_relative '../lib/aws_lambda_ric/bootstrap'
5+
require_relative '../lib/aws_lambda_ric'
6+
7+
lambda_ric = AwsLambdaRIC::Bootstrap.new
98

10-
Bootstrap.start
9+
lambda_ric.start

buildspec.yml

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
version: 0.2
3+
4+
env:
5+
shell: bash
6+
7+
phases:
8+
install:
9+
commands:
10+
- docker logout public.ecr.aws
11+
- docker pull public.ecr.aws/amazonlinux/amazonlinux:2
12+
13+
pre_build:
14+
commands:
15+
- mkdir -p "${OUT_DIR:-build-artifacts}"
16+
17+
build:
18+
commands:
19+
- make build-all OUT_DIR="${OUT_DIR:-build-artifacts}"
20+
21+
artifacts:
22+
files:
23+
- "build-artifacts/**"

lib/aws_lambda_ric.rb

+56-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2-
31
# frozen_string_literal: true
42

53
require_relative 'aws_lambda_ric/lambda_errors'
@@ -17,17 +15,24 @@
1715

1816
$stdout.sync = true # Ensures that logs are flushed promptly.
1917

20-
module AwsLambdaRuntimeInterfaceClient
18+
module AwsLambdaRIC
2119

2220
class Error < StandardError; end
2321

22+
def self.get_user_agent
23+
ruby_version = RUBY_VERSION.to_s
24+
version = AwsLambdaRIC::VERSION
25+
26+
"aws-lambda-ruby/#{ruby_version}-#{version}"
27+
end
28+
2429
# Loads the user code and runs it upon invocation
2530
class LambdaRunner
2631

2732
ENV_VAR_RUNTIME_API = 'AWS_LAMBDA_RUNTIME_API'
2833

2934
def initialize(runtime_server_addr, user_agent)
30-
@lambda_server = LambdaServer.new(runtime_server_addr, user_agent)
35+
@lambda_server = RapidClient.new(runtime_server_addr, user_agent)
3136
@runtime_loop_active = true # if false, we will exit the program
3237
@exit_code = 0
3338
end
@@ -45,7 +50,7 @@ def run(app_root, handler)
4550
@exit_code = -4
4651
send_init_error_to_server(e)
4752
ensure
48-
TelemetryLoggingHelper.close
53+
TelemetryLogger.close
4954
end
5055

5156
exit(@exit_code)
@@ -121,7 +126,7 @@ def send_error_response(lambda_invocation, err, exit_code = nil, runtime_loop_ac
121126
end
122127

123128
# Helper class to for mutating std logger with TelemetryLog
124-
class TelemetryLoggingHelper
129+
class TelemetryLogger
125130

126131
ENV_VAR_TELEMETRY_LOG_FD = '_LAMBDA_TELEMETRY_LOG_FD'
127132

@@ -133,19 +138,27 @@ def close
133138
end
134139
end
135140

136-
def initialize(telemetry_log_fd, path_to_fd='/proc/self/fd/')
137-
fd = "#{path_to_fd}#{telemetry_log_fd}"
138-
AwsLambdaRuntimeInterfaceClient::TelemetryLoggingHelper.telemetry_log_fd_file = File.open(fd, 'wb')
139-
AwsLambdaRuntimeInterfaceClient::TelemetryLoggingHelper.telemetry_log_fd_file.sync = true
141+
def initialize(telemetry_log_fd)
142+
fd = telemetry_log_fd.to_i
143+
AwsLambdaRIC::TelemetryLogger.telemetry_log_fd_file = IO.new(fd, 'wb')
144+
AwsLambdaRIC::TelemetryLogger.telemetry_log_fd_file.sync = true
140145

141-
AwsLambdaRuntimeInterfaceClient::TelemetryLoggingHelper.telemetry_log_sink = TelemetryLogSink.new(file: AwsLambdaRuntimeInterfaceClient::TelemetryLoggingHelper.telemetry_log_fd_file)
146+
AwsLambdaRIC::TelemetryLogger.telemetry_log_sink = TelemetryLogSink.new(file: AwsLambdaRIC::TelemetryLogger.telemetry_log_fd_file)
142147

143148
mutate_std_logger
144149
mutate_kernel_puts
145-
rescue Errno::ENOENT
150+
rescue Errno::ENOENT, Errno::EBADF
146151
# If File.open() fails, then the mutation won't happen and the default behaviour (print to stdout) will prevail
147152
end
148153

154+
def self.from_env()
155+
if ENV.key?(ENV_VAR_TELEMETRY_LOG_FD)
156+
fd = ENV.fetch(AwsLambdaRIC::TelemetryLogger::ENV_VAR_TELEMETRY_LOG_FD)
157+
ENV.delete(AwsLambdaRIC::TelemetryLogger::ENV_VAR_TELEMETRY_LOG_FD)
158+
AwsLambdaRIC::TelemetryLogger.new(fd)
159+
end
160+
end
161+
149162
private
150163

151164
def mutate_std_logger
@@ -158,7 +171,11 @@ def mutate_kernel_puts
158171
Kernel.module_eval do
159172
def puts(*arg)
160173
msg = arg.flatten.collect { |a| a.to_s.encode('UTF-8') }.join("\n")
161-
AwsLambdaRuntimeInterfaceClient::TelemetryLoggingHelper.telemetry_log_sink.write(msg)
174+
if msg[-1] != "\n"
175+
msg += "\n"
176+
end
177+
AwsLambdaRIC::TelemetryLogger.telemetry_log_sink.write(msg)
178+
return nil
162179
end
163180
end
164181
end
@@ -176,4 +193,30 @@ def initialize(request_id, raw_request, request, trace_id)
176193
@trace_id = trace_id
177194
end
178195
end
196+
197+
class Bootstrap
198+
199+
def start
200+
AwsLambdaRIC::TelemetryLogger::from_env()
201+
bootstrap_handler
202+
end
203+
204+
def fetch_runtime_server
205+
ENV.fetch(AwsLambdaRIC::LambdaRunner::ENV_VAR_RUNTIME_API)
206+
rescue KeyError
207+
puts 'Failed to get runtime server address from AWS_LAMBDA_RUNTIME_API env variable'
208+
exit(-2)
209+
end
210+
211+
def bootstrap_handler
212+
if ENV['_HANDLER'] == nil
213+
puts 'No handler specified, exiting Runtime Interface Client.'
214+
exit
215+
end
216+
app_root = Dir.pwd
217+
handler = ENV['_HANDLER']
218+
lambda_runner = AwsLambdaRIC::LambdaRunner.new(fetch_runtime_server, AwsLambdaRIC::get_user_agent)
219+
lambda_runner.run(app_root, handler)
220+
end
221+
end
179222
end

lib/aws_lambda_ric/aws_lambda_marshaller.rb

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2-
31
# frozen_string_literal: true
42

53
require 'stringio'

lib/aws_lambda_ric/bootstrap.rb

-45
This file was deleted.

lib/aws_lambda_ric/lambda_context.rb

-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2-
31
# frozen_string_literal: true
42

53
class LambdaContext

lib/aws_lambda_ric/lambda_errors.rb

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2-
31
# frozen_string_literal: true
2+
43
module LambdaErrors
54

65
class LambdaErrors::InvocationError < StandardError;
@@ -25,9 +24,9 @@ def runtime_error_type
2524

2625
def to_lambda_response
2726
{
28-
:errorMessage => @error_message,
29-
:errorType => @error_type,
30-
:stackTrace => @stack_trace
27+
:errorMessage => @error_message,
28+
:errorType => @error_type,
29+
:stackTrace => @stack_trace
3130
}
3231
end
3332

@@ -39,7 +38,7 @@ def _sanitize_stacktrace(stacktrace)
3938
if stacktrace
4039
stacktrace.first(100).each do |line|
4140
if safe_trace
42-
if line.to_s.match(%r{^lib})
41+
if line.to_s.match(%r{^/var/runtime/lib})
4342
safe_trace = false
4443
else
4544
ret << line

lib/aws_lambda_ric/lambda_handler.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
1+
# frozen_string_literal: true
22

33
require_relative 'aws_lambda_marshaller'
44

@@ -19,8 +19,8 @@ def initialize(env_handler:)
1919

2020
def call_handler(request:, context:)
2121
opts = {
22-
event: request,
23-
context: context
22+
event: request,
23+
context: context
2424
}
2525
if @handler_class
2626
response = Kernel.const_get(@handler_class).send(@handler_method_name, **opts)

lib/aws_lambda_ric/lambda_log_formatter.rb

+2-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
1-
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
2-
31
# frozen_string_literal: true
42

53
require 'logger'
64

7-
class LambdaLogFormatter < Logger::Formatter
8-
FORMAT = '%<sev>s, [%<datetime>s#%<process>d] %<severity>5s %<request_id>s -- %<progname>s: %<msg>s'
5+
class LogFormatter < Logger::Formatter
6+
FORMAT = '%<sev>s, [%<datetime>s #%<process>d] %<severity>5s %<request_id>s -- %<progname>s: %<msg>s'
97

108
def call(severity, time, progname, msg)
119
(FORMAT % {sev: severity[0..0], datetime: format_datetime(time), process: $$, severity: severity,

lib/aws_lambda_ric/lambda_logger.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
1+
# frozen_string_literal: true
22

33
class LambdaLogger
44
class << self

0 commit comments

Comments
 (0)