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

Posted

技术标签:

【中文标题】是否可以重命名 AWS Lambda 函数?【英文标题】:Is it possible to rename an AWS Lambda function? 【发布时间】:2016-08-09 15:11:00 【问题描述】:

我在 AWS 上创建了一些 Lambda 函数用于测试目的(命名为 test_function something),然后在测试后发现这些函数可以在 prod env 中使用。

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

【问题讨论】:

【参考方案1】:

重命名 lambda 函数最接近的方法是使用别名,这是一种命名 lambda 特定版本的方法。但是,函数的实际名称是在创建后设置的。如果要重命名它,只需创建一个新函数并将完全相同的代码复制到其中即可。这样做不会花费您任何额外费用(因为您只需为执行时间付费),因此您不会有任何损失。

有关如何命名 lambda 函数版本的参考,请查看文档 here。

【讨论】:

你会认为亚马逊会照你说的做,让我拥有我该死的重命名功能:-)【参考方案2】:

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

实际上你不能重命名它是一件好事:如果你能重命名,它就会停止工作,因为附加到函数的策略仍然指向旧名称,除非你手动编辑它们中的每一个,或使它们成为通用的(这是不明智的)。

但是,作为软件开发方面的最佳实践,我建议您始终将生产和测试(暂存)分开,有效地复制您的环境。

这使您可以在安全的环境中测试东西,如果您犯了错误,您不会丢失任何重要的东西,并且当您确认您的新功能有效时,将它们复制到生产环境中。

因此,在您的情况下,您将有两个 lambda,一个称为“my-lambda-staging”,另一个称为“my-lambda-prod”。使用lambdas的ENV变量适应当前环境,无需重构!

【讨论】:

【参考方案3】:

我的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)

【讨论】:

【参考方案4】:

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

【讨论】:

你知道如何通过界面做到这一点吗? 我看到它仅导出/导入代码。对于导入代码:功能代码 > 操作 > 上传 .zip 文件/从 Amazon S3 上传文件。 如果只导入代码,剩下的配置会丢失,小心

以上是关于是否可以重命名 AWS Lambda 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 AWS 客户 IAM 策略?

AWS 重命名权限

如何在AWS Linux中重命名wall命令?

如何以编程方式重命名 AWS Glue 目录中的列名

重命名使用 AWS cli 生成的用于 beanstalk 部署的战争

是否可以重命名 PyMongo 中 Mongo 查询输出中的字段?