How to use Gloo Edge to combine Amazon EKS with AWS Lambda
AWS Lambda provides a lot of great use cases and benefits, such as not having any infrastructure to manage, being able to edit the code in a browser and quickly redeploy, and Lambda functions can be discovered and received traffic from an API gateway such as Gloo Edge so that you can get all the benefits of advanced routing and observability. It’s even better when you can combine Amazon EKS with AWS Lambda.
Gloo Edge receives requests from clients, and manages ingress by applying your routing rules and filters on traffic. Gloo Edge enforces zero-trust security and can handle high availability, load balancing, and failover.
In this blog, we show you how to set up an Amazon Elastic Kubernetes Service (EKS) cluster with Gloo Edge and route traffic to an AWS Lambda function.
For this walkthrough, we’ll assume you have an active AWS subscription with the appropriate permissions to create resources. If not, here’s how you can get started with a free trial.
Let’s install the tools we will need to get everything up and running. To install eksctl, find the install instructions for your particular operating system. For our example, we are using MacOS so we will install with brew:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" brew tap weaveworks/tap brew install weaveworks/tap/eksctl |
Next, let’s install Glooctl, which we will use to install and interact with Gloo Edge:
curl -sL https://run.solo.io/gloo/install | sh export PATH=$HOME/.gloo/bin:$PATH |
Finally, let’s install the AWS CLI:
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg" sudo installer -pkg AWSCLIV2.pkg -target / |
Configure the AWS CLI with your credentials by first creating an Access Key and Secret in the AWS console with My Security Credentials:
aws configure AWS Access Key ID [None]: xxxxxxxxxxxx AWS Secret Access Key [None]: xxxxxxxxxxxx Default region name [None]: us-east-2 Default output format [None]: json |
Now we can create our key pair and an EKS cluster:
aws ec2 create-key-pair --region us-east-2 --key-name gloo-key-pair eksctl create cluster \ --name lab-cluster-1 \ --region us-east-2 \ --with-oidc \ --ssh-access \ --ssh-public-key gloo-key-pair \ --managed |
Cluster creation can take anywhere between 5-20 minutes depending on the region and other factors.
Next let’s connect to the cluster and install Gloo Edge:
#Install Gloo Edge Gateway glooctl install gateway Creating namespace gloo-system... Done. Starting Gloo Edge installation... Gloo Edge was successfully installed! #Verify Gloo Edge status glooctl check Checking deployments... OK Checking pods... OK Checking upstreams... OK Checking upstream groups... OK Checking auth configs... OK Checking rate limit configs... OK Checking secrets... OK Checking virtual services... OK Checking gateways... OK Checking proxies... OK No problems detected. Skipping Gloo Instance check -- Gloo Federation not detected |
Now that we have an EKS cluster with Gloo Edge running, let’s deploy a Lambda function:
aws iam create-role --role-name lambda-ex \ --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}' aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole mkdir my-math-function cd my-math-function |
Copy the contents of the sample Python code from GitHub and save it in a new file named lambda_function.py:
zip my-deployment-package.zip lambda_function.py aws lambda create-function --function-name my-math-function \ --zip-file fileb://my-deployment-package.zip --handler lambda_function.lambda_handler \ --runtime python3.8 --role arn:aws:iam::[your-account-id]:role/lambda-ex --region us-east-2 |
Test the Lambda function:
aws lambda invoke \ --function-name my-math-function \ --cli-binary-format raw-in-base64-out \ --payload '{"action": "square","number": 3}' output.txt {"result": 9} |
Now that we have a working Lambda function, let’s route traffic from Gloo Edge to it:
glooctl create secret aws \ --name 'my-aws' \ --namespace gloo-system \ --access-key 'xxxxxxxxxxxx' \ --secret-key 'xxxxxxxxxxxx' glooctl create upstream aws \ --name 'my-aws-upstream' \ --namespace 'gloo-system' \ --aws-region 'us-east-2' \ --aws-secret-name 'my-aws' \ --aws-secret-namespace 'gloo-system' glooctl add route \ --name 'default' \ --namespace 'gloo-system' \ --path-prefix '/my-math-function' \ --dest-name 'my-aws-upstream' \ --aws-function-name 'my-math-function' |
As a last step, let’s test the route:
curl -H "Content-Type: application/json" --data '{"action": "square","number": 3}' --request POST $(glooctl proxy url)/my-math-function {"result": 9} |
Once you are done, to cleanup your environment and avoid any ongoing charges, run the following commands:
eksctl delete cluster --name lab-cluster-1 aws lambda delete-function --function my-math-function |
As you can see, Gloo Edge makes it easy to route traffic to AWS Lambda functions from your EKS cluster. We touched on just one simple method of routing, but encourage you to spend some time in our docs and give Gloo Edge a try for yourself.
Please feel free to reach out to us on Slack anytime as well, our experts are here to help you be successful faster.