跨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
相关产品推荐
相关产品推荐

