AWS CDK使用CfnOutput导出时丢失下划线,如何适配Amplify配置?
问题根因
CloudFormation 会自动归一化 CfnOutput 的逻辑ID(即构造函数第一个入参),移除所有非字母数字字符,你定义的aws_cognito_region会被自动转为awscognitoregion,这是导出JSON不符合预期的核心原因。
Amplify 分类范围配置规范要求:配置需按服务类别分层嵌套,例如认证相关的Cognito配置需要放在
Auth.Cognito层级下,对应字段使用驼峰命名,如region、userPoolId、userPoolClientId等。
方案1:CDK直接生成Amplify配置文件(最优)
完全避开CfnOutput的导出限制,在CDK栈部署阶段直接生成符合规范的配置文件:
import * as fs from 'fs'; import * as path from 'path'; import * as cdk from 'aws-cdk-lib'; // 其他资源引入 export class YourStack extends cdk.Stack { constructor(scope: cdk.App, id: string, props?: cdk.StackProps) { super(scope, id, props); // 你的其他资源定义,比如Cognito用户池、客户端等 // const userPool = new cognito.UserPool(this, 'UserPool'); // const userPoolClient = new cognito.UserPoolClient(this, 'UserPoolClient'); // 栈构造函数末尾添加以下代码 const amplifyConfig = { Auth: { Cognito: { region: cdk.Stack.of(this).region, // 按需添加其他配置项 // userPoolId: userPool.userPoolId, // userPoolClientId: userPoolClient.userPoolClientId, } } }; // 写入到前端项目的对应路径 const outputPath = path.resolve(__dirname, '../../debug-frontend/src/amplifyconfiguration.json'); fs.writeFileSync(outputPath, JSON.stringify(amplifyConfig, null, 2)); } }
不需要再使用--outputs-file参数,部署后直接生成可用的Amplify配置。
方案2:调整CfnOutput命名+转换脚本
如果需要保留CfnOutput导出能力,可按以下步骤操作:
- 调整CfnOutput的逻辑ID,避免使用特殊字符:
new cdk.CfnOutput(this, 'cognitoRegion', { value: cdk.Stack.of(this).region, })
- 部署导出后,执行转换脚本将导出的JSON转为Amplify要求的结构:
在前端项目根目录新建convert-cdk-output.js:
const fs = require('fs'); const cdkOutputs = require('./src/cdk-config.json'); const stackOutputs = cdkOutputs[Object.keys(cdkOutputs)[0]]; const amplifyConfig = { Auth: { Cognito: { region: stackOutputs.cognitoRegion, // 其他配置项对应映射即可 } } }; fs.writeFileSync('./src/amplifyconfiguration.json', JSON.stringify(amplifyConfig, null, 2));
- 可以把部署和转换合并为一条命令:
cdk deploy --outputs-file ../debug-frontend/src/cdk-config.json && cd ../debug-frontend && node convert-cdk-output.js
内容的提问来源于stack exchange,提问作者Armen Babakanian
相关产品推荐
相关产品推荐

