【问题标题】:Eventbridge rule causing ACL setting on S3 file to failEventbridge 规则导致 S3 文件上的 ACL 设置失败
【发布时间】:2022-11-05 05:22:02
【问题描述】:

我有一个将文件写入 S3 的 lambda 函数,以及一个触发另一个 lambda 来处理文件的 EventBridge 规则。

第一个 lambda 使用 upload_fileExtraArgs 来编写元数据、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


【解决方案1】:

我会将其归档在“问题错误”下。

事实证明,第二个 lambda 正在将文件复制到自身上(作为无法轻松添加元数据的一种解决方法),这意味着 ContentType 和 ACL 没有被保留。

我没有想到问题可能会发生事件桥触发器。我假设我立即查看文件,发现它没有设置 ContentType 和 ACL,这些属性的设置并没有首先完成,而实际上它是 - 但立即被第二个 lambda 覆盖。

【讨论】:

    猜你喜欢
    • 2021-04-20
    • 2014-03-28
    • 2015-04-19
    • 1970-01-01
    • 2020-10-11
    • 2014-02-26
    • 2016-03-09
    • 2021-10-08
    • 2021-08-10
    相关资源
    最近更新 更多