Я создал лямбда-функцию в AWS (Python), используя "upload .zip" Я потерял эти файлы, и мне нужно внести некоторые изменения, есть ли способ загрузить этот .zip?

Ответы (6)

Да!

Перейдите к настройкам лямбда-функции, и в правом верхнем углу вы увидите кнопку «Действия». В раскрывающемся меню выберите «экспорт» и во всплывающем окне нажмите «Загрузить пакет развертывания», и функция загрузится в виде файла .zip.

Кнопка действия вверху справа

Step#1

Всплывающее окно с призывом к действию выше (нажмите «Загрузить пакет развертывания» здесь)

Step#2

Вот bash-скрипт, который я использовал, он загружает все функции в регионе по умолчанию:

download_code () {
    local OUTPUT=$1
    OUTPUT=`sed -e 's/,$//' -e 's/^"//'  -e 's/"$//g'  <<<"$OUTPUT"`
    url=$(aws lambda get-function --function-name get-marvel-movies-from-opensearch --query 'Code.Location' )
    wget $url -O $OUTPUT.zip
}

FUNCTION_LIST=$(aws lambda list-functions --query Functions[*].FunctionName)
for run in $FUNCTION_LIST
do
    download_code $run
done

echo "Finished!!!!"

Если вы хотите загрузить все функции в данном регионе, вот мой обходной путь. Я создал простой скрипт узла для загрузки функции. Перед запуском скрипта установите все необходимые пакеты npm и настройте интерфейс командной строки AWS для нужного региона.

let download = require('download-file');
let extract = require('extract-zip');
let cmd = require('node-cmd');

let downloadFile = async function (dir, filename, url) {
    let options = {
        directory: dir,
        filename: filename
    }
    return new Promise((success, failure) => {
        download(url, options, function (err) {
            if (err) {
                failure(err)
            } else {
                success('done');
            }
        })
    })
}

let extractZip = async function (source, target) {
    return new Promise((success, failure) => {
        extract(source, { dir: target }, function (err) {
            if (err) {
                failure(err)
            } else {
                success('done');
            }
        })
    })
}

let getAllFunctionList = async function () {
    return new Promise((success, failure) => {
        cmd.get(
            'aws lambda list-functions',
            function (err, data, stderr) {
                if (err || stderr) {
                    failure(err || stderr)
                } else {
                    success(data)
                }
            }
        );
    })
}

let getFunctionDescription = async function (name) {
    return new Promise((success, failure) => {
        cmd.get(
            `aws lambda get-function --function-name ${name}`,
            function (err, data, stderr) {
                if (err || stderr) {
                    failure(err || stderr)
                } else {
                    success(data)
                }
            }
        );
    })
}

let init = async function () {
    try {
        let { Functions: getAllFunctionListResult } = JSON.parse(await getAllFunctionList());
        let getFunctionDescriptionResult, downloadFileResult, extractZipResult;
        getAllFunctionListResult.map(async (f) => {
            var { Code: { Location: getFunctionDescriptionResult } } = JSON.parse(await getFunctionDescription(f.FunctionName));
            downloadFileResult = await downloadFile('./functions', `${f.FunctionName}.zip`, getFunctionDescriptionResult)
            extractZipResult = await extractZip(`./functions/${f.FunctionName}.zip`, `/Users/malhar/Desktop/get-lambda-functions/final/${f.FunctionName}`)
            console.log('done', f.FunctionName);
        })
    } catch (e) {
        console.log('error', e);
    }
}


init()

Вы можете использовать доступный сценарий оболочки здесь

Обновление: Добавлена ​​ссылка на скрипт sambhaji-sawant. Исправлены опечатки, улучшен ответ и сценарий на основе комментариев!

Вы можете использовать aws-cli, чтобы загрузить zip-архив любой лямбды.

Сначала вам нужно получить URL-адрес лямбда-архива $ aws лямбда-функция get - имя-функции $ functionName --query 'Code.Location'

Затем вам нужно использовать wget / curl для загрузки zip-архива с URL-адреса. $ wget -O myfunction.zip URL_from_step_1

Кроме того, вы можете перечислить все функции в своей учетной записи AWS, используя

$ aws лямбда-списки-функции

Я сделал простой сценарий bash для параллельной загрузки всех лямбда-функций из вашей учетной записи AWS. Вы можете это увидеть здесь :)

Примечание: вам нужно будет настроить aws-cli перед использованием вышеуказанных команд (или любой другой команды aws-cli), используя aws configure

Полное руководство здесь

Вы можете найти скрипт Python для загрузки всех лямбда-функций здесь.

import os
import sys
from urllib.request import urlopen
import zipfile
from io import BytesIO

import boto3

def get_lambda_functions_code_url():

client = boto3.client("lambda")

lambda_functions = [n["FunctionName"] for n in client.list_functions()["Functions"]]

functions_code_url = []

for fn_name in lambda_functions:
    fn_code = client.get_function(FunctionName=fn_name)["Code"]
    fn_code["FunctionName"] = fn_name
    functions_code_url.append(fn_code)

return functions_code_url


def download_lambda_function_code(fn_name, fn_code_link, dir_path):

    function_path = os.path.join(dir_path, fn_name)
    if not os.path.exists(function_path):
        os.mkdir(function_path)

    with urlopen(fn_code_link) as lambda_extract:
        with zipfile.ZipFile(BytesIO(lambda_extract.read())) as zfile:
            zfile.extractall(function_path)


if __name__ == "__main__":
    inp = sys.argv[1:]
    print("Destination folder {}".format(inp))
    if inp and os.path.exists(inp[0]):
        dest = os.path.abspath(inp[0])
        fc = get_lambda_functions_code_url()
        print("There are {} lambda functions".format(len(fc)))
        for i, f in enumerate(fc):
            print("Downloading Lambda function {} {}".format(i+1, f["FunctionName"]))
            download_lambda_function_code(f["FunctionName"], f["Location"], dest)
    else:
        print("Destination folder doesn't exist")

2022 WebDevInsider