【问题标题】:Amazon S3 Access Denied when calling aws lambda publish-layer-version CLI调用 aws lambda publish-layer-version CLI 时 Amazon S3 访问被拒绝
【发布时间】:2021-12-11 22:39:32
【问题描述】:

我尝试使用我的个人 aws 凭证在我的本地控制台中运行 aws lambda publish-layer-version 命令行,但是对于存储 zip 层的存储桶,我遇到了 Amazon S3 Access Denied 错误。

aws lambda publish-layer-version --layer-name layer_name --content S3Bucket=bucket_name,S3Key=layers/libs.zip
An error occurred (AccessDeniedException) when calling the PublishLayerVersion operation: Your access has been denied by S3, please make sure your request credentials have permission to GetObject for {URI of layer in my S3 bucket}. S3 Error Code: AccessDenied. S3 Error Message: Access Denied

当我在同一个存储桶中运行aws cp 命令时,一切正常

aws s3 cp s3://bucket_name/layers/libs.zip libs.zip

所以我假设 aws lambda 命令行使用的角色与我运行 aws cp 命令行时使用的角色不同?或者也许它使用了另一种我不知道的机制。但我在 AWS 文档中找不到任何关于它的信息。 我刚刚读到 AWS 可以返回 403 它找不到文件。所以也许这可能是命令语法的问题?

感谢您的帮助。

【问题讨论】:

  • 你能分享你运行发布的完整命令吗?它看起来像这样吗: aws lambda publish-layer-version --layer-name hello-world-layer --description "Hello World Layer" --license-info "MIT" --content S3Bucket=lambda-layers- us-east-1-1234567890,S3Key=hello-world-layer.zip
  • aws lambda publish-layer-version --layer-name get_paying_user_classification --content S3Bucket=bucket-name,S3Key=layers/get_paying_user_classification_python_libs.zip
  • 任何想法@TobievanderMerwe ?
  • 您能否提供有效的s3 cp 命令?
  • 还有 - 您对存储桶有任何资源策略吗?

标签: amazon-web-services aws-lambda amazon-iam aws-cli


【解决方案1】:

对于您对publish-layer-version 的调用,您可能需要用3 部分指定--content 参数:

S3Bucket=string,S3Key=string,S3ObjectVersion=string

您似乎缺少S3ObjectVersion。我不知道 AWS 用于评估和应用该参数的各个部分的行为是什么,但它可能会尝试做更多的事情,因为未指定版本并因此给您该错误。或者它可能返回一个不完全正确且具有误导性的错误代码。尝试添加 S3ObjectVersion 并告诉我你得到了什么。

否则,AWS 权限评估可能会很复杂。我喜欢下面的AWS diagram,所以跟踪权限问题是一个很好的方法,但我怀疑在这种情况下 AccessDenied 是一个红鲱鱼:

【讨论】:

  • 感谢您的回答。你可以在这里找到一个例子:awscli.amazonaws.com/v2/documentation/api/latest/reference/… 没有 S3ObjectVersion 参数。我的存储桶中没有启用对象版本控制:/
  • 但我仍然尝试:调用 PublishLayerVersion 操作时发生错误 (AccessDeniedException):您的访问已被 S3 拒绝,请确保您的请求凭据具有 GetObjectVersion [...] 的权限。 S3 错误代码:拒绝访问。 S3 错误消息:访问被拒绝
  • 您的凭证是否有GetObjectVersion 权限?这至少与您之前看到的GetObject 权限不同。
  • 您是否尝试过使用新存储桶的过程?是否有任何 SCP 被应用?在这一点上,我认为您可能需要进行实验以尝试缩小范围以隔离它。您可以使用不同的存储桶运行测试以尝试排除基于资源的问题,您可以尝试使用不同的凭据来尝试排除与主体相关的问题等。
  • 您还可以查看CloudTrail 日志以查看PublishLayerVersion 的任何事件,以了解事件显示的凭据和其他详细信息吗?
【解决方案2】:

您的 Lambda 没有权限 (S3:GetObject)。 尝试运行aws sts get-caller-identity。这将为您提供命令行使用的 IAM 角色。 转到 IAM 仪表板,检查与您的 Lambda 执行关联的此角色。如果您使用 AWS 向导,它会自动创建一个名为 oneClick_lambda_s3_exec_role 的角色。单击显示策略。它看起来像附加的图像。确保列出了S3:GetObject

Also, AWS returns 403 (access denied) when the file does not exist. Be sure the target file is in the S3 bucket.

【讨论】:

  • 我的层没有(还)附加到特定的 lambda 函数,所以“你的 Lambda 没有 S3:Getobject 权限”在这种情况下没有意义吗?
  • 我运行了aws sts get-caller-identity,它显示了我的个人信誉,我拥有 S3:Getobject 权限。此外,如果我从这个特定的存储桶和键名运行aws s3 cp 到我的本地文件,它可以完美运行。
  • user@ubuntu:$ aws lambda publish-layer-version --layer-name test \ --content S3Bucket=bucket_name,S3Key=layers/test.zip 调用时发生错误 (AccessDeniedException) PublishLayerVersion 操作:您的访问已被 S3 拒绝,请确保您的请求凭证对 bucket_name/layers/test.zip 的 GetObject 具有权限。 S3 错误代码:拒绝访问。 S3 错误消息:拒绝访问 make: *** [Makefile:24: publish-layer-version] 错误 255
  • 但是;用户@ubuntu:$ aws s3 cp s3://bucket_name/layers/test.zip。下载:s3://bucket_name/layers/test.zip 到 ./test.zip
  • 请不要将代码发布为屏幕截图,而是格式正确的代码块。
猜你喜欢
  • 2020-09-30
  • 2016-09-29
  • 2018-09-14
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2021-05-19
相关资源
最近更新 更多