我在 AWS 上创建了一些 Lambda 函数用于测试目的(命名为 test_function
的东西),然后在测试后我发现这些函数可以在 prod env 中使用。
是否可以重命名 Lambda 函数?如何?或者我应该创建一个新的并复制粘贴源代码?
最接近重命名 lambda 函数的方法是使用别名,这是一种命名 lambda 特定版本的方法。但是,函数的实际名称是在创建后设置的。如果要重命名它,只需创建一个新函数并将完全相同的代码复制到其中即可。这样做不会花费您任何额外费用(因为您只需为执行时间付费),因此您不会有任何损失。
有关如何命名 lambda 函数版本的参考,请查看文档 here。
您不能重命名该函数,您唯一的选择是遵循此处已经提供的建议或创建一个新的并复制粘贴代码。
实际上,您不能重命名它是一件好事:如果可以,它将停止工作,因为附加到该函数的策略仍然指向旧名称,除非您要手动编辑它们中的每一个,或者它们是通用的(这是不明智的)。
但是,作为软件开发方面的最佳实践,我建议您始终将生产和测试(登台)分开,有效地复制您的环境。
这使您可以在安全的环境中测试东西,如果您犯了错误,您不会丢失任何重要的东西,并且当您确认您的新功能有效时,将它们复制到生产中。
因此,在您的情况下,您将有两个 lambda,一个称为“my-lambda-staging”,另一个称为“my-lambda-prod”。使用 lambdas 的 ENV 变量来适应当前环境,所以不需要重构!
我的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)
我的解决方案是导出函数,创建一个新的 Lambda,然后将 .zip 文件上传到新的 Lambda。
不定期副业成功案例分享