从AWS CDK的AwsCustomResource调用Lambda响应中获取CertificateArn失败
解决AWS CDK中从Lambda返回CertificateArn的提取问题
问题场景
使用AWS CDK的AwsCustomResource调用Lambda生成ACM证书后,无法通过getResponseField正确提取返回的CertificateArn,尝试Payload.CertificateArn或Payload.body.CertificateArn路径均报错:
CustomResource attribute error: Vendor response doesn't contain Payload.CertificateArn attribute in object
核心原因
Lambda返回格式与CDK中字段提取路径不匹配,或返回内容未正确序列化/结构化。
解决方案
1. 修正Lambda返回格式
选择以下两种清晰的返回格式之一:
方案A(推荐:简化提取逻辑)
Lambda直接返回包含CertificateArn的顶级对象,无需多余包装:
exports.handler = async (event) => { // 生成ACM证书的业务逻辑,获取CertificateArn const certificateArn = "arn:aws:acm:us-east-1:080028499407:certificate/9b676b52-3e52-4ff5-8a7b-03cf57bd7303"; // 直接返回目标字段 return { CertificateArn: certificateArn }; };
方案B(保留HTTP状态码格式)
若需返回statusCode,确保body是JSON序列化后的字符串:
exports.handler = async (event) => { const certificateArn = "arn:aws:acm:..."; return { statusCode: 200, body: JSON.stringify({ CertificateArn: certificateArn }) }; };
2. 对应CDK提取代码
根据Lambda的返回格式,使用正确的字段路径:
对应方案A的CDK代码
直接提取顶级CertificateArn字段:
const certificateArn = generateCertificateCustomResource.getResponseField( "Payload.CertificateArn" ); new cdk.CfnOutput(this, "CertificateArn", { value: certificateArn, });
对应方案B的CDK代码
先提取body字符串,再用Fn.jsonParse解析为对象后获取目标字段:
const certificateBody = generateCertificateCustomResource.getResponseField( "Payload.body" ); const certificateArn = cdk.Fn.jsonParse(certificateBody).CertificateArn; new cdk.CfnOutput(this, "CertificateArn", { value: certificateArn, });
3. 验证技巧
若仍不确定字段路径,可先输出完整Payload结构确认:
new cdk.CfnOutput(this, "FullPayload", { value: generateCertificateCustomResource.getResponseField("Payload"), });
部署后查看输出的Payload内容,确认字段层级和大小写,再调整提取路径。
内容的提问来源于stack exchange,提问作者levansuper
相关产品推荐
相关产品推荐

