Как создать CDK NestedStack? - PullRequest
       92

Как создать CDK NestedStack?

2 голосов
/ 12 ноября 2019

Я пытаюсь создать развертывание CDK, которое использует вложенные стеки:

// app
#!/usr/bin/env node
import 'source-map-support/register';
import cdk = require('@aws-cdk/core');
import { PipelineParentStack } from '../lib/pipeline-stack';

const app = new cdk.App();
const pipelines : string = app.node.tryGetContext("pipelines");
new PipelineParentStack(app, 'PipelineParentStack', {
    pipelines: pipelines
});

Строка pipelines содержит разделенный запятыми список, для которого мы должны создать вложенный стек для каждого элемента.

// nested stacks sit within parent stack
import cdk = require('@aws-cdk/core');
import cfn = require('@aws-cdk/aws-cloudformation');
import {Construct} from "@aws-cdk/core";

interface PipelineParentStackProps extends cdk.StackProps {
  pipelines: string;
}

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

    if (props) {
      const pipelinesArray = props.pipelines.split(",");
      for (let pipeline of pipelinesArray) {
        new PipelineStack(scope, pipeline)
      }
    }
  }
}

export class PipelineStack extends cfn.NestedStack {
  constructor(scope: Construct, id: string, props?: cfn.NestedStackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

Когда я пытаюсь развернуть родительский стек, я получаю следующую ошибку:

/tmp/pipeline/node_modules/@aws-cdk/aws-cloudformation/lib/nested-stack.ts:227

throw new Error(`Nested stacks must be defined within scope of another non-nested stack`);
^
Error: Nested stacks must be defined within scope of another non-nested stack
at findParentStack (/tmp/pipeline/node_modules/@aws-cdk/aws-cloudformation/lib/nested-stack.ts:227:11)
at new NestedStack (/tmp/pipeline/node_modules/@aws-cdk/aws-cloudformation/lib/nested-stack.ts:87:25)
at new PipelineStack (/src/function/pipeline/lib/pipeline-stack.ts:24:5)
at new PipelineParentStack (/src/function/pipeline/lib/pipeline-stack.ts:16:9)
at Object.<anonymous> (/src/function/pipeline/bin/pipeline.ts:8:1)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)

Мне кажется, что это настроено согласно документации здесь: https://github.com/aws/aws-cdk/tree/master/packages/%40aws-cdk/aws-cloudformation

Что я делаю не так, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2019

Вам необходимо установить scope вложенных стеков в родительский стек (this, поскольку он определяется в родительском конструкторе), поэтому измените определение вложенного стека на:

        new PipelineStack(this, pipeline)
0 голосов
/ 24 ноября 2019

Вы можете просто попробовать это? Извините, если это не сработало. Я не пробовал это. На основании ошибки это должно быть в пределах родительского стека.

new PipelineStack (this, pipe);

...