如何在 terraform 语句中启用 s3 复制存储桶权限

Posted

技术标签:

【中文标题】如何在 terraform 语句中启用 s3 复制存储桶权限【英文标题】:How to enable s3 Copy Bucket Permissions in Terraform statement 【发布时间】:2022-01-07 11:23:58 【问题描述】:

我的目标是将数据从一组 s3 存储桶复制到主日志记录帐户存储桶中。每次我尝试执行:

aws s3 cp s3://sub-account-cloudtrail s3://master-acccount-cloudtrail --profile=admin;

我明白了

(AccessDenied) when calling the CopyObject operation: Access Denied`

我看过这篇文章: How to fix AccessDenied calling CopyObject

我正在尝试将存储桶权限添加到 terraform data aws_iam_policy_document。声明是这样写的

data aws_iam_policy_document s3 
  version    = "2012-10-17"
  
  statement 
    sid = "CopyOobjectPermissions"
    effect = "Allow"
    principals 
      type        = "AWS"
      identifiers = ["arn:aws:iam::$data.aws_caller_identity.current.account_id:role/ops-mgmt-admin"]
    
    actions   = ["s3:GetObject","s3:PutObject","s3:PutObjectAcl"]
    resources = ["$aws_s3_bucket.nfcisbenchmark_cloudtrail.arn/*"]
  

  statement 
    sid = "CopyBucketPermissions"
    actions = ["s3:ListBucket"]
    effect = "Allow"
    principals 
      type = "AWS"
      identifiers = ["arn:aws:iam::$data.aws_caller_identity.current.account_id:role/ops-mgmt-admin"]
    
    resources = ["$aws_s3_bucket.nfcisbenchmark_cloudtrail.arn/*"]
  


我的目标是限制从子账户到主账户的角色的权限。我的具体问题是需要添加哪些权限才能启用复制权限?

预期: Terraform 计划运行成功

实际:

│ Error: Error putting S3 policy: MalformedPolicy: Action does not apply to any resource(s) in statement

对此的任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

有两点要提:

    在您的第二条语句中,资源错误,这就是您收到MalformedPolicy 错误的原因。应该是:
resources = [aws_s3_bucket.nfcisbenchmark_cloudtrail.arn]
    小心identifier。在这一点上,我不确定您的存储桶是否在不同的帐户中。如果是,则标识符中的account_id 应引用源帐户。 data.aws_caller_identity.current.account_id 返回 Terraform 进行身份验证的帐户 ID,通常是您正在部署资源的帐户(目标帐户)。如果您不进行跨帐户复制,那么应该没问题。

此外,在跨账户访问的情况下,ops-mgmt-admin 角色应该应用一个策略,该策略允许访问获取/列出/上传对象到 S3 存储桶。

【讨论】:

以上是关于如何在 terraform 语句中启用 s3 复制存储桶权限的主要内容,如果未能解决你的问题,请参考以下文章

启用 S3 存储桶对象级别事件到 CloudTrail 跟踪并将对象级别事件转发到 terraform 中的 CloudWatch 日志组?

需要通过 Terraform 在 AWS RDS 中启用备份复制功能

如何在 Terraform 变量中连接 S3 存储桶名称并将其传递给主 tf 文件

带有 S3 后端的 Terraform 如何发现所有工作区?

为 GCS 与 Terraform 启用“互操作”访问?

如何将旧 S3 存储桶中的 Terraform 状态移动到新的 S3 存储桶?