You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过CDK单元测试验证堆栈包含指定Logical ID的资源?

验证CDK堆栈模板中指定Logical ID的存在

问题背景

我正在重构一个已达资源上限的TypeScript CDK堆栈,其中包含有状态资源,必须确保重构后的堆栈引用原有资源而非创建新资源,避免资源孤立或删除。为此需要编写单元测试,断言堆栈生成的模板包含一组指定的Logical ID,但之前仅知道如何断言资源属性存在,不清楚如何验证Logical ID的存在,原测试代码无法正常工作。

解决方案

CloudFormation模板中的Logical ID是Resources对象的键,而非资源属性,因此不能用hasResourceProperties来验证。正确的做法是直接获取模板中所有资源的Logical ID集合,再断言预期ID是否存在。如果需要更严格的验证,还可以同时检查对应资源的类型是否符合预期。

修改后的测试代码

describe('MyStack', () => {
  test('synthesizes with expected logical IDs', () => {
    const app = new cdk.App();
    const stack = new MyStack(app, 'MyStackDev', {
      deploymentEnvironment: 'dev',
    });

    const template = Template.fromStack(stack);
    // 获取堆栈所有资源,键为Logical ID,值包含资源类型等信息
    const stackResources = template.toJSON().Resources as Record<string, { Type: string }>;
    const existingLogicalIds = Object.keys(stackResources);

    const expectedLogicalIds = [
      'apiGatewayDev',
      'lambdaDev',
      'webSocketLambdaDev',
      'devLambdaWithConcurrentProvisioning',
      'neptuneBastionHostDev',
      'neptuneClusterDev',
      'auroraClusterDev',
      'sevenndevimages',
      'sevenndevprivate',
      'sparkQueryLogs',
      'shareLinks',
      'webSocketInstances',
      'flowInteractionLog',
    ];

    // 验证每个预期的Logical ID都存在于堆栈资源中
    expectedLogicalIds.forEach(logicalId => {
      expect(existingLogicalIds).toContain(logicalId);
    });

    // 可选:针对特定Logical ID验证对应的资源类型(按需添加)
    expect(stackResources['lambdaDev'].Type).toBe('AWS::Lambda::Function');
    expect(stackResources['apiGatewayDev'].Type).toBe('AWS::ApiGateway::RestApi');
    expect(stackResources['neptuneClusterDev'].Type).toBe('AWS::Neptune::DBCluster');
  });
});

代码说明

  1. 通过template.toJSON().Resources获取堆栈的所有资源对象,其中每个键就是对应的Logical ID。
  2. 使用Object.keys()提取所有存在的Logical ID,再用toContain断言每个预期ID都在其中。
  3. 可选的类型验证可以进一步确保资源的正确性,避免出现Logical ID存在但资源类型不符的情况,这对有状态资源的重构尤为重要。

内容的提问来源于stack exchange,提问作者ashissl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 03:45:13