Create a Lambda OCI Function with the ACK Lambda Controller
Create a Lambda Function with an OCI Image Using Elastic Kubernetes Service (EKS).
The ACK service controller for Amazon Lambda lets you manage Lambda functions directly from Kubernetes. This guide shows you how to create a Lambda function with OCI image using a single Kubernetes resource manifest.
Setup
Although it is not necessary to use Amazon Elastic Kubernetes Service (Amazon EKS) or Amazon Elastic Container Registry (Amazon ECR) with ACK, this guide assumes that you have access to an Amazon EKS cluster. If this is your first time creating an Amazon EKS cluster and Amazon ECR repository, see Amazon EKS Setup and Amazon ECR Setup.
Prerequisites
This guide assumes that you have:
- Created an EKS cluster with Kubernetes version 1.16 or higher.
- Have access to Amazon ECR
- AWS IAM permissions to create roles and attach policies to roles.
- Installed the following tools on the client machine used to access your Kubernetes cluster:
- AWS CLI - A command line tool for interacting with AWS services.
- kubectl - A command line tool for working with Kubernetes clusters.
- eksctl - A command line tool for working with EKS clusters.
- Helm 3.8+ - A tool for installing and managing Kubernetes applications.
- Docker - A tool to build, share, and run containers.
Install the ACK service controller for Lambda
Log into the Helm registry that stores the ACK charts:
aws ecr-public get-login-password --region us-west-2 | helm registry login --username AWS --password-stdin public.ecr.aws
Deploy the ACK service controller for Amazon Lambda using the lambda-chart Helm chart. This example creates resources in the us-west-2
region, but you can use any other region supported in AWS.
SERVICE=lambda
RELEASE_VERSION=$(curl -sL https://api.github.com/repos/aws-controllers-k8s/${SERVICE}-controller/releases/latest | jq -r '.tag_name | ltrimstr("v")')
helm install --create-namespace -n ack-system oci://public.ecr.aws/aws-controllers-k8s/lambda-chart "--version=${RELEASE_VERSION}" --generate-name --set=aws.region=us-west-2
For a full list of available values to the Helm chart, please review the values.yaml file.
Configure IAM permissions
Once the service controller is deployed configure the IAM permissions for the
controller to invoke the Lambda API. For full details, please review the AWS Controllers for Kubernetes documentation
for how to configure the IAM permissions. If you follow the examples in the documentation, use the
value of lambda
for SERVICE
.
Create Lambda function handler
The Lambda function handler is the method in your function code that processes events. When your function is invoked, Lambda runs the handler method.
cat <<EOF > app.js
exports.handler = async (event) => {
const response = {
statusCode: 200
body: JSON.stringify('Hello from Lambda!')
};
return response;
};
EOF
Create and Build a Docker Image
Create a Dockerfile that will be used to build the image for our Lambda function:
cat <<EOF > Dockerfile
FROM public.ecr.aws/lambda/nodejs:14
COPY app.js package.json ./
RUN npm install
CMD [ "app.handler" ]
EOF
Build the Docker image in your local environment. You will need to install dependencies using npm
:
npm init -y
docker build -t hello-world .
Publish the Docker image to ECR
Publish the Docker image to an ECR repository. It’s a requirement for container images to be published to the ECR repository to run Lambda OCI image functions.
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
export AWS_REGION=us-west-2
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
docker tag "hello-world:latest ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/hello-world:latest"
docker push "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/hello-world:latest"
Deploy the Lambda OCI function using the ACK Lambda controller
The following example creates a manifest that contains the Lambda OCI function. It then uses kubectl
to create the resource in Kubernetes:
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
export IMAGE_URI="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/hello-world:latest "
export FUNCTION_NAME="lambda-oci-ack"
export LAMBDA_ROLE="arn:aws:iam::${AWS_ACCOUNT_ID}:role/lambda_basic_execution"
read -r -d '' LAMBDA_MANIFEST <<EOF
apiVersion: lambda.services.k8s.aws/v1alpha1
kind: Function
metadata:
name: $FUNCTION_NAME
annotations:
services.k8s.aws/region: $AWS_REGION
spec:
name: $FUNCTION_NAME
packageType: Image
code:
imageURI: $IMAGE_URI
role: $LAMBDA_ROLE
description: function created by ACK lambda-controller e2e tests
EOF
echo "${LAMBDA_MANIFEST}" > function.yaml
kubectl create -f function.yaml
You should get a confirmation that the function was created successfully.
function.lambda.services.k8s.aws/lambda-oci-ack created
To get details about the Lambda function, run the following.
kubectl describe "function/${FUNCTION_NAME}"
Invoke the Lambda OCI Function
After you have verified that the Lambda OCI function is deployed correctly, you can invoke the function through the AWS CLI.
aws lambda invoke --function-name ${FUNCTION_NAME} --region us-west-2 /dev/stdout | jq
You will get the output as below:
{"statusCode":200,"body":"\"Hello from Lambda!\""}
Next steps
The ACK service controller for Amazon Lambda is based on the Amazon Lambda API.
Refer to API Reference for Lambda to find all the supported Kubernetes custom resources and fields.
Cleanup
You can delete your Lambda OCI function using the kubectl delete
command:
kubectl delete -f function.yaml
To remove the Lambda ACK service controller, related CRDs, and namespaces, see ACK Cleanup.
To delete your EKS clusters, see Amazon EKS - Deleting a cluster.