Giter VIP home page Giter VIP logo

aws-custom-runtime's Introduction

Go Report Card CircleCI

Running AWS Lambda Custom Runtime in Knative

In November 2018, AWS announced support for Lambda custom runtime using a straightforward AWS lambda runtime API.

In this repository you find a function invoker implemented in Go, which provides the AWS Lambda runtime API. You also find a Knative build template. Using this build template you can run AWS Lambda custom runtimes directly in your Kubernetes cluster using Knative.

The AWS Lambdas execution environment is replicated using the Docker image amazonlinux and some environment variables.

AWS custom runtime walkthrough

This repository contains an example lambda function written in bash with a AWS custom runtime described in this AWS tutorial. To run this function use our tm client to talk to the knative API.

  1. Install AWS custom runtime:
tm deploy task -f https://raw.githubusercontent.com/triggermesh/aws-custom-runtime/main/runtime.yaml
  1. Deploy function:
tm deploy service lambda-bash -f https://github.com/triggermesh/aws-custom-runtime --runtime aws-custom-runtime --build-argument DIRECTORY=example --wait

In output you'll see URL that you can use to access example/function.sh function

AWS Lambda RUST example

RUST is also verified to be compatible with this runtime. Though official readme has build instructions, it is more convenient to use docker.

  1. Clone repository:
git clone https://github.com/awslabs/aws-lambda-rust-runtime
cd aws-lambda-rust-runtime
  1. Build binary and rename it to bootstrap:
docker run --rm --user "$(id -u)":"$(id -g)" -v "$PWD":/usr/src/myapp -w /usr/src/myapp rust:1.31.0 cargo build -p lambda_runtime --example basic --release
mv target/release/examples/basic target/release/examples/bootstrap
  1. Deploy runtime using tm CLI:
tm deploy runtime -f https://raw.githubusercontent.com/triggermesh/aws-custom-runtime/main/runtime.yaml
tm deploy service lambda-rust -f target/release/examples/ --runtime aws-custom-runtime

Use your RUST AWS Lambda function on knative:

curl lambda-rust.default.k.triggermesh.io --data '{"firstName": "Foo"}'
{"message":"Hello, Foo!"}

AWS Lambda C++ example

  1. Build custom runtime:
cd /tmp
git clone https://github.com/awslabs/aws-lambda-cpp.git
cd aws-lambda-cpp
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF -DCMAKE_INSTALL_PREFIX=/tmp/out
make && make install
  1. Prepare example function:
mkdir /tmp/hello-cpp-world
cd /tmp/hello-cpp-world


cat > main.cpp <<EOF
// main.cpp
#include <aws/lambda-runtime/runtime.h>

using namespace aws::lambda_runtime;

invocation_response my_handler(invocation_request const& request)
{
   return invocation_response::success("Hello, World!", "application/json");
}

int main()
{
   run_handler(my_handler);
   return 0;
}
EOF


cat > CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(bootstrap LANGUAGES CXX)

find_package(aws-lambda-runtime REQUIRED)
add_executable(\${PROJECT_NAME} "main.cpp")
target_link_libraries(\${PROJECT_NAME} PUBLIC AWS::aws-lambda-runtime)
aws_lambda_package_target(\${PROJECT_NAME})
EOF
  1. Build function:
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/tmp/out
make
  1. Deploy with tm CLI:
tm deploy task -f https://raw.githubusercontent.com/triggermesh/aws-custom-runtime/main/runtime.yaml
tm deploy service lambda-cpp -f . --runtime aws-custom-runtime

C++ Lambda function is running on knative platform:

curl lambda-cpp.default.k.triggermesh.io --data '{"payload": "foobar"}'
Hello, World!

Events wrapping

Triggermesh AWS custom runtime supports events wrapping for better interoperability of functions and data originated from or targeted at the different platforms. Currently, there are two events wrapper available besides the default "passthrough" one:

  • API Gateway wrapper ensures that HTTP requests are digestible by the AWS Lambda functions and decodes their responses to the simple readable format
  • CloudEvents wrapper converts function responses into CloudEvents event objects.

Events wrapper can be enabled by setting function's environment variables and may have different set of configurable parameters. Let's take a look at CloudEvens example:

  1. Generate sample Go function using tm CLI

    tm generate go
    
  2. Open go/serverless.yaml deployment manifest and add events wrapper env variables:

    ...
    environment:
       RESPONSE_WRAPPER: CLOUDEVENTS
       CE_TYPE: go-klr-cloudevent
    ...
    
  3. Deploy function:

    tm deploy -f go --wait
    

After CLI report that deployment is succeeded, send a request to the function endpoint:

curl -d '{"Name":"Joe"}' https://go-demo-service-go-function.default.dev.munu.io

The result will be encoded into CloudEvents format:

Validation: valid
Context Attributes,
  specversion: 1.0
  type: go-klr-cloudevent
  source: go-demo-service-go-function
  subject: klr-response
  id: 7fa17c84-56f0-488a-b7de-e45d7fb3b7b1
  datacontenttype: application/json
Data (binary),
  "Hello Joe!"

Support

We would love your feedback on this tool so don't hesitate to let us know what is wrong and how we could improve it, just file an issue

Code of Conduct

This plugin is by no means part of CNCF but we abide by its code of conduct

aws-custom-runtime's People

Contributors

adrien-f avatar evankanderson avatar sameersbn avatar sebgoa avatar stesie avatar tzununbekov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

aws-custom-runtime's Issues

ISSUE: TM Function does not handle inner reference response

Per the triggermesh docs ->

"Functions may be used to implement custom event flow logic"

Expectation:

Using a function to do a custom/complex transformation before reaching an inner processing ksvc will perform the transformation and return the result of the ksvc.

Reality:

It does the custom transformation, but the response is nil.

https://github.com/triggermesh/aws-custom-runtime/blob/main/pkg/sender/sender.go#L56

Simple Example

# perform modification (only user code part) to attestation input
apiVersion: extensions.triggermesh.io/v1alpha1
kind: Function
metadata:
  name: custom-tsf
  namespace: default
spec:
  runtime: python
  public: true
  entrypoint: main
  sink:
    ref:
      name: example-inner
      namespace: default
      kind: Service
      apiVersion: serving.knative.dev/v1
  code: |
    def main(payload, context):
        payload['metdata'] = 'some change'

        return payload

hitting this function will always return nil, because it sends to an inner ksvc, I do not think you should have to create a sinkbinding or assume the broker for the inner ksvc each time to return the event...I think it should match the flow of a transformation which returns it to the same broker the transformation reads from (same with a filter).

It just seems like the function is unique in this regard, and it breaks expectations.

RUST build fails

bash example works great.

rust fails at:

docker run --rm --user "$(id -u)":"$(id -g)" -v "$PWD":/usr/src/myapp -w /usr/src/myapp rust:1.30.0 cargo build -p lambda_runtime --example basic --release
...
 Downloading backtrace-sys v0.1.24
 Downloading rustc-demangle v0.1.9
 Downloading cc v1.0.25
 Downloading ryu v0.2.6
   Compiling lambda_runtime_client v0.1.0 (/usr/src/myapp/lambda-runtime-client)
error: Edition 2018 is unstable and only available for nightly builds of rustc.

error: Could not compile `lambda_runtime_client`.

To learn more, run the command again with --verbose.

Update CI

CI pipeline must include test run and linter checks, release procedure, etc.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.