断言资源没有属性

Assert resources do not have properties

您好,我想知道是否有推荐的模式来断言某些资源在 CDK 中没有属性。例如,如果您正在定义 IAM 策略,并且您希望在使用 CDK 中的 /assertions 包的测试中强制不定义通配符,那么“正确”的方法是什么?根据 Matcher.objectLike 创建您自己的匹配器,它执行相反的操作?

示例 IAM 定义

// this would be fine
const secretsManagerReadAccess = new iam.PolicyStatement({
      actions: ['SecretsManager:GetSecretValue'],
      resources: ['arn:aws:secretsmanager:us-east-1:ACCOUNTID:secret:SECRET_NAME'],
});
// this should blow up in a test
const secretsManagerWildcardAccess = new iam.PolicyStatement({
      actions: ['SecretsManager:*'],
      resources: ['arn:aws:secretsmanager:us-east-1:ACCOUNTID:secret:*'],
});
// the worst possible, probably not written correctly but you get the idea
const everything = new iam.PolicyStatement({
      actions: ['*:*'],
      resources: ['arn:aws:*:us-east-1:ACCOUNTID:*:*'],
});

编辑:我想更好的表达方式是,您如何将 CDK 定义中的某些模式列入黑名单?

您可以链接 Matchers,并且可以使用 Captures 构建模式过滤器。

const actionCapture = new Capture();
template.hasResourceProperties(
  "AWS::IAM::Role",
  Match.not(Match.objectLike({
    PolicyDocument: {
      Statement: [
        {
          Action: actionCapture,
        },
      ],
    },
  }))
);
expect(actionCapture.asString()).toEqual(expect.not.stringContaining("*"));

有关更多示例,请参阅 Developer Guide