如何验证堆栈中的 SSMParameter 创建?

How to verify SSMParameter creation in stack?

我正在使用 cdk 库创建 aws 资源并且能够成功创建资源。现在我想写一个测试用例来验证CloudFormation的正确性。

以下是创建 SSM 参数的一段代码。

export class SSMParamaters extends cdk.Construct {

  constructor(scope: cdk.Construct, id: string, props: SSMParamatersProps) {
    super(scope, id);
    
    const param = new ssm.StringParameter(this, "testSSM", {
      parameterName: props.envName,
      stringValue: String(props.envValue),
    });
  }
}

下面是同样的测试。但不确定这是测试它的正确方法。 有人可以帮我解决这个问题吗?

test('Test sqs type ssmParameter', () => {
  
  const app = new App();
  const testSqsStack = new Stack(app, 'TestSQSStack');
  let ssmParam = new SSMParamaters(test, 'test-param',
    {
      envName: 'Home',
      envValue: '/home/test'
    });

  expect(() => ssmParam).toHaveResource("test-sqs-param");
  }

CDK 的 testing constructs 让我们针对 synth-ed JSON CloudFormation 堆栈模板输出进行断言。资源类型 (AWS::SSM::Parameter) 和 属性 名称(Value,而不是 value!)需要匹配模板的 JSON 格式。

例如,cdk.out 中的堆栈模板输出将包含如下内容:

// MyStack.template.json
{
  "Resources": {
    "FooParameter23C8BF74": {
      "Type": "AWS::SSM::Parameter",
      "Properties": {
        "Type": "String",
        "Value": "/home/test",
        "Name": "Home"
      },

使用 OP 的 @aws-cdk/assert 模块语法,您断言 ssm.Parameter 的存在,如下所示:

// MyStack.test.ts
test('test SSM', () => {
  const app = new cdk.App();
  const stack = new SimpleSsmStack(app, 'SsmStack', {});

  // matches if present in the JSON stack template
  expect(stack).toHaveResource('AWS::SSM::Parameter');

  // optionally match specific resource properties
  expect(stack).toHaveResource('AWS::SSM::Parameter', { Name: 'Home', Value: '/home/test' });
});

注意:@aws-cdk/assert模块is deprecated. The current assertions module is aws-cdk-lib/assertions,语法不同:

// MyStack.test.ts
import { Template } from 'aws-cdk-lib/assertions';
// ...
  const template = Template.fromStack(stack);
  template.hasResourceProperties('AWS::SSM::Parameter', { Name: 'Home', Value: '/home/test' });