【发布时间】:2022-11-05 05:22:02
【问题描述】:
我有一个将文件写入 S3 的 lambda 函数,以及一个触发另一个 lambda 来处理文件的 EventBridge 规则。
第一个 lambda 使用 upload_file 和 ExtraArgs 来编写元数据、ContentType 和 ACL,如下所示(Python 代码):
extra_args = {
'Metadata': metadata, # dict[str, str]
'ContentType': 'video/mp4',
'ACL': 'public-read',
}
response = s3_client.upload_file(
Filename=file,
Bucket=bucket,
Key=key,
ExtraArgs=extra_args,
)
我第一次尝试添加 ACL 位时,由于我没有在角色中包含s3:PutAcl,它失败并出现权限错误。添加后,上传工作正常,元数据已设置,但 ACL 和 ContentType 尚未设置。
在本地进行测试,一切正常。我什至尝试假设 lambda 所扮演的角色,并且效果很好。
我设法通过更改文件上传到的文件夹来使其工作。这使我相信前缀(该文件夹名称)上的 EventBridge 规则在某种程度上导致了它的破坏。
我将 EventBridge 规则的前缀更改为其他内容,这修复了它。但是,我的工作流程当然需要 EventBridge 规则,因此我需要一种在不破坏 ACL/ContentType 设置的情况下恢复规则的方法。
S3 存储桶基础设施:
ClipsBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref ClipsBucketName
NotificationConfiguration:
EventBridgeConfiguration:
EventBridgeEnabled: true
执行角色:
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
[...]
Policies:
[...]
- PolicyName: allowS3
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:PutObject
- s3:PutObjectAcl
Resource:
- !Sub arn:aws:s3:::${ClipsBucketName}/*
EventBridge 规则:
{
"detail-type": ["Object Created"],
"source": ["aws.s3"],
"detail": {
"bucket": {
"name": ["bucket-name"]
},
"object": {
"key": [{
"prefix": "auto/"
}]
}
}
}
我试过了:
-
s3_client.upload_file的各种替代方案,例如使用 s3 资源方法、put_object等 - 上传不带 ACL 的文件,然后单独设置 ACL
- 将 EventBridge 规则详细信息更改为
Object ACL Updated
“本地运行”是指执行python lambda_function.py(可选--profile xxx,其中xxx 是具有lambda 角色ARN 的配置文件的名称)
我不明白 EventBridge 规则如何阻止设置 ACL/ContentType 而不会导致错误 - 当它没有写入 ACL 的权限时出现错误。我不明白它为什么在本地工作(即使写入设置了 EventBridge 规则的文件夹也是如此)。我也不知道调试这个的好方法。
【问题讨论】:
-
您能否分享更多项目,例如:您认为允许此操作的策略(或策略中的相关声明)、您在本地运行以测试的命令(猜测 awscli 或类似的)以及已完成的权限使用(如果是您的用户帐户,可能是“管理员”)
标签: amazon-web-services amazon-s3 boto3 acl aws-event-bridge