cfn 模板和管道都是使用 AWS CDK 创建的,如何使用 CodePipeline 部署 CloudFormation 堆栈?

Hum*_*ert 5 aws-cloudformation typescript aws-codepipeline aws-cdk

使用 AWS CDK,我创建了一个带有 Auto Scaling 组的简单堆栈,并定义了启动配置资源以在 ec2 实例创建期间执行一些 powershell 脚本。这些脚本位于同一个 cdk typescript 项目中,我使用 aws-s3-asset 构造上传脚本目录。当 CDK 合成模板时,它会使用自动生成的名称创建 3 个 CloudFormation 参数,以引用资产的 S3 存储桶。此时一切正常,我执行 cdk deploy StackWithAutoScalingGroup 命令,cdk 自动填充 CloudFormation 参数的值并部署堆栈。

我决定实现一个 CodePipeline 堆栈 (StackWithTheCodePipline) 来部署 StackWithAutoScalingGroup,它从 CodeCommit 存储库中获取代码并执行代码构建以合成模板,最后阶段是用于部署堆栈的 CodeDeploy CloudFormation 操作。这最后一步失败了,因为 CloudFormation 参数不是由管道提供的。

我正在寻找一种方法来从 StackWithTheCodePipline 访问在 StackWithAutoScalingGroup 中创建的 s3 Assets 存储桶,以便提供所需的 CloudFormation 参数

任何帮助将不胜感激

StackWithAutoScalingGroup.ts

const captivaServer = new AutoScalingGroupStandard(this, 'CaptivaServer', {
      vpc: props.vpc,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.T2, ec2.InstanceSize.MICRO),
      machineImage: new ec2.WindowsImage(ec2.WindowsVersion.WINDOWS_SERVER_2019_ENGLISH_FULL_BASE),
    });

const scripts = new assets.Asset(this, 'Scripts', {
path: path.join('cfninit', 'scripts'),
readers: [
captivaServer.instanceRole,
]
});
Run Code Online (Sandbox Code Playgroud)

StackWithAutoScalingGroup.template.json(在堆栈合成后创建的参数)

"Parameters": {
    "SsmParameterValueawsserviceamiwindowslatestWindowsServer2019EnglishFullBaseC96584B6F00A464EAD1953AFF4B05118Parameter": {
      "Type": "AWS::SSM::Parameter::Value<String>",
      "Default": "/aws/service/ami-windows-latest/Windows_Server-2019-English-Full-Base"
    },
    "ScriptsS3Bucket1E273C2D": {
      "Type": "String",
      "Description": "S3 bucket for asset \"CdkCaptivaStack/Scripts\""
    },
    "ScriptsS3VersionKey0B5B668F": {
      "Type": "String",
      "Description": "S3 key for asset version \"CdkCaptivaStack/Scripts\""
    },
    "ScriptsArtifactHashC07F896B": {
      "Type": "String",
      "Description": "Artifact hash for asset \"CdkCaptivaStack/Scripts\""
    }
  }
Run Code Online (Sandbox Code Playgroud)

StackWithTheCodePipline.ts

    new codepipeline.Pipeline(this, 'Pipeline', {
      stages: [
        {
          stageName: 'Source',
          actions: [
            new codepipeline_actions.CodeCommitSourceAction({
              actionName: 'CodeCommitSource',
              repository: code,
              output: sourceOutput,
            }),
          ],
        },
        {
          stageName: 'Build',
          actions: [
            new codepipeline_actions.CodeBuildAction({
              actionName: 'BuildStack',
              project: buildProject,
              input: sourceOutput,
              outputs: [buildOutput],
            }),
          ],
        },
        {
          stageName: 'DeployToTest',
          actions: [
            new codepipeline_actions.CloudFormationCreateUpdateStackAction({
              actionName: 'DeployStack',
              templatePath: buildOutput.atPath('StackWithAutoScalingGroup.template.json'),
              stackName: 'csg-cdk-captiva',
              //parameterOverrides: props.parameterOverrides,
              adminPermissions: true,
            }),
          ],
        },
      ],
    });
Run Code Online (Sandbox Code Playgroud)

该操作提供了 parameterOverrides 属性来设置所需的参数,但就像名称是自动生成的一样,我无法找到一种方法来了解模板不期望参数值的参数。

我期望的是一种了解生成的参数名称的方法,以及一种引用 s3 资产存储桶以提供参数值的方法。

       {
          stageName: 'DeployToTest',
          actions: [
            new codepipeline_actions.CloudFormationCreateUpdateStackAction({
              actionName: 'DeployStack',
              templatePath: buildOutput.atPath('StackWithAutoScalingGroup.template.json'),
              stackName: 'csg-cdk-captiva',
              parameterOverrides: {
                   'ScriptsS3Bucket1E273C2D':????,//how I can get the param name and also the values
                   'ScriptsS3VersionKey0B5B668F':???,
               }
              adminPermissions: true,
            }),
          ],
        },
Run Code Online (Sandbox Code Playgroud)

小智 -1

我不完全确定事情是如何设置的。我相信你也许可以做类似的事情

let yourS3Bucket = cdk.S3(blah)

parameterOverrides: {
  yourS3Bucket:yourS3Bucket.<your_property>
}

Run Code Online (Sandbox Code Playgroud)

代替

parameterOverrides: {
                   'ScriptsS3Bucket1E273C2D':????,//how I can get the param name and also the values
                   'ScriptsS3VersionKey0B5B668F':???,
               }
Run Code Online (Sandbox Code Playgroud)

这些都是伪代码。本质上,您可以将 S3 存储桶分配给一个变量,然后稍后引用该变量。