継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

Lambda のカスタムランタイムで AWS CLI を実行させる

タダです.

Aurora のスナップショットを S3 にエクスポートする処理を自動化したいと思って,Lambda でカスタムランタイムを使ってAWS CLI を実行する検証をしたので備忘録として記事に残しておきます.

カスタムランタイムのコード

カスタムランタイムを実行するためにはbootstrapと一緒に関数のコードをデプロイパッケージに含んでアップロードします.今回は,bootstrapにて AWS CLI の実行準備を行って,関数を実行するように設定したコードfunction.shを用意しました.なお,スナップショット は自動で取得されているものをエクスポートの対象としており,スナップショットを元に作った Athena のテーブルは作成済みの状況です.

bootstrap

#!/bin/sh
set -euo pipefail

# AWS CLI DirectorySetting
export HOME="/tmp"
export PATH="$HOME/.local/bin:$PATH"

# AWS CLI Setup
cd /tmp
curl -sSL https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user
pip install awscli --user

# Initialization - load function handler
source $LAMBDA_TASK_ROOT/"$(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

function.sh

function handler() {
    export AWS_DEFAULT_REGION=ap-northeast-1

    # スナップショット名を取得
    export SNAPSHOT_NAME_BEFORE=`aws rds describe-db-cluster-snapshots --snapshot-type automated --query 'DBClusterSnapshots[0].DBClusterSnapshotIdentifier' --output text`
    export SNAPSHOT_NAME=`echo ${SNAPSHOT_NAME_BEFORE} | cut -c 5-`

    # RDSのスナップショットをS3にエクスポート 
    aws rds start-export-task \
        --export-task-identifier ${SNAPSHOT_NAME} \
        --source-arn arn:aws:rds:ap-northeast-1:XXXXXXXXXXXX:cluster-snapshot:rds:${SNAPSHOT_NAME}  \
        --export-only "hogeschema.hogetable1" "hogeschema.hogetable2" \
        --s3-bucket-name [S3 バケット名] \
        --iam-role-arn [IAM ロールの ARN] \
        --kms-key-id [KMS の ARN]  \

    # S3のパスを変更
    aws athena start-query-execution --query-string "ALTER TABLE [テーブル名] SET LOCATION 's3://[S3バケット名]/$SNAPSHOT_NAME/[エクスポートしたデータへのパス]';" --result-configuration OutputLocation=s3://[S3バケット名]/
}

参考にしたドキュメント

docs.aws.amazon.com

docs.aws.amazon.com

docs.aws.amazon.com

カスタムランタイムのコードをデプロイ

カスタムランタイムのコードを書き終えたら権限を設定して zip で圧縮します.

$ chmod 755 function.sh bootstrap
$ zip function.zip function.sh bootstrap

上記の準備ができたらカスタムランタイムの関数を作成します.

 aws lambda create-function --function-name [関数名] \
--zip-file fileb://function.zip --handler function.handler --runtime provided \
--role arn:aws:iam::XXXXXXXXXXXX:role/lambda-role

マネジメントコンソールで関数が作成されたことを確認できました.

f:id:sadayoshi_tada:20201004171218p:plain

まとめ

カスタムランタイムで Lambda を使うのが初めてだったので記事にまとめておきました.同じ用途で使いたいと考えている人にとって参考になれば嬉しいです.

関連記事

sadayoshi-tada.hatenablog.com