前任者が作成した大量の不要なLambda関数(約50個)を整理しているのですが、そのまま削除するのも怖いので、一応バックアップをとることにしました。
Lambda関数のバックアップや復元は、SAM(Serverless Application Model)やCloudFormationを使用するのが一般的らしいのですが、個別のテンプレートをつくるのが面倒だったので、AWS CLIで関数のコードと設定を一括で扱う方法を試してみました。
バックアップ
lambda_functions.txt
というファイルに全てのLambda関数名をリストアップします。
aws lambda list-functions --query 'Functions[*].[FunctionName]' --output text > lambda_functions.txt
次に、シェルスクリプトbackup_lambda.sh
を作成して各Lambda関数の設定とコードをダウンロードします。
while read function; do
echo "Backing up $function"
aws lambda get-function --function-name $function --query 'Configuration' > $function-config.json
aws lambda get-function --function-name $function --query 'Code.Location' --output text | xargs wget -O $function.zip
done <lambda_functions.txt
このスクリプトは lambda_functions.txt
にリストアップされた各Lambda関数に対して以下の処理を行います。
- 関数の設定をJSON形式でダウンロードし、関数名をつけたJSONファイル(
$function-config.json
)に保存 - 関数のデプロイメントパッケージ(実行に必要なコードと依存関係のライブラリをまとめたもの)をダウンロードし、関数名をつけたZIPファイル(
$function.zip
)に保存
これで一度にすべてのLambda関数のバックアップを取ることができます。
※バックアップの保存先は用途によって適宜選択します。復元時にすぐにオブジェクトへアクセスできるように、私はS3 Glacier Instant Retrievalを選びました。SSEは有効化しましたが、バージョニングやアクセスログは有効化していません(データの重要度やリスクの許容度を考慮した上で)。
復元
保存したコード(ZIP)と設定ファイル(JSON)を使用して、各関数を手動、もしくは自動で復元します。
個別関数の手動復元
- AWS Lambdaコンソールにログイン
- "関数の作成"をクリック
- "一から作成"を選択
- バックアップした設定ファイル(
~.json
)を参照して、関数名、ランタイム、ロールなどの設定を入力 - 関数の作成をクリック
- 新たに作成した関数のページに移動し、"関数コード"セクションで"アクション"->"ZIPファイルをアップロード"を選択し、バックアップしたZIPファイル(
~.zip
)をアップロード
シェルスクリプトによる複数関数の自動復元
複数のLambda関数を自動で復元したい場合にはシェルスクリプトをつかいます。
まずは、復元したいLambda関数の名前リスト(.txt)をつくります。
lambda-aaa
lambda-bbb
lambda-ccc
シェルスクリプトrestore_lambda.sh
を作成します。
while read function; do
echo "Restoring $function"
role=$(jq -r '.Role' $function-config.json)
handler=$(jq -r '.Handler' $function-config.json)
runtime=$(jq -r '.Runtime' $function-config.json)
aws lambda create-function --function-name $function --handler $handler --runtime $runtime --role $role --zip-file fileb://$function.zip
done <lambda_functions.txt
シェルスクリプトに実行権限を付与します。
chmod +x restore_lambda.sh
シェルスクリプトを実行します。
./restore_lambda.sh