Chu*_*ket 5 amazon-s3 amazon-web-services amazon-iam boto3 aws-lambda
我"errorMessage": "An error occurred (403) when calling the HeadObject operation: Forbidden"在尝试打电话时收到消息s3.download_file(请参阅下面的代码)。
我看过很多帖子,但似乎没有一个是从 AWS Lambda 调用的,而这正是我的问题所在。
我的代码在我的机器上本地运行,所以我猜测问题涉及 Lambda。这个Lambda函数最终会被S3事件触发,但在测试过程中,它不起作用。
我的 IAM 用户拥有对 S3 和 Lambda 的完全访问权限。
AWS Lambda函数代码:
import json
import boto3
import logging
log = logging.getLogger()
log.setLevel(logging.INFO)
s3 = boto3.client('s3')
def lambda_handler(event, context):
document_name = event['Records'][0]['s3']['object']['key']
bucket = event['Records'][0]['s3']['bucket']['name']
log.info('Performing stuff on {}/{}'.format(bucket, document_name))
# download the file
s3.download_file(
Bucket=bucket,
Key=document_name,
Filename=document_name
)
log.info('here it is!')
return event
Run Code Online (Sandbox Code Playgroud)
(我什至尝试显式输入信息s3.download_file而不是从 中获取信息event,但无济于事。日志消息确认它是正确的路径。)
测试事件配置中传递的参数:
...
"s3": {
...
"bucket": {
"name": "bucket-name",
...
"object": {
"key": "filename.pdf",
Run Code Online (Sandbox Code Playgroud)
本地机器上的代码:
import boto3
s3 = boto3.client('s3')
s3.download_file(
Bucket='bucket-name',
Key='filename.pdf',
Filename='filename.pdf'
)
Run Code Online (Sandbox Code Playgroud)
我希望下载文件时不会出现错误,就像我在机器上测试代码时一样。
我有类似的问题,这是我的解决方案。当您在使用 AWS SDK 或 CLI 时遇到 403 错误时,可能是由于权限和策略所致。
您可能已向 Lambda 函数授予存储桶的完整 S3 权限,但 lambda 无权访问存储桶内的对象,除非您明确指定。
只需稍微改变一下您的政策即可解决问题。
# Change from this:
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::bucket-name"
}
# To this:
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket-name/*",
"arn:aws:s3:::bucket-name"
]
}
Run Code Online (Sandbox Code Playgroud)
确保此策略已添加到您的 Lambda 函数角色。
PS:要配置 Lambda 角色,您需要转到 Lambda 函数页面,然后在“配置”选项卡下,您将找到“权限”。单击“权限”,然后在右侧单击“执行角色”部分内的角色名称。它将打开用于修改 Lambda 角色的所需页面。然后,您可以编辑当前策略之一或添加具有权限的新策略。
| 归档时间: |
|
| 查看次数: |
7323 次 |
| 最近记录: |