Amazon web services 如何检查CDK堆栈中的所有资源是否都具有某些属性?

Amazon web services 如何检查CDK堆栈中的所有资源是否都具有某些属性?,amazon-web-services,jestjs,aws-cdk,Amazon Web Services,Jestjs,Aws Cdk,我是AWS CDK的新手。我刚刚了解了aws cdk/assert模块,这是我深入测试驱动开发的一个很好的理由。我现在的主要困难是,我不完全理解如何测试某一类型的所有资源是否都通过了测试。我只能测试是否有任何资源匹配 现在我有一个expectCDK(stack).to(countResources('AWS::S3::Bucket',2))的组合,看看我是否生成了预期数量的Bucket,然后是两个单独的测试,以检查它们都是私有的和加密的 如果我使用下面的代码,它将通过,因为它只是查找任何具有匹配

我是AWS CDK的新手。我刚刚了解了aws cdk/assert模块,这是我深入测试驱动开发的一个很好的理由。我现在的主要困难是,我不完全理解如何测试某一类型的所有资源是否都通过了测试。我只能测试是否有任何资源匹配

现在我有一个
expectCDK(stack).to(countResources('AWS::S3::Bucket',2))
的组合,看看我是否生成了预期数量的Bucket,然后是两个单独的测试,以检查它们都是私有的和加密的

如果我使用下面的代码,它将通过,因为它只是查找任何具有匹配项的资源(二分之一)

expectCDK(stack).to(haveResource('AWS::S3::Bucket'){
“访问控制”:“专用”,
“BucketEncryption”:{
“服务器端加密配置”:[
{
“ServerSideEncryptionByDefault”:{
“SSE算法”:“AES256”
}
}
]
},
“版本配置”:{
“状态”:“已启用”
}
}))
现在只是两个测试桶,但我想稍后对IAM角色进行“最小特权原则”检查。考虑到解决方案可以有很多不同的角色,我不想跳过其中任何一个


有没有一种聪明的方法来测试我的所有存储桶是否都是私有的和加密的?我不介意编写测试合成模板的代码,但我觉得expectCDK离源代码更近了一点。

这可能已经晚了,但这可能正是您想要的:

    "AccessControl": "Private",
    "BucketEncryption": {
      "ServerSideEncryptionConfiguration": [
        {
          "ServerSideEncryptionByDefault": {
            "SSEAlgorithm": "AES256"
          }
        }
      ]
    },
    "VersioningConfiguration": {
      "Status": "Enabled"
    }
  }))

干杯

我能够以一点复杂的方式完成这项工作:

  test("no s3 buckets should be public", () => {
    expect(stack).not.toHaveResourceLike("AWS::S3::Bucket", {
      PublicAccessBlockConfiguration: ABSENT,
    });

    expect(stack).not.toHaveResourceLike("AWS::S3::Bucket", {
      PublicAccessBlockConfiguration: notMatching(
        exactValue({
          BlockPublicAcls: true,
          BlockPublicPolicy: true,
          IgnorePublicAcls: true,
          RestrictPublicBuckets: true,
        })
      ),
    });
  });

  test("all s3 buckets should be s3_managed encrypted", () => {
    expect(stack).not.toHaveResourceLike("AWS::S3::Bucket", {
      BucketEncryption: ABSENT,
    });

    expect(stack).not.toHaveResourceLike("AWS::S3::Bucket", {
      BucketEncryption: notMatching(
        exactValue({
          ServerSideEncryptionConfiguration: [
            {
              ServerSideEncryptionByDefault: {
                SSEAlgorithm: "AES256",
              },
            },
          ],
        })
      ),
    });
  });