如何使用 cdk 合成器摆脱 BootstrapVersion 参数?

Fel*_*lix 9 amazon-web-services aws-cdk

使用 aws cdk 生成 cloudformation 模板时:

\n
cdk synth\n
Run Code Online (Sandbox Code Playgroud)\n

我总是得到:

\n
  "Parameters": {\n    "BootstrapVersion": {\n      "Type": "AWS::SSM::Parameter::Value<String>",\n      ...\n
Run Code Online (Sandbox Code Playgroud)\n

这里是代码:

\n
import * as cdk from 'aws-cdk-lib';\nimport { Stack } from 'aws-cdk-lib';\nimport { Construct } from 'constructs';\nimport * as sqs from 'aws-cdk-lib/aws-sqs';\n\nexport class MyStack extends Stack {\n  constructor(scope: Construct, id: string) {\n    super(scope, id);\n    \n    const queue = new sqs.Queue(this, 'Example', {\n      visibilityTimeout: cdk.Duration.seconds(300)\n    });\n  }\n};\n\nconst app = new cdk.App();\nnew MyStack(app, 'MyStack');\n\n
Run Code Online (Sandbox Code Playgroud)\n

完整输出(一些缩短......):

\n
$ cdk synth \nResources:\n  ExampleA925490C:\n    Type: AWS::SQS::Queue\n    Properties:\n      VisibilityTimeout: 300\n    UpdateReplacePolicy: Delete\n    DeletionPolicy: Delete\n    Metadata:\n      aws:cdk:path: MyStack/Example/Resource\n  CDKMetadata:\n    Type: AWS::CDK::Metadata\n    Properties:\n      Analytics: v2:deflate64:H4sIAAAAAAAA/zPSM9EzUEwsL9ZNTsnWzclM0qsOLklMztYBCsUXFxbrVQeWppam6jin5YEZtSBWUGpxfmlRMljUOT8vJbMkMz+vVicvPyVVL6tYv8zQTM8YaGpWcWamblFpXklmbqpeEIQGAChZc6twAAAA\n    Metadata:\n      aws:cdk:path: MyStack/CDKMetadata/Default\n    Condition: CDKMetadataAvailable\nConditions:\n  CDKMetadataAvailable:\n    Fn::Or:\n      - Fn::Or:\n          - Fn::Equals:\n              - Ref: AWS::Region\n              - af-south-1\n          ...\n      - Fn::Or:\n          - Fn::Equals:\n              - Ref: AWS::Region\n              - us-west-1\n          ...\nParameters:\n  BootstrapVersion:\n    Type: AWS::SSM::Parameter::Value<String>\n    Default: /cdk-bootstrap/hnb659fds/version\n    Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]\nRules:\n  CheckBootstrapVersion:\n    Assertions:\n      - Assert:\n          Fn::Not:\n            - Fn::Contains:\n                - - "1"\n                  - "2"\n                  - "3"\n                  - "4"\n                  - "5"\n                - Ref: BootstrapVersion\n        AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.\n
Run Code Online (Sandbox Code Playgroud)\n

这里的环境:

\n
$ cdk doctor\n\xe2\x84\xb9\xef\xb8\x8f CDK Version: 2.8.0 (build 8a5eb49)\n\xe2\x84\xb9\xef\xb8\x8f AWS environment variables:\n  - AWS_PAGER = \n  - AWS_DEFAULT_PROFILE = sbxb.admin\n  - AWS_STS_REGIONAL_ENDPOINTS = regional\n  - AWS_NODEJS_CONNECTION_REUSE_ENABLED = 1\n  - AWS_SDK_LOAD_CONFIG = 1\n\xe2\x84\xb9\xef\xb8\x8f No CDK environment variables\n\n
Run Code Online (Sandbox Code Playgroud)\n

如何摆脱那个cloudformation参数?\n我只想使用CDK来创建一个cloudformation模板。

\n

后来我想将该模板与服务目录一起使用,并且不希望BootstrapVersion暴露参数,也不需要它。

\n

Fel*_*lix 14

这里修改后的代码有效:

import * as cdk from 'aws-cdk-lib';
import { DefaultStackSynthesizer, Stack } from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sqs from 'aws-cdk-lib/aws-sqs';

export class MyStack extends Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const queue = new sqs.Queue(this, 'Example', {
      visibilityTimeout: cdk.Duration.seconds(300)
    });
  }
};

const app = new cdk.App();
new MyStack(app, 'MyStack' , {
  synthesizer: new DefaultStackSynthesizer({
    generateBootstrapVersionRule: false
  })
});

Run Code Online (Sandbox Code Playgroud)

正如另一个答案所提到的,必须使用 覆盖 DefaultStackSynthesizer generateBootstrapVersionRule: false


Kau*_*kar 7

编辑:更新了答案以提及generateBootstrapVersionRule参数。有关代码,请参阅@Felix 的答案。

默认情况下,使用时,所有模板中都包含以下内容DefaultStackSynthesizer

"Parameters": {
    "BootstrapVersion": {
      "Type": "AWS::SSM::Parameter::Value<String>",
      "Default": "/cdk-bootstrap/hnb659fds/version",
      "Description": "Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]"
    }
  },
  "Rules": {
    "CheckBootstrapVersion": {
      "Assertions": [
        {
          "Assert": {
            "Fn::Not": [
              {
                "Fn::Contains": [
                  [
                    "1",
                    "2",
                    "3",
                    "4",
                    "5"
                  ],
                  {
                    "Ref": "BootstrapVersion"
                  }
                ]
              }
            ]
          },
          "AssertDescription": "CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI."
        }
      ]
    }
  }
Run Code Online (Sandbox Code Playgroud)

BootstrapVersionCDK 使用该参数和关联规则来检查您环境中部署的Bootstrap 堆栈的版本。如果您确信您的堆栈不需要引导或者您拥有正确的BootstrapVersion. 该参数不在堆栈中的其他任何地方使用。

默认情况下,CDK v2 使用,DefaultStackSynthesizer因此该参数将始终包含在内。避免这种情况的一种方法是创建一个generateBootstrapVersionRule参数值为 false 的自定义对象(请参阅 Felix 的代码答案)。或者,也可以在实例化 CDK 时指定LegacyStackSynthesizer以避免创建参数,但这会对堆栈的综合方式以及引导堆栈的使用方式进行一些更改。下面的 v1 文档链接中给出了差异表。

CDK v1 则相反,LegacyStackSynthesizer默认使用。

参考