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

如何在AWS CDK v2(TypeScript)中正确解析JSON格式SSM字符串参数?

AWS CDK v2(TypeScript)如何在合成阶段解析SSM存储的JSON参数?

我在使用AWS CDK v2(TypeScript)时,需要通过SSM字符串参数中存储的JSON配置Lambda函数的内存、超时等属性。虽然参数是合法JSON,但合成阶段无法正确解析,求助解决方法。

当前配置

SSM参数以JSON格式存储为字符串类型:

{"small":256,"medium":512,"large":768,"extraLarge":1024}

参数创建代码:

new ssm.StringParameter(this, 'LambdaMemory', {
  parameterName: `${stage}-LambdaMemory`,
  stringValue: JSON.stringify({
    small: 256,
    medium: 512,
    large: 768,
    extraLarge: 1024
  }),
  type: ssm.ParameterType.STRING
});

已尝试的方法

方法1:直接JSON解析

const config = JSON.parse(
  ssm.StringParameter.valueForStringParameter(this, `${stage}-LambdaMemory`)
);

问题:合成阶段触发令牌解析错误,因为valueForStringParameter返回的是CloudFormation令牌,不是实际JSON字符串。

方法2:令牌感知字符串分割解析

const paramValue = ssm.StringParameter.valueForStringParameter(this, `${stage}-LambdaMemory`);
const config = {
  small: cdk.Token.asNumber(cdk.Fn.select(1, cdk.Fn.split('"small":', cdk.Fn.select(0, cdk.Fn.split(',"medium":', paramValue))))),
  medium: cdk.Token.asNumber(cdk.Fn.select(1, cdk.Fn.split('"medium":', cdk.Fn.select(0, cdk.Fn.split(',"large":', paramValue))))),
  // ...其他字段类似
};

问题:解析出无效数值(如-1.888e+289),因为字符串分割逻辑依赖JSON的具体格式(如键的顺序、无额外空格),容错性极差。

期望用法

希望能直接通过解析后的配置对象设置Lambda属性,比如:

const performWorkLambda = new NodejsFunction(this, 'PerformWorkLambda', {
  entry: join(__dirname, '../../src/lambdas/performWork/index.ts'),
  handler: 'handler',
  functionName: `${id}-PerformWorkLambda`,
  environment: {
    ...environment,
    PERSIST_QUEUE_URL: AUDIT_QUEUE_URL,
    UPDATE_QUEUE_URL,
    AUDIT_TABLE_NAME
  },
  role: lambdaExecutionRole,
  memorySize: lambdaMemoryConfig.large,
  timeout: cdk.Duration.seconds(
    lambdaTimeoutConfig.extraLarge
  )
})

解决方案

方案1:使用CDK内置的Fn.jsonParse(跨栈/外部参数场景)

CDK合成阶段中,SSM参数的值是CloudFormation令牌,必须用CloudFormation内置函数处理。cdk.Fn.jsonParse能在CloudFormation层面解析JSON字符串,同时兼容令牌:

// 获取SSM参数令牌
const lambdaMemoryParam = ssm.StringParameter.valueForStringParameter(this, `${stage}-LambdaMemory`);
// 解析JSON格式的参数值
const lambdaMemoryConfig = cdk.Fn.jsonParse(lambdaMemoryParam);

// 配置Lambda时,用Token.asNumber转换数值类型
const performWorkLambda = new NodejsFunction(this, 'PerformWorkLambda', {
  // 其他配置项...
  memorySize: cdk.Token.asNumber(lambdaMemoryConfig['large']),
  timeout: cdk.Duration.seconds(cdk.Token.asNumber(lambdaMemoryConfig['extraLarge']))
});

方案2:直接复用配置对象(同栈参数场景)

如果SSM参数和Lambda在同一个栈中创建,无需从SSM读取解析,直接复用创建参数时的配置对象即可:

// 先定义统一的配置对象
const memoryConfig = {
  small: 256,
  medium: 512,
  large: 768,
  extraLarge: 1024
};

// 创建SSM参数时使用该对象
new ssm.StringParameter(this, 'LambdaMemory', {
  parameterName: `${stage}-LambdaMemory`,
  stringValue: JSON.stringify(memoryConfig),
  type: ssm.ParameterType.STRING
});

// 直接用配置对象设置Lambda属性
const performWorkLambda = new NodejsFunction(this, 'PerformWorkLambda', {
  // 其他配置项...
  memorySize: memoryConfig.large,
  timeout: cdk.Duration.seconds(memoryConfig.extraLarge)
});

这种方式更简洁,完全避免了令牌解析问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 18:00:59