AWS Lambda函数是否可以重命名?

115

我为测试目的创建了一些AWS Lambda函数(命名为test_function之类的),然后在测试后发现这些函数可以在生产环境中使用。

是否可以重命名AWS Lambda函数?如何操作? 还是说我应该创建一个新的并复制粘贴源代码?

4个回答

127
您最接近重命名 AWS Lambda 函数的方法是使用别名,这是一种为 AWS Lambda 函数的特定版本命名的方式。但实际上,函数的名称只能在创建时设置。如果您想要重命名它,只需创建一个新函数并将完全相同的代码复制到其中即可。这不会为您带来额外的费用(因为您仅按执行时间计费),因此您不会失去任何东西。
有关如何为 AWS Lambda 函数的版本命名的参考,请查看此处的文档:Lambda function versions

74
你可能会认为,亚马逊会在后台做你说的事,并允许我使用我的重命名功能 :-) - Blundell

7

你无法重命名该函数,唯一的选择是按照这里提供的建议或创建一个新函数并复制粘贴代码。

实际上,如果您能够重命名函数,这是一件好事情:因为与该函数相关联的策略仍然指向旧名称,否则它将停止工作,除非您手动编辑每个策略,或使它们通用(不建议这样做)。

然而,在软件开发方面的最佳实践是,建议您始终保持生产和测试(staging)分离,有效地复制您的环境。

这使您可以在安全环境中测试内容,如果您犯了错误,您不会丢失任何重要内容,并且确认您的新功能正常工作后,再在生产环境中复制它们。

因此,在您的情况下,您将拥有两个λ函数,一个称为“my-lambda-staging”,另一个称为“my-lambda-prod”。使用λ函数的环境变量适应当前环境,这样您就不需要进行重构!


2

我的解决方案是将函数导出,创建一个新的Lambda,然后将.zip文件上传到新的Lambda。


1
你知道如何通过界面完成这个操作吗? - darkace
我看到它只能导入/导出代码。要导入代码:函数代码>操作>上传.zip文件/从Amazon S3上传文件。 - alditis
如果你只导入代码,剩余的配置将会丢失,请小心。 - ElKePoN

2

我对Lambda重命名的解决方案是,基本上使用boto3描述先前的Lambda信息来进行配置设置,并下载先前的Lambda函数代码以创建新的Lambda,但触发器不会被设置,因此您需要手动添加触发器。

from boto3.session import Session
from botocore.client import Config
from botocore.handlers import set_list_objects_encoding_type_url
import boto3
import pprint
import urllib3

pp = pprint.PrettyPrinter(indent=4)

session = Session(aws_access_key_id= {YOUR_ACCESS_KEY},
                  aws_secret_access_key= {YOUR_SECRET_KEY},
                  region_name= 'your_region')

PREV_FUNC_NAME = 'your_prev_function_name'
NEW_FUNC_NAME = 'your_new_function_name'


def prev_lambda_code(code_temp_path):
    '''
    download prev function code
    '''
    code_url = code_temp_path
    http = urllib3.PoolManager()
    response = http.request("GET", code_url)
    if not 200 <= response.status < 300:
        raise Exception(f'Failed to download function code: {response}')
    return response.data

def rename_lambda_function(PREV_FUNC_NAME , NEW_FUNC_NAME):
    '''
    Copy previous lambda function and rename it
    '''
    lambda_client = session.client('lambda')
    prev_func_info = lambda_client.get_function(FunctionName = PREV_FUNC_NAME)

    if 'VpcConfig' in prev_func_info['Configuration']:
        VpcConfig = {
            'SubnetIds' : prev_func_info['Configuration']['VpcConfig']['SubnetIds'],
            'SecurityGroupIds' : prev_func_info['Configuration']['VpcConfig']['SecurityGroupIds']
        }
    else:
        VpcConfig = {}

    if 'Environment' in prev_func_info['Configuration']:
        Environment = prev_func_info['Configuration']['Environment']
    else:
        Environment = {}

    response = client.create_function(
        FunctionName = NEW_FUNC_NAME,
        Runtime = prev_func_info['Configuration']['Runtime'],
        Role = prev_func_info['Configuration']['Role'],
        Handler = prev_func_info['Configuration']['Handler'],
        Code = {
            'ZipFile' : prev_lambda_code(prev_func_info['Code']['Location'])
        },
        Description = prev_func_info['Configuration']['Description'],
        Timeout = prev_func_info['Configuration']['Timeout'],
        MemorySize = prev_func_info['Configuration']['MemorySize'],
        VpcConfig = VpcConfig,
        Environment = Environment,
        PackageType = prev_func_info['Configuration']['PackageType'],
        TracingConfig = prev_func_info['Configuration']['TracingConfig'],
        Layers = [Layer['Arn'] for Layer in prev_func_info['Configuration']['Layers']],
    )
    pp.pprint(response)

rename_lambda_function(PREV_FUNC_NAME , NEW_FUNC_NAME)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接