而不是尝试直接在 cdk 堆栈中使用 amplify 提供的 env 参数。我最终像这样为每个环境创建了一个后端堆栈
new CdkBackendStack(app, "prod-stack", {
stackName: "prod-stack",
deploymentEnvironment: "prod",
});
new CdkBackendStack(app, "dev-stack", {
stackName: "dev-stack",
deploymentEnvironment: "dev",
});
然后我可以使用这个deploymentEnvironment 道具有条件地创建堆栈,每个堆栈都可以产生所需的输出,如下所示:
new cdk.CfnOutput(this, "ClusterSecretArn", {
value: serverlessCluster.secret?.secretArn || "",
});
现在我可以像这样合成两个堆栈并输出到自定义放大堆栈
cdk synth dev-stack > ../amplify/backend/cdk/dev/dev-cloudformation-template.yml
cdk synth prod-stack > ../amplify/backend/cdk/prod/prod-cloudformation-template.yml
按照amplify docs添加自定义堆栈,dev和prod堆栈都添加到backend-config.json:
"cdk": {
"dev": {
"providerPlugin": "awscloudformation"
},
"prod": {
"providerPlugin": "awscloudformation"
}
},
然后我可以通过像这样修改 backend-config.json 来使用其他放大堆栈中的输出:
"dependsOn": [
{
"category": "cdk",
"resourceName": "dev",
"attributes": [
"DatabaseName",
"SchemaName",
"ClusterArn",
"ClusterSecretArn"
]
},
{
"category": "cdk",
"resourceName": "prod",
"attributes": [
"DatabaseName",
"SchemaName",
"ClusterArn",
"ClusterSecretArn"
]
}
],
我可以像这样在堆栈中定义新参数
"DevDatabaseName": {
"Fn::GetAtt": [
"cdkdev",
"Outputs.DatabaseName"
]
},
"DevSchemaName": {
"Fn::GetAtt": [
"cdkdev",
"Outputs.SchemaName"
]
},
"DevClusterArn": {
"Fn::GetAtt": [
"cdkdev",
"Outputs.ClusterArn"
]
},
"DevClusterSecretArn": {
"Fn::GetAtt": [
"cdkdev",
"Outputs.ClusterSecretArn"
]
},
"ProdDatabaseName": {
"Fn::GetAtt": [
"cdkprod",
"Outputs.DatabaseName"
]
}
...
然后在 cloudformation 模板中我定义了一个条件:
"Conditions": {
"IsDevEnvironment": {
"Fn::Equals": [
{
"Ref": "env"
},
"dev"
]
}
}
最后,我需要这些参数:
"DbClusterIdentifier": {
"Fn::If": [
"IsDevEnvironment",
{
"Ref": "DevClusterArn"
},
{
"Ref": "ProdClusterArn"
}
]
},
我希望有一个更优雅的解决方案,但这是我能做到的最好的解决方案。