この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、リサリサです。
Lambda関数をコピーしようと思ったら思ったよりめんどくさく、SAMの環境も整っておらず…、aws-cliで何とかできないかとやってみたのでブログにしてみます。
SAMファイルをダウンロードして、SAMでデプロイをすれば、こんな事は不要なのかもしれませんが…
やりたい事
SAMなしで、Lambda関数を、Layersの設定、環境変数、各基本設定ごとお手軽に複製したい。
※正確に複製するにはKMSのarnや、VPCの設定などなどありますが、今回は必要なかったので、このコードでは対応していません。
aws-cliで複製元の情報を取得し、aws-cliで新関数を作成していきます。
できない事
正確に複製するにはKMSのarnや、VPCの設定などなどありますが、今回は必要なかったので対応していません。
同じようにget-xxx系のコマンドで取得して、create-functionのパラメーターで設定すればできると思います。
また、トリガーも複製できません。
やってみた
前提
cliで取得したjsonの分解にjqを使います。
入っていなかったらインストールしてください。
sudo apt install jq
aws-cliで複製元の情報を取得
get_functionで、コードの内容と基本的な設定値を取得、
get_function_configurationで、layersとenvironmentを取得しました。
# 関数名を指定
function_name_from='複製元関数名'
function_name_to='複製先関数名'
# cliで複製元の情報を取得
get_function=`aws lambda get-function --function-name $function_name_from`
get_function_configuration=`aws lambda get-function-configuration --function-name $function_name_from`
# コードをzipで取得
echo $get_function | jq .Code.Location -r | xargs curl -o code.zip
# cliで取得したjsonから、それぞれ基本的な設定値を抜き出す
role=`echo $get_function | jq .Configuration.Role -r`
runtime=`echo $get_function | jq .Configuration.Runtime -r`
handler=`echo $get_function | jq .Configuration.Handler -r`
timeout=`echo $get_function | jq .Configuration.Timeout -r`
memory_size=`echo $get_function | jq .Configuration.MemorySize -r`
description=`echo $get_function | jq .Configuration.Description -r`
layers=`echo $get_function_configuration | jq .Layers[].Arn -r`
environment=`echo $get_function_configuration | jq .Environment -r`
aws-cliで新関数を作成
create-functionを使って、新関数を作成していきます。
descriptionは複製元関数に設定がされていないと空文字になってエラーとなるので、コメントアウトしています。
# 関数作成
aws lambda create-function \
--function-name $function_name_to \
--role $role \
--zip-file 'fileb://code.zip' \
#--description $description \
--runtime $runtime \
--handler $handler \
--timeout $timeout \
--memory-size $memory_size \
--layers $layers \
--environment "$environment"
#カレントディレクトリにcode.zipが残るので、不要であれば削除
rm code.zip
最後に
お手軽にLambdaをコピーしたいという方のお役に立てれば幸いです。
実はSAMは使ったことがないので、今度はSAMを使って複製してみたいと思います!