mirror of
https://github.com/fnproject/fn.git
synced 2022-10-28 21:29:17 +03:00
Remove iron...
This commit is contained in:
committed by
Reed Allman
parent
521df8c1ff
commit
9cc12b4b12
@@ -1,6 +1,6 @@
|
||||
# Lambda everywhere
|
||||
|
||||
Lambda support for IronFunctions enables you to take your AWS Lambda functions and run them
|
||||
Lambda support for Oracle Functios enables you to take your AWS Lambda functions and run them
|
||||
anywhere. You should be able to take your code and run them without any changes.
|
||||
|
||||
## Creating Lambda Functions
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
AWS Lambda introduced serverless computing to the masses. Wouldn't it be nice
|
||||
if you could run the same Lambda functions on any platform, in any cloud?
|
||||
Iron.io is proud to release a set of tools that allow just this. Package your
|
||||
Oracle is proud to release a set of tools that allow just this. Package your
|
||||
Lambda function in a Docker container and run it anywhere with an environment
|
||||
similar to AWS Lambda.
|
||||
|
||||
Using a job scheduler such as IronFunctions, you can connect these functions to
|
||||
Using a job scheduler such as Oracle Functions, you can connect these functions to
|
||||
webhooks and run them on-demand, at scale. You can also use a container
|
||||
management system paired with a task queue to run these functions in
|
||||
a self-contained, platform-independent manner.
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
# Creating Docker images out of Lambda functions
|
||||
|
||||
Docker images created by running the `create-function` subcommand on a Lambda function are ready to execute.
|
||||
|
||||
You can convert any Lambda function of type nodejs 0.10, python 2.7 and Java 8 into an
|
||||
IronFunction compatible Docker Image as follows:
|
||||
Oracle Functions compatible Docker Image as follows:
|
||||
|
||||
```bash
|
||||
fn lambda create-function <name> <runtime> <handler> <files...>
|
||||
```
|
||||
@@ -16,7 +18,8 @@ fn lambda create-function <name> <runtime> <handler> <files...>
|
||||
* file: the files to be converted, however for java8 only one file of type `jar` is allowed.
|
||||
|
||||
e.g:
|
||||
|
||||
```bash
|
||||
fn lambda create-function irontest/node-exec:1 nodejs node_exec.handler node_exec.js
|
||||
fn lambda create-function test/node-exec:1 nodejs node_exec.handler node_exec.js
|
||||
```
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ Lambda and Dockerized Lambda.
|
||||
|
||||
## Request/Response
|
||||
|
||||
IronFunctions has sync/async communication with Request/Response workflows.
|
||||
Functions has sync/async communication with Request/Response workflows.
|
||||
* sync: returns the result as the body of the response
|
||||
* async: returns the task id in the body of the response as a json
|
||||
|
||||
@@ -21,11 +21,11 @@ such assumptions, please rewrite it.
|
||||
|
||||
## nodejs
|
||||
|
||||
* node.js version [0.10.42][iron/node]
|
||||
* node.js version [0.10.42][funcy/node]
|
||||
* ImageMagick version [6.9.3][magickv] and nodejs [wrapper 6.9.3][magickwrapperv]
|
||||
* aws-sdk version [2.2.12][awsnodev]
|
||||
|
||||
[iron/node]: https://github.com/treeder/dockers/blob/master/node/Dockerfile
|
||||
[funcy/node]: https://github.com/treeder/dockers/blob/master/node/Dockerfile
|
||||
[magickv]: https://pkgs.alpinelinux.org/package/main/x86_64/imagemagick
|
||||
[magickwrapperv]: https://www.npmjs.com/package/imagemagick
|
||||
[awsnodev]: https://aws.amazon.com/sdk-for-node-js/
|
||||
@@ -38,12 +38,12 @@ Payloads MUST be a valid JSON object literal.
|
||||
|
||||
* context.fail() does not currently truncate error logs.
|
||||
* `context.functionName` is of the form of a docker image, for example
|
||||
`iron/test-function`.
|
||||
`username/test-function`.
|
||||
* `context.functionVersion` is always the string `"$LATEST"`.
|
||||
* `context.invokedFunctionArn` is not supported. Value is empty string.
|
||||
* `context.memoryLimitInMB` does not reflect reality. Value is always `256`.
|
||||
* `context.awsRequestId` reflects the environment variable `TASK_ID`. On local
|
||||
runs from `ironcli` this is a UUID. On IronFunctions this is the task ID.
|
||||
runs from `fn` tool this is a UUID. On Functions server this is the task ID.
|
||||
* `logGroupName` and `logStreamName` are empty strings.
|
||||
* `identity` and `clientContext` are always `null`.
|
||||
|
||||
@@ -57,7 +57,7 @@ If your handler throws an exception, we only log the error message. There is no
|
||||
* CPython [2.7.11][pythonv]
|
||||
* boto3 (Python AWS SDK) [1.2.3][botov].
|
||||
|
||||
[pythonv]: https://hub.docker.com/r/iron/python/tags/
|
||||
[pythonv]: https://hub.docker.com/r/funcy/python/tags/
|
||||
[botov]: https://github.com/boto/boto3/releases/tag/1.2.3
|
||||
|
||||
### Event
|
||||
@@ -68,11 +68,11 @@ literal.
|
||||
### Context object
|
||||
|
||||
* `context.functionName` is of the form of a docker image, for example
|
||||
`iron/test-function`.
|
||||
`username/test-function`.
|
||||
* `context.functionVersion` is always the string `"$LATEST"`.
|
||||
* `context.invokedFunctionArn` is `None`.
|
||||
* `context.awsRequestId` reflects the environment variable `TASK_ID` which is
|
||||
set to the task ID on IronFunctions. If TASK_ID is empty, a new UUID is used.
|
||||
set to the task ID on Functions. If TASK_ID is empty, a new UUID is used.
|
||||
* `logGroupName`, `logStreamName`, `identity` and `clientContext` are `None`.
|
||||
|
||||
### Exceptions
|
||||
@@ -84,7 +84,7 @@ a JSON object with trace information.
|
||||
|
||||
* OpenJDK Java Runtime [1.8.0][javav]
|
||||
|
||||
[javav]: https://hub.docker.com/r/iron/java/tags/
|
||||
[javav]: https://hub.docker.com/r/funcy/java/tags/
|
||||
|
||||
The Java8 runtime is significantly lacking at this piont and we **do not
|
||||
recommend** using it.
|
||||
@@ -163,8 +163,8 @@ to CloudWatch are not supported.
|
||||
### Context object
|
||||
|
||||
* `context.getFunctionName()` returns a String of the form of a docker image,
|
||||
for example `iron/test-function`.
|
||||
for example `username/test-function`.
|
||||
* `context.getFunctionVersion()` is always the string `"$LATEST"`.
|
||||
* `context.getAwsRequestId()` reflects the environment variable `TASK_ID` which is
|
||||
set to the task ID on IronFunctions. If TASK_ID is empty, a new UUID is used.
|
||||
set to the task ID on Functions. If TASK_ID is empty, a new UUID is used.
|
||||
* `getInvokedFunctionArn()`, `getLogGroupName()`, `getLogStreamName()`, `getIdentity()`, `getClientContext()`, `getLogger()` return `null`.
|
||||
|
||||
@@ -1,128 +0,0 @@
|
||||
# Introduction
|
||||
|
||||
This guide will walk you through creating and testing a simple Lambda function.
|
||||
|
||||
We need the the `fn` tool for the rest of this guide. You can install it
|
||||
by following [these instructions](https://github.com/treeder/function/fn).
|
||||
|
||||
*For this getting started we are assuming you already have working lambda function code available, if not head to the [import instructions] (import.md) and skip the next section.*
|
||||
|
||||
## Creating the function
|
||||
|
||||
Let's convert the `hello_world` AWS Lambda example to Docker.
|
||||
|
||||
```python
|
||||
def my_handler(event, context):
|
||||
message = 'Hello {} {}!'.format(event['first_name'],
|
||||
event['last_name'])
|
||||
return {
|
||||
'message' : message
|
||||
}
|
||||
```
|
||||
|
||||
Create an empty directory for your project and save this code in a file called
|
||||
`hello_world.py`.
|
||||
|
||||
Now let's use `fn`'s Lambda functionality to create a Docker image. We can
|
||||
then run the Docker image with a payload to execute the Lambda function.
|
||||
|
||||
```sh
|
||||
$ fn lambda create-function irontest/hello_world:1 python2.7 hello_world.my_handler hello_world.py
|
||||
Creating directory: irontest/hello_world:1 ... OK
|
||||
Creating Dockerfile: irontest/hello_world:1/Dockerfile ... OK
|
||||
Copying file: irontest/hello_world/hello_world:1.py ... OK
|
||||
Creating function.yaml ... OK
|
||||
```
|
||||
|
||||
As you can see, this is very similar to creating a Lambda function using the
|
||||
`aws` CLI tool. We name the function as we would name other Docker images. The
|
||||
`1` indicates the version. You can use any string. This way you can configure
|
||||
your deployment environment to use different versions. The handler is
|
||||
the name of the function to run, in the form that python expects
|
||||
(`module.function`). Where you would package the files into a `.zip` to upload
|
||||
to Lambda, we just pass the list of files to `fn`.
|
||||
|
||||
## Deploying the function to IronFunctions
|
||||
|
||||
Next we want to deploy the function to our IronFunctions
|
||||
```sh
|
||||
$ fn deploy -v -d ./irontest irontest
|
||||
deploying irontest/hello_world:1/function.yaml
|
||||
Sending build context to Docker daemon 4.096 kB
|
||||
Step 1 : FROM iron/lambda-python2.7
|
||||
latest: Pulling from iron/lambda-python2.7
|
||||
c52e3ed763ff: Pull complete
|
||||
789cf808491a: Pull complete
|
||||
d1b635efed57: Pull complete
|
||||
fe23c3dbcfa8: Pull complete
|
||||
63c874a9687e: Pull complete
|
||||
a6d462dae1df: Pull complete
|
||||
Digest: sha256:c5dde3bf3be776c0f6b909d4ad87255a0af9b6696831fbe17c5f659655a0494a
|
||||
Status: Downloaded newer image for iron/lambda-python2.7:latest
|
||||
---> 66d3adf47835
|
||||
Step 2 : ADD hello_world.py ./hello_world:1.py
|
||||
---> 91a592e0dfa9
|
||||
Removing intermediate container 1a1ef40ff0dd
|
||||
Step 3 : CMD hello_world.my_handler
|
||||
---> Running in 318da1bba060
|
||||
---> db9b9644168e
|
||||
Removing intermediate container 318da1bba060
|
||||
Successfully built db9b9644168e
|
||||
The push refers to a repository [docker.io/irontest/hello_world:1]
|
||||
5d9d142e21b2: Pushed
|
||||
11d8145d6038: Layer already exists
|
||||
23885f85dbd0: Layer already exists
|
||||
6a350a8d14ee: Layer already exists
|
||||
e67f7ef625c5: Layer already exists
|
||||
321db514ef85: Layer already exists
|
||||
6102f0d2ad33: Layer already exists
|
||||
latest: digest: sha256:5926ff413f134fa353e4b42f2d4a0d2d4f5b3a39489cfdf6dd5b4a63c4e40dee size: 1784
|
||||
updating API with appName: irontest route: /hello_world:1 image: irontest/hello_world:1
|
||||
path result
|
||||
irontest/hello_world:1/function.yaml done
|
||||
```
|
||||
|
||||
This will deploy the generated function under the app `irontest` with `hello_world` as a route, e.g:
|
||||
`http://<hostname>/r/irontest/hello_world:1`,
|
||||
|
||||
You should also now see the generated Docker image.
|
||||
|
||||
```sh
|
||||
$ docker images
|
||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||
irontest/hello_world:1 latest db9b9644168e About a minute ago 108.4 MB
|
||||
...
|
||||
```
|
||||
|
||||
## Testing the function
|
||||
|
||||
The `test-function` subcommand can launch the Dockerized function with the
|
||||
right parameters.
|
||||
|
||||
```sh
|
||||
$ fn lambda test-function irontest/hello_world:1 --payload '{ "first_name": "Jon", "last_name": "Snow" }'
|
||||
{"message": "Hello Jon Snow!"}
|
||||
```
|
||||
|
||||
You should see the output.
|
||||
|
||||
## Calling the function from IronFunctions
|
||||
|
||||
The `fn call` command can call the deployed version with a given payload.
|
||||
|
||||
```sh
|
||||
$ echo '{ "first_name": "Jon", "last_name": "Snow" }' | ./fn call irontest /hello_world:1
|
||||
{"message": "Hello Jon Snow!"}
|
||||
```
|
||||
|
||||
You should see the output.
|
||||
|
||||
|
||||
## Commands documentation
|
||||
* [create-function](create.md)
|
||||
* [test-function](test.md)
|
||||
* [aws-import](import.md)
|
||||
|
||||
## More documentation
|
||||
* [env](environment.md)
|
||||
* [aws](aws.md)
|
||||
@@ -38,7 +38,7 @@ fn lambda aws-import arn:aws:lambda:us-west-2:123141564251:function:my-function
|
||||
|
||||
will import the function code from the region `us-east-1` to a directory called `./user/my-function`. Inside the directory you will find the `function.yml`, `Dockerfile`, and all the files needed for running the function.
|
||||
|
||||
Using Lambda with Docker Hub and IronFunctions requires that the Docker image be
|
||||
Using Lambda with Docker Hub and Oracle Functions requires that the Docker image be
|
||||
named `<Docker Hub username>/<image name>`. This is used to uniquely identify
|
||||
images on Docker Hub. Please use the `<Docker Hub username>/<image
|
||||
name>` as the image name with `aws-import` to create a correctly named image.
|
||||
@@ -50,6 +50,6 @@ by passing `--version <version>.`
|
||||
|
||||
You can then deploy the imported lambda as follows:
|
||||
```
|
||||
./fn deploy -d ./user/my-function user
|
||||
./fn deploy myapp
|
||||
````
|
||||
Now the function can be reached via ```http://$HOSTNAME/r/user/my-function```
|
||||
Reference in New Issue
Block a user