1

I have a bash script that I want to run through lambda function.

Can bash script be written inside a AWS Lambda function I found this post and tried running bash script by python os.system('bash_script.sh'). It works but the python lambda does not wait for the bash script to finish executing. Then I was about to try the other solution provided in the post which is making the lambda function runtime Custom.

However, since I need to deploy the custom runtime lambda function via cloudformation template, I am stuck how to point the files and deploy it correctly.

Here are files I got so far by reading docs and watching videos about it.

filename: bootstrap
#!/bin/sh
set -euo pipefail

# Handler format: <script_name>.<bash_function_name>
#
# The script file <script_name>.sh  must be located at the root of your
# function's deployment package, alongside this bootstrap executable.
source $(dirname "$0")/"$(echo $_HANDLER | cut -d. -f1).sh"

while true
do
    # Request the next event from the Lambda runtime
    HEADERS="$(mktemp)"
    EVENT_DATA=$(curl -v -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
    INVOCATION_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

    # Execute the handler function from the script
    RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

    # Send the response to Lambda runtime
    curl -v -sS -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$INVOCATION_ID/response" -d "$RESPONSE"
done

filename: hello.sh

function handler () {
    EVENT_DATA=$1

    # more logics come in here

    RESPONSE="{"statusCode": 200, "body": "Hello from Lambda!"}"
    echo $RESPONSE
}

cloudformation template

CustomRuntimeLambda:
  Type: AWS::Serverless::Function
  Properties:
    FunctionName: custom-runtime-lambda-function
    Description: custom runtime lambda function
    Runtime: provided
    Handler: <WHAT COMES HERE??>
    Role: !GetAtt LambdaRole.Arn
    Timeout: 60 
    CodeUri: ../src

The above 2 files, bootstrap and hello.sh are just exact same copies generated by AWS lambda Console.

So I am not sure what to insert in Handler. in python or node we put there like app:handler But, what about the custom runtime case? I know that Runtime has two options as provided and provided.al2. My goal is to just run the bash script as lambda function. And the lambda function will be called by schedule or other aws services like api-gateway or step-function.

I saw the example of custom runtime with a webpack. It was using a specific type of file Makefile and under Metadata in cloudformation, the path to it was specified.

If that is the configuration I am missing in my cloudformation, then what would be the contents of Makefile in the usecase?

Any suggestion or help will be much appreciated. Thank you very much in advance.

John Rotenstein
  • 241,921
  • 22
  • 380
  • 470

0 Answers0