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

Python版AWS CDK读取SSM存储的ARN时报格式错误如何解决

问题原因

这个报错和SSM参数名长度没有关系,核心是ssm.StringParameter.value_from_lookup()的运行机制导致的:

  • 这个方法是CDK合成阶段的上下文查询逻辑,首次执行合成/部署操作时,如果本地CDK上下文缓存(存储在cdk.context.json文件中)没有对应SSM参数的值,会直接返回格式为dummy-value-for-{参数名}的占位字符串,不会在首次执行时就拉取到真实的SSM参数值。
  • 你拿到的dummy-value-for-test-value-for-my-job-executor-new-function-lambda-arn就是这个占位值,它本身不是合法的ARN格式,直接传入Function.from_function_arn时会触发ARN格式校验,直接抛出你看到的错误。
  • 这个方法的设计逻辑是首次合成返回占位符后,后台异步拉取真实SSM值写入缓存,第二次合成才会使用真实值,但因为首次合成阶段占位符就触发了格式校验错误,流程直接中断,根本走不到第二次合成的步骤。
修复方案

根据你的使用场景选对应方案即可:

方案1:使用部署期动态引用(推荐,无缓存一致性问题)

放弃合成期lookup的方法,改用CDK封装的CloudFormation动态引用能力,这个方式不会在合成阶段解析SSM值,而是把SSM参数的引用直接写入生成的CloudFormation模板,部署时由CloudFormation服务主动拉取SSM参数值,完全不会触发合成阶段的格式校验问题。
代码示例:

from aws_cdk import aws_ssm as ssm
# 注意参数名要写完整路径,标准SSM参数通常以/开头,按你实际存储的参数全名替换即可
my_arn = ssm.StringParameter.value_for_string_parameter(
    self,
    "test-value-for-my-job-executor-new-function-lambda-arn"
)
self.scan_pre_process = _lambda.Function.from_function_arn(self, "my-job-executor", my_arn)

使用注意:

  • 执行CDK部署的角色需要拥有对应SSM参数的ssm:GetParameter权限
  • 如果后续SSM参数值更新,下次部署时CloudFormation会自动拉取最新值,不需要手动刷新缓存

方案2:预拉取上下文缓存(适合需要在合成阶段拿到真实值做逻辑判断的场景)

如果你需要在合成代码里基于SSM参数值做分支判断等逻辑,必须在合成阶段拿到真实值,可以先执行命令预拉取所有上下文值到本地缓存,再执行合成/部署:

# 清空旧的上下文缓存,重新拉取所有需要的资源信息
cdk context --clear && cdk synth

执行该命令时CDK会主动用你本地配置的AWS凭证拉取对应SSM参数的真实值,写入cdk.context.json缓存文件,后续再执行synth、deploy操作时会直接读取缓存里的真实ARN,不会返回dummy占位符。
使用注意:

  • 执行命令前要确认本地AWS凭证配置正确,拥有SSM参数的读权限
  • 如果后续SSM参数值发生变更,需要重新执行上述命令刷新缓存,否则CDK会一直使用缓存的旧值

方案3:临时关闭ARN校验(仅调试用,不推荐生产环境使用)

如果只是临时调试想跳过首次合成的格式校验,可以关闭ARN导入时的格式校验,但这种方式会把参数校验推迟到部署阶段,容易因为参数值错误导致部署失败,不建议生产环境使用:

from aws_cdk import ArnFormat
self.scan_pre_process = _lambda.Function.from_function_arn(
    self,
    "my-job-executor",
    my_arn,
    arn_format=ArnFormat.NO_RESOURCE_NAME
)

内容的提问来源于stack exchange,提问作者back-new

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:06:34