Lambda関数をaws-cliでお手軽に複製してみた

2021.04.30

こんにちは、リサリサです。

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を使って複製してみたいと思います!