如何使用boto3下载Lambda部署包实现跨区域跨账号迁移
Lambda跨区域跨账号迁移部署包获取方案
response["Code"]返回的是Lambda函数部署包的存储信息,其中Location字段是AWS自动生成的有效期10分钟的预签名下载链接,只要你调用get_function接口时拥有对应函数的lambda:GetFunction权限,就可以直接通过该链接下载部署包,不需要额外申请S3存储桶的访问权限。
你直接访问链接报AccessDenied的常见原因有两个:
- 直接将链接粘贴到浏览器发起请求,浏览器没有携带你调用
get_function时使用的AWS身份凭证,预签名URL的权限和生成该URL的身份强关联 - 调用
get_function获取链接后超过10分钟才使用,预签名URL已过期失效
具体实现代码
下载部署包到本地
import boto3 import requests # 初始化源账号对应区域的Lambda客户端 source_lambda_client = boto3.client('lambda', region_name='源区域ID') # 获取函数配置与代码信息 resp = source_lambda_client.get_function(FunctionName="你的源函数名") deploy_pkg_url = resp["Code"]["Location"] # 直接请求预签名URL下载部署包 pkg_resp = requests.get(deploy_pkg_url) # 保存到本地文件 with open("lambda_deploy_package.zip", "wb") as f: f.write(pkg_resp.content)
直接用于跨账号创建函数(无需本地存储)
import boto3 import requests # 初始化源端Lambda客户端 source_lambda = boto3.client('lambda', region_name='us-east-2') # 初始化目标端Lambda客户端(需配置目标账号的访问凭证、目标区域) target_lambda = boto3.client('lambda', region_name='ap-southeast-1') # 获取源函数信息 resp = source_lambda.get_function(FunctionName="myFunc") func_config = resp["Configuration"] pkg_content = requests.get(resp["Code"]["Location"]).content # 在目标账号创建函数 target_lambda.create_function( FunctionName = func_config["FunctionName"], Runtime = func_config["Runtime"], # 注意替换为目标账号下的Lambda执行角色ARN Role = "arn:aws:iam::目标账号ID:role/你的Lambda执行角色名", Handler = func_config["Handler"], Code = { "ZipFile": pkg_content }, Description = func_config.get("Description", ""), Timeout = func_config.get("Timeout", 3), MemorySize = func_config.get("MemorySize", 128) )
迁移注意事项
- 预签名URL有效期仅10分钟,获取后需尽快使用,超时需重新调用
get_function获取新链接 - 跨账号迁移时,源函数配置中的执行角色ARN、环境变量关联的账号资源、层ARN都需要替换为目标账号下的对应资源,不可直接复用
- 如果函数绑定了层,需要单独导出层的部署包,在目标账号提前创建层后再关联到新函数
- 触发器配置(如API网关、S3事件触发等)不会随函数创建自动迁移,需要在目标账号单独配置
内容的提问来源于stack exchange,提问作者Andrew M
相关产品推荐
相关产品推荐

