You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨AWS账号通过Boto3部署Lambda时无法引用公开Layer ARN

问题

我有一个公开ARN的Lambda Layer,想在部署Lambda函数时使用,相关代码片段如下:

LAMBDA_ARN_LAYER = "arn:aws:lambda:eu-north-1:012345678901:layer:canedge-influxdb-writer-2:5"

lambda_client = session.client("lambda")

lambda_client.create_function(
    FunctionName=LAMBDA_FUNCTION_NAME,
    Runtime=PYTHON_BUILD,
    Role=LAMBDA_ROLE_ARN,
    Handler=LAMBDA_HANDLER,
    Code={"ZipFile": open(f"{LAMBDA_ZIP_FILE}.zip", "rb").read()},
    Timeout=180,
    MemorySize=1024,
    Layers=[LAMBDA_ARN_LAYER],
)

用创建该Layer的账号运行代码一切正常,但切换到其他账号运行时,调用CreateFunction操作报错:

An error occurred (AccessDeniedException) when calling the CreateFunction operation: User: arn:aws:iam::XXX:user/XXX is not authorized to perform: lambda:GetLayerVersion on resource: arn:aws:lambda:eu-north-1:012345678901:layer:canedge-influxdb-writer-2:5 because no resource-based policy allows the lambda:GetLayerVersion action

奇怪的是,同一用户手动给Lambda函数添加该Layer却能成功,说明Layer已经设为公开。创建Layer时,我通过Python脚本调用AWS CLI执行了以下命令:

aws lambda publish-layer-version --region {region} --layer-name {layer_name} --description "{layer_description}" --cli-connect-timeout 6000 --license-info "MIT" --zip-file "fileb://canedge-influxdb-writer.zip" --compatible-runtimes python3.9

aws lambda add-layer-version-permission --layer-name {layer_name} --version-number {version} --statement-id allAccountsExample --principal * --action lambda:GetLayerVersion --region {region}

部署用的用户拥有默认管理员权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "*",
            "Resource": "*"
        }
    ]
}

请问我遗漏了什么配置?

原因及解决方法

最可能的问题是你没有为代码中使用的Layer版本(版本5)添加公开权限,而是为其他版本配置了权限。手动添加成功是因为你选对了有权限的版本,而代码中指定的版本5没有对应的资源策略。

验证步骤

执行以下命令,查看版本5的Layer权限策略:

aws lambda get-layer-version-policy --layer-name canedge-influxdb-writer-2 --version-number 5 --region eu-north-1

如果返回结果为空或没有允许*执行lambda:GetLayerVersion的语句,说明权限未正确添加到该版本。

修复操作

为版本5重新添加公开权限,注意statement-id要唯一(避免和之前的重复):

aws lambda add-layer-version-permission --layer-name canedge-influxdb-writer-2 --version-number 5 --statement-id allAccountsExample-v5 --principal * --action lambda:GetLayerVersion --region eu-north-1

额外排查点

  • 检查脚本中{version}变量的值是否确实对应版本5,避免因变量赋值错误导致权限加错版本。
  • 确认没有SCP(服务控制策略)限制跨账号访问Lambda Layer,但手动操作成功基本可以排除这个可能。

内容的提问来源于stack exchange,提问作者mfcss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:30:41