Lambdaカスタムランタイムで複数引数のbashスクリプトを実行してみた

背景

開発工数を抑えるためにAWS Lambdaから既存Bashスクリプトを実行する手順を検証を検証しました
。忘れないようにメモ書きを残したいと思います。

前提条件

・検証用EC2(AMI名:RHEL-9.3.0_HVM-20240117-x86_64-49-Hourly2-GP3)が構築済みであること
・検証用EC2がAWS CLI V2がインストール済みであること
・ディレクトリ構成
file

手順

1.各ファイルの内容

bootstrap

#!/bin/sh
set -euo pipefail

# Initialization - load function handler
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"
echo "script name:"
echo "$(echo $_HANDLER | cut -d. -f1).sh"

# Processing
while true
do
  HEADERS="$(mktemp)"
  # Get an event. The HTTP request will block until one is received
  EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")

  # Extract request ID by scraping response headers received above
  REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
  echo "_HANDLER:"
  echo "$_HANDLER"
  echo "_HANDLER: | cut -d. -f2"
  echo $(echo "$_HANDLER" | cut -d. -f2)
  echo "EVENT_DATA:"
  echo "$EVENT_DATA"

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

  echo "RESPONSE:"
  echo $RESPONSE

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

function.sh

function handler () {
  # # Parse the event data
  # EVENT_DATA=$1
  # echo "EVENT_DATA in handler:"
  # echo "$EVENT_DATA"

  # Parse the event data
  PARAMETER_NO_DOUBLE_QUOTATION=$(echo "$EVENT_DATA" | tr -d '"')
  echo "PARAMETER_NO_DOUBLE_QUOTATION:"
  echo "$PARAMETER_NO_DOUBLE_QUOTATION"

  # your_script_str="./your_directory/your_script.sh $PARAMETER_NO_DOUBLE_QUOTATION"
  # echo "your_script_str:"
  # echo "$your_script_str"  

  # Call a bash script with multiple arguments
  # ./your_directory/your_script.sh $PARAMETER_NO_DOUBLE_QUOTATION
  ./your_directory/your_script.sh $PARAMETER_NO_DOUBLE_QUOTATION
}

your_script.sh

#! /bin/bash

echo "実行ファイル名=" $0
echo "第1引数=" $1
echo "第2引数=" $2
echo "第3引数=" $3
echo "引数の総数=" $#
echo "全ての引数=" $@

2.関数の作成

2-1. プロジェクト用のディレクトリを作成し、そのディレクトリに切り替えます。

mkdir bash-runtime
cd bash-runtime

mkdir your_directory
cd your_directory

2-2. ディレクトリ以下全てのファイルを実行可能にして .zip アーカイブに追加します。これがデプロイパッケージです。

cd ..
chmod -R 755 ./

zip -r bash-runtime.zip ./

2-3. Lambda関数の作成

aws lambda create-function --function-name bash-runtime \
--zip-file fileb://bash-runtime.zip --handler function.handler --runtime provided.al2023 \
--role arn:aws:iam::<自分のAWSアカウントID>:role/kobayashi-admin

作成後、AWSコンソール上でディレクトリー構成を確認する
file

3. Lambda関数の実行

コマンド:

aws lambda invoke --function-name bash-runtime --payload '"one two three"' response.txt --cli-binary-format raw-in-base64-out

実行例:


[ec2-user@ip-10-30-100-187 bash-runtime]$ aws lambda invoke --function-name bash-runtime --payload '"one two three"' response.txt --cli-binary-format raw-in-base64-out
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
[ec2-user@ip-10-30-100-187 bash-runtime]$

[ec2-user@ip-10-30-100-187 bash-runtime]$ cat response.txt
PARAMETER_NO_DOUBLE_QUOTATION:
one two three
実行ファイル名= ./your_directory/your_script.sh
第1引数= one
第2引数= two
第3引数= three
引数の総数= 3
全ての引数= one two three[ec2-user@ip-10-30-100-187 bash-runtime]$

4. Lambdaの実行ログの確認(Cloudwatch logs)

file

参考

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html

Last modified: 2024-05-20

Author