cdk-lambda-bash
v2.0.327
Published
Deploy Bash Lambda Functions with AWS CDK
Downloads
426
Readme
cdk-lambda-bash
Deploy Bash Lambda Functions with AWS CDK
Why
AWS Lambda has the docker container image support since AWS re:Invent 2020 which allows you to run your Lambda code in a custom container image. Inspired by nikovirtala/cdk-eks-experiment, cdk-lambda-bash
allows you to specify a local shell script and bundle it up as a custom resource in your cdk stack. On cdk deployment, your shell script will be executed in a Lambda container environment.
BashExecFunction
At this moment, we are offering BashExecFunction
construct class which is a high-level abstraction of lambda.Function
. By defining the script
property which poins to your local shell script, on cdk deploy
, this script will be bundled into a custom docker image and published as a lambda.DockerImageFunction
.
If you fn.run()
, a custom resource will be created and the lambda.DockerImageFunction
will be executed on deployment.
Install
Use the npm dist tag to opt in CDKv1 or CDKv2:
// for CDKv2
npm install cdk-lambda-bash
or
npm install cdk-lambda-bash@latest
// for CDKv1
npm install cdk-lambda-bash@cdkv1
Sample
const app = new cdk.App();
const stack = new cdk.Stack(app, 'my-stack');
// bundle your Lambda function to execute the local demo.sh in container
const fn = new BashExecFunction(stack, 'Demo', {
script: path.join(__dirname, '../demo.sh'),
})
// run it as custom resource on deployment
fn.run();
Re-execution on assets update
By default, if you update your shell script or Dockerfile and re-deploy your CDK application, the BashExecFunction
will not be re-executed. Use runOnUpdate
to enable the re-execution on update.
fn.run({ runOnUpdate: true });
Custom Dockerfile
In some cases, you may customize your own Dockerfile
, for instances:
- You need extra tools or utilities such as
kubectl
orhelm
- You need build from your own base image
In these cases, create a custom Dockerfile
as below and add extra utilities i.e. kubectl
:
FROM public.ecr.aws/lambda/provided:al2
RUN yum install -y unzip jq
# install aws-cli v2
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
./aws/install
# install kubectl
RUN curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl && \
chmod +x kubectl && \
mv kubectl /usr/local/bin/kubectl
COPY bootstrap /var/runtime/bootstrap
COPY function.sh /var/task/function.sh
COPY main.sh /var/task/main.sh
RUN chmod +x /var/runtime/bootstrap /var/task/function.sh /var/task/main.sh
WORKDIR /var/task
CMD [ "function.sh.handler" ]
Specify your own Dockerfile
with the dockerfile
property.
new BashExecFunction(stack, 'Demo', {
script: path.join(__dirname, '../demo.sh'),
dockerfile: path.join(__dirname, '../Dockerfile'),
});
Conditional Execution
In the user script(e.g. demo.sh
), you are allowed to determine the event type and act accordingly.
For example
const installArgoCD = new BashExecFunction(...)
installArgoCD.run({runOnUpdate: true});
When you run this sample, demo.sh
will receive onCreate
event and you can run your custom logic to "install ArgoCD" like kubectl apply -f URL
. However, if you comment it off and deploy again:
const installArgoCD = new BashExecFunction(...)
//installArgoCD.run({runOnUpdate: true});
Under the hood, demo.sh
will receive onDelete
event and you can run your custom logic to "uninstall ArgoCD"
like kubectl delete -f URL
.
Check the full sample code below:
#!/bin/bash
# implement your business logic below
function onCreate() {
echo "running kubectl apply -f ..."
}
function onUpdate() {
echo "do nothing on update"
}
function onDelete() {
echo "running kubectl delete -f ..."
}
function getRequestType() {
echo $1 | jq -r .RequestType
}
function conditionalExec() {
requestType=$(getRequestType $EVENT_DATA)
# determine the original request type
case $requestType in
'Create') onCreate $1 ;;
'Update') onUpdate $1 ;;
'Delete') onDelete $1 ;;
esac
}
echo "Hello cdk lambda bash!!"
conditionalExec
exit 0
In Action
See this tweet