Skip to content

Commit

Permalink
Initial Ruby RIC implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
carlzogh committed Dec 1, 2020
1 parent c2609de commit 5e669fe
Show file tree
Hide file tree
Showing 61 changed files with 3,224 additions and 167 deletions.
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/.bundle/
/.yardoc
/_yardoc/
/coverage/
/doc/
/pkg/
/spec/reports/
/tmp/
vendor
test/examples/hello-world-docker/pkg
*.iml
.DS_Store
10 changes: 10 additions & 0 deletions Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.

# frozen_string_literal: true

source 'https://rubygems.org'

git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }

# Specify your gem's dependencies in aws_lambda_ric.gemspec
gemspec
22 changes: 22 additions & 0 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
PATH
remote: .
specs:
aws_lambda_ric (1.0.0)

GEM
remote: https://rubygems.org/
specs:
minitest (5.14.2)
rake (10.5.0)

PLATFORMS
ruby

DEPENDENCIES
aws_lambda_ric!
bundler (>= 1.17)
minitest (~> 5.0)
rake (~> 10.0)

BUNDLED WITH
2.2.0.rc.2
372 changes: 213 additions & 159 deletions LICENSE

Large diffs are not rendered by default.

43 changes: 43 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
.PHONY: target
target:
$(info ${HELP_MESSAGE})
@exit 0

.PHONY: init
init:
bundle install

.PHONY: setup-codebuild-agent
setup-codebuild-agent:
docker build -t codebuild-agent - < test/integration/codebuild-local/Dockerfile.agent

.PHONY: test-smoke
test-smoke: setup-codebuild-agent
CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_one.sh test/integration/codebuild/buildspec.os.alpine.yml alpine 3.12 2.7

.PHONY: test-unit
test-unit:
ruby test/run_tests.rb unit

.PHONY: test-integ
test-integ: setup-codebuild-agent
CODEBUILD_IMAGE_TAG=codebuild-agent test/integration/codebuild-local/test_all.sh test/integration/codebuild

.PHONY: build
build:
rake build

define HELP_MESSAGE

Usage: $ make [TARGETS]

TARGETS

build Builds the package.
clean Cleans the working directory by removing built artifacts.
init Initialize and install the dependencies and dev-dependencies for this project.
test-integ Run Integration tests.
test-unit Run Unit Tests.
test-smoke Run Sanity/Smoke tests.

endef
146 changes: 138 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,147 @@
## My Project
## AWS Lambda Ruby Runtime Interface Client

TODO: Fill this README out!
We have open-sourced a set of software packages, Runtime Interface Clients (RIC), that implement the Lambda
[Runtime API](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html), allowing you to seamlessly extend your preferred
base images to be Lambda compatible.
The Lambda Runtime Interface Client is a lightweight interface that allows your runtime to receive requests from and send requests to the Lambda service.

Be sure to:
The Lambda Ruby Runtime Interface Client is vended through [rubygems](https://rubygems.org/gems/aws_lambda_ric).
You can include this package in your preferred base image to make that base image Lambda compatible.

* Change the title in this README
* Edit your repository description on GitHub
## Requirements
The Ruby Runtime Interface Client package currently supports Ruby versions:
- 2.5.x up to and including 2.7.x

## Usage

### Creating a Docker Image for Lambda with the Runtime Interface Client
First step is to choose the base image to be used. The supported Linux OS distributions are:

- Amazon Linux 2
- Alpine
- CentOS
- Debian
- Ubuntu

In order to install the Runtime Interface Client, either add this line to your application's Gemfile:

```ruby
gem 'aws_lambda_ric'
```

And then execute:

$ bundle

Or install it manually as:

$ gem install aws_lambda_ric


Next step would be to copy your Lambda function code into the image's working directory.
```dockerfile
# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY app.rb ${FUNCTION_DIR}

WORKDIR ${FUNCTION_DIR}
```

The next step would be to set the `ENTRYPOINT` property of the Docker image to invoke the Runtime Interface Client and then set the `CMD` argument to specify the desired handler.

Example Dockerfile:
```dockerfile
FROM amazonlinux:latest

# Define custom function directory
ARG FUNCTION_DIR="/function"

# Install ruby
RUN amazon-linux-extras install -y ruby2.6

# Install the Runtime Interface Client
RUN gem install aws_lambda_ric

# Copy function code
RUN mkdir -p ${FUNCTION_DIR}
COPY app.rb ${FUNCTION_DIR}

WORKDIR ${FUNCTION_DIR}

ENTRYPOINT ["aws_lambda_ric"]
CMD ["app.App::Handler.process"]
```

Example Ruby handler `app.rb`:
```ruby
module App
class Handler
def self.process(event:, context:)
"Hello World!"
end
end
end
```

### Local Testing

To make it easy to locally test Lambda functions packaged as container images we open-sourced a lightweight web-server, Lambda Runtime Interface Emulator (RIE), which allows your function packaged as a container image to accept HTTP requests. You can install the [AWS Lambda Runtime Interface Emulator](https://github.com/aws/aws-lambda-runtime-interface-emulator) on your local machine to test your function. Then when you run the image function, you set the entrypoint to be the emulator.

*To install the emulator and test your Lambda function*

1) From your project directory, run the following command to download the RIE from GitHub and install it on your local machine.

```shell script
mkdir -p ~/.aws-lambda-rie && \
curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
chmod +x ~/.aws-lambda-rie/aws-lambda-rie
```
2) Run your Lambda image function using the docker run command.

```shell script
docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
--entrypoint /aws-lambda/aws-lambda-rie \
myfunction:latest \
aws_lambda_ric app.App::Handler.process
```

This runs the image as a container and starts up an endpoint locally at `http://localhost:9000/2015-03-31/functions/function/invocations`.

3) Post an event to the following endpoint using a curl command:

```shell script
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'.
```

This command invokes the function running in the container image and returns a response.

*Alternately, you can also include RIE as a part of your base image. See the AWS documentation on how to [Build RIE into your base image](https://docs.aws.amazon.com/lambda/latest/dg/images-test.html#images-test-alternative).*

## Development

### Building the package
Clone this repository and run:

```shell script
make init
make build
```

### Running tests

Make sure the project is built:
```shell script
make init build
```
Then,
* to run unit tests: `make test`
* to run integration tests: `make test-integ`
* to run smoke tests: `make test-smoke`

## Security

See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.
If you discover a potential security issue in this project we ask that you notify AWS/Amazon Security via our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/). Please do **not** create a public github issue.

## License

This project is licensed under the Apache-2.0 License.

This project is licensed under the Apache-2.0 License.
12 changes: 12 additions & 0 deletions Rakefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# frozen_string_literal: true

require 'bundler/gem_tasks'
require 'rake/testtask'

Rake::TestTask.new(:test) do |t|
t.libs << 'test'
t.libs << 'lib'
t.test_files = FileList['test/**/*_test.rb']
end

task default: :test
37 changes: 37 additions & 0 deletions aws_lambda_ric.gemspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.

# frozen_string_literal: true

lib = File.expand_path('lib', __dir__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require './lib/aws_lambda_ric/version'

Gem::Specification.new do |spec|
spec.name = 'aws_lambda_ric'
spec.version = AwsLambdaRuntimeInterfaceClient::VERSION
spec.authors = ['AWS Lambda']

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

# Specify which files should be added to the gem when it is released.
spec.files = %w[
LICENSE
README.md
Gemfile
NOTICE
Gemfile.lock
aws_lambda_ric.gemspec
bin/aws_lambda_ric
] + Dir['lib/**/*']

spec.bindir = 'bin'
# all application-style files are expected to be found in bindir
spec.executables = 'aws_lambda_ric'
spec.require_paths = ['lib']

spec.add_development_dependency 'bundler', '>= 2.0'
spec.add_development_dependency 'minitest', '~> 5.0'
spec.add_development_dependency 'rake', '~> 10.0'
end
10 changes: 10 additions & 0 deletions bin/aws_lambda_ric
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#! /usr/bin/env ruby

# Copyright 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.

# frozen_string_literal: true

require 'bundler/setup'
require_relative '../lib/aws_lambda_ric/bootstrap'

Bootstrap.start
Loading

0 comments on commit 5e669fe

Please sign in to comment.