Lambda関数をaws-cliでお手軽に複製してみた
こんにちは、リサリサです。
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を使って複製してみたいと思います!