背景
開発工数を抑えるためにAWS Lambdaから既存Bashスクリプトを実行する手順を検証を検証しました
。忘れないようにメモ書きを残したいと思います。
前提条件
・検証用EC2(AMI名:RHEL-9.3.0_HVM-20240117-x86_64-49-Hourly2-GP3)が構築済みであること
・検証用EC2がAWS CLI V2がインストール済みであること
・ディレクトリ構成
手順
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コンソール上でディレクトリー構成を確認する
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)
参考
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-walkthrough.html