タダです.
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バケット名]/ }
参考にしたドキュメント
カスタムランタイムのコードをデプロイ
カスタムランタイムのコードを書き終えたら権限を設定して 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
マネジメントコンソールで関数が作成されたことを確認できました.
まとめ
カスタムランタイムで Lambda を使うのが初めてだったので記事にまとめておきました.同じ用途で使いたいと考えている人にとって参考になれば嬉しいです.