当前位置: 首页 > 知识库问答 >
问题:

AWS配置可以在启用对象锁定的情况下写入S3 bucket吗?

水品
2023-03-14

我已经设置了AWS Config[1],以便将配置项传递到S3 bucket。当S3 bucket没有启用对象锁定[2]时,一切工作都很好。但是,当bucket确实启用了对象锁定时,AWS配置无法创建其传递通道,并出现以下错误消息

错误:创建传递通道失败:不充分DeliveryPolicyException:到s3 bucket的传递策略不足:oss-devex-tf-module-aws-config-managed-bucket,无法写入bucket,前提是s3密钥前缀为'config-test'。

我已经搜索了这个异常,它通常与权限有关。在排除故障时,我为AWS配置分配了一个角色,该角色对S3 bucket具有完全权限(即对bucket和对象都具有S3:*,这比文档[3]中描述的要多),我没有在bucket上设置KMS Customer主密钥,甚至为了测试它而禁用了静止状态下的加密

由于审计和遵从性需求,我想使用对象锁定,但在AWS配置文档中找不到任何对它的引用。

编辑:我已经编写了一个terraform模块[4]来设置AWS配置。该模块中有几个示例运行良好,但仅当S3 bucket上没有启用对象锁定时。

[1]-https://docs.aws.amazon.com/config/latest/developerguide/whatisconfig.html

[2]-https://docs.aws.amazon.com/amazons3/latest/dev/object-lock.html

[3]-https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-policy.html

[4]-https://gitlab.com/open-source-devex/terraform-modules/aws/config-managed-rules

共有1个答案

冉丰茂
2023-03-14

为了再现你的情况,我做了以下几点:

  • 创建了一个Amazon S3 bucket,并激活了版本控制和对象锁定
  • 修改了已使用AWS配置的现有IAM角色,以包括新的bucket
  • 修改了AWS配置以写入新bucket(因为我已经用另一个bucket运行了配置)

然后我看到Config在bucket中创建了一个ConfigWritabilityCheckFile对象。

AWSLogs/123456789012/Config/ap-southeast-2/2019/9/17/ConfigSnapshot/123456789012_Config_ap-southeast-2_ConfigSnapshot_20190917T224217Z_ea973cd9-25ff-4cbe-97ca-84ef150a1981.json.gz
    null
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject*"
            ],
            "Resource": [
                "arn:aws:s3:::stack-lock/AWSLogs/123456789012/*"
            ],
            "Condition": {
                "StringLike": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}
  • 另外,它对许多服务都有一个“只读”策略(同样,我不知道为什么要这样做!)
 类似资料:
  • 我设置AWS CodeBuild将大量工件文件写入S3。CodeBuild yaml文件定义了哪些文件和CodeBuild项目设置定义了S3存储桶。而且一切正常。 当您从AWS CodePipeline触发AWS CodeBuild时,CodePipeline似乎忽略了AWS CodeBuild的工件设置,而是将工件强制放入codemipline S3桶中的zip文件中。 有没有一种方法可以使用C

  • 问题内容: 我试图将 1,500,000 条记录插入表中。在插入过程中遇到表锁定问题。所以我想出了下面的批处理插入。 我在表上有聚簇索引。部分只是为了限制插入的记录再次插入表中 我做对了,这样可以避免表锁定吗?还是有更好的方法。 注意: 批处理和不批处理插入所花费的时间或多或少相同 问题答案: 锁升级根本不可能与语句的一部分有关。 插入大量行是自然的结果 当使用ALTER TABLE SET LO

  • 问题内容: 我想将实时生产数据库复制到本地开发数据库中。有没有一种方法可以不锁定生产数据库? 我目前正在使用: 但是它在运行时锁定每个表。 问题答案: 该选项有效吗? 根据手册页,如果要转储InnoDB表,则可以使用以下选项: 对于 innodb DB :

  • 问题内容: 我在使用Python模块时遇到了一些困难。我了解到,用C编写的内置模块就像Python解释器的一部分,因此它们属于内置命名空间,因此可供程序员轻松使用,因此不需要导入。那是否仅限于那些模块,意味着所有其他非内置的,用Python编写的标准库模块都需要导入才能使用? 谢谢。 问题答案: TLDR:使用前,您必须导入每个模块,除外。 就Python而言,有两种不同的“ builtin”:

  • 我的问题是,有什么方法可以让我序列化/反序列化一个名为onlinePlayers的列表,该列表引用了“John1”的实例,它也碰巧在List allPlayers中,而不重复“John1”,同时仍然引用那个对象? 我猜当我反序列化allPlayers时,它将创建不同于原始对象的对象,所以onlinePlayers在反序列化后不可能仍然引用相同的对象。我是否应该编写一个自定义方法,在反序列化后将新创

  • 问题内容: 我需要在Linux / OSX终端下使用“干净的” shell(例如bash),而无需任何用户配置,但是每次启动时,它都会从某些文件(例如〜/ .bashrc)中读取配置信息。每当我需要“干净”的外壳时,我都可以修改该文件,并在完成后将其还原,但是有没有更简单的方法来执行此操作,例如命令? 问题答案: 您可以传递和命令行选项: 您可以在手册页中找到有关这些选项的文档。