【问题标题】:cdk parameter ref as json during synthesizecdk 参数 ref 在合成期间作为 json
【发布时间】:2021-10-25 04:18:03
【问题描述】:

我正在使用 AWS Amplify 以及使用 AWS CDK 生成的自定义堆栈。在此堆栈中,我尝试在推送我的云形成模板时使用 Amplify CLI 提供的 env 参数。例如,我试图根据env 参数使ServerlessCluster clusterIdentifier 属性动态化。

我尝试了几种变体,但似乎无法绕过接收令牌而不是期望的输出:

{
  "Ref": "env"
}

在合成期间是否有任何逃生舱让 CDK 输出上述 Ref JSON?

注意:我必须运行 cdk synth -o amplify/backend/custom/cdk 才能让 amplify 继续控制部署。

【问题讨论】:

  • 也许如果你添加一些代码会更容易理解你想要实现的目标。
  • 我添加了一个答案,显示了我最终得到的解决方案......现在:)

标签: amazon-web-services aws-cdk


【解决方案1】:

而不是尝试直接在 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"
    }
  ]
},

我希望有一个更优雅的解决方案,但这是我能做到的最好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 2015-10-02
    • 2021-12-14
    • 2023-04-06
    • 2017-03-19
    相关资源
    最近更新 更多