是否可以为特定的 CDK 环境自动生成 cdk.context.json 文件?

hal*_*fer 7 amazon-web-services aws-cdk

我继承了一个小型 CDK 项目,其中包含一个cdk.context.json文件:

{
  "vpc-provider:account=9015xxxxxxxx:filter.tag:Name=preprod-eu-west-1:region=eu-west-1:returnAsymmetricSubnets=true": {
    "vpcId": "vpc-0d891xxxxxxxxxxxx",
    "vpcCidrBlock": "172.35.0.0/16",
    "availabilityZones": [],
    "subnetGroups": [
      {
        "name": "Private",
        "type": "Private",
        "subnets": [
          {
            "subnetId": "subnet-0ad04xxxxxxxxxxxx",
            "cidr": "172.35.a.0/22",
            "availabilityZone": "eu-west-1b",
            "routeTableId": "rtb-0fee4xxxxxxxxxxxx"
          },
          {
            "subnetId": "subnet-08598xxxxxxxxxxxx",
            "cidr": "172.35.z.0/22",
            "availabilityZone": "eu-west-1c",
            "routeTableId": "rtb-0f477xxxxxxxxxxxx"
          }
        ]
      },
      {
        "name": "Public",
        "type": "Public",
        "subnets": [
          {
            "subnetId": "subnet-0fba3xxxxxxxxxxxx",
            "cidr": "172.35.y.0/22",
            "availabilityZone": "eu-west-1b",
            "routeTableId": "rtb-02dfbxxxxxxxxxxxx"
          },
          {
            "subnetId": "subnet-0a3b8xxxxxxxxxxxx",
            "cidr": "172.35.x.0/22",
            "availabilityZone": "eu-west-1c",
            "routeTableId": "rtb-02dfbxxxxxxxxxxxx"
          }
        ]
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这对于它连接到的预生产环境来说效果很好,但我现在需要部署到生产环境。我可以手动生成相同的文件,但这感觉像是浪费时间 - 我怀疑这是一个生成的文件。

我已经尝试过cdk context --build,希望它能生成这个文件,但似乎不会——它似乎只是为了回显已经存在的预生成文件。我该怎么做才能避免手动构建(并避免猜测它想要哪些 VPC 和子网)?

gsh*_*hka 15

该文件是为您的 CDK 堆栈部署到的任何环境生成的。

如果您想使用临时环境和生产环境的值填充它,您只需cdk synth在激活生产 AWS 凭证后运行即可(--profile例如,使用 )。这将使用新值(除了已有的值之外)填充上下文,并且您应该将这些更改提交到 VCS。

建议将该文件专门保存在 VCS 中,以避免在每次部署时重新填充该文件。这使得您的 CDK 应用程序具有确定性。

最佳实践来看:

提交 cdk.context.json 以避免不确定行为

AWS CDK 包含一种称为上下文提供程序的机制,用于记录非确定性值的快照,从而允许未来的综合操作生成完全相同的模板。新模板中的唯一更改是您在代码中所做的更改。当您使用构造的 .fromLookup() 方法时,调用的结果将缓存在 cdk.context.json 中,您应该将其与其余代码一起提交到版本控制,以确保 CDK 应用程序的未来执行使用相同的结果价值。

更好的组织方法是使您的堆栈特定于环境 - 也就是说,为您想要部署到的每个环境实例化您的顶级堆栈或阶段一次,并指定 prop env。部署则变为cdk deploy MyStaginStackcdk deploy MyProductionStack。尽管这与问题无关。