AWS CDK: как ссылаться на ресурсы кросс-стека в одном приложении? - PullRequest
0 голосов
/ 03 мая 2020

У меня есть приложение, которое имеет два стека, оба в одном регионе / учетной записи. Для одного из этих стеков требуется ARN лямбды, которая существует в другом стеке. Как мне сослаться на это?

// within stackA constructor
public StackA(Construct scope, String id, StackProps props) {

    SingletonFunction myLambda = SingletonFunction.Builder.create(this, "myLambda")
                                                          // some code here
                                                          .build()
    CfnOutput myLambdaArn = CfnOutput.Builder.create(this, "myLambdaArn")
                                              .exportName("myLambdaArn")
                                              .description("ARN of the lambda that I want to use in StackB")
                                              .value(myLambda.getFunctionArn())
                                              .build();

}


App app = new App();

Stack stackA = new StackA(app, "stackA", someAProps);

Stack stackB = new StackB(app, "stackB", someBProps);
stackB.dependsOn(stackA);

Как передать ARN в StackB?

Ответы [ 2 ]

2 голосов
/ 03 мая 2020

Вы можете получить доступ к ресурсам из другого стека, если они находятся в одной учетной записи и AWS Регион. В следующем примере определяется стек stack1, который определяет корзину Amazon S3. Затем он определяет второй стек stack2, который принимает корзину из stack1 в качестве свойства конструктора.

// Helper method to build an environment
static Environment makeEnv(String account, String region) {
    return Environment.builder().account(account).region(region)
            .build();
}

App app = new App();

Environment prod = makeEnv("123456789012", "us-east-1");

StackThatProvidesABucket stack1 = new StackThatProvidesABucket(app, "Stack1",
        StackProps.builder().env(prod).build());

// stack2 will take an argument "bucket"
StackThatExpectsABucket stack2 = new StackThatExpectsABucket(app, "Stack,",
        StackProps.builder().env(prod).build(), stack1.getBucket());
1 голос
/ 03 мая 2020

Опция 1:

передача данных из стека A в стек B с помощью конструктора:

Вы можете расширить cdk.stack и создать новый класс, который будет содержат стек A..

В этом стеке предоставьте нужные данные, используя public XXX: string\number (etc) (см. строку 2 в примере).

Позже, просто передайте эти данные в конструктор StackB (вы может передавать его и с помощью реквизита).

Фрагмент рабочего кода:

Стек A:

    export class StackA extends cdk.Stack {
        public YourKey: KEY_TYPE;

        constructor(scope: cdk.Construct, id: string, props: cdk.StackProps ) {
            super(scope, id, props);

            Code goes here...

            // Output the key 
            new cdk.CfnOutput(this, 'KEY', { value: this.YourKey });

        }
    }

Стек B:

export class StackB extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string,importedKey: KEY_TYPE, props: cdk.props) {
        super(scope, id, props)

        Code goes here...

        console.log(importedKey)

    }
}

bin ts:

const importedKey = new StackA(app, 'id',props).yourKey;
new StackB(app, 'id',importedKey,props);

Опция 2:

Иногда лучше просто сохранить такие вещи в хранилище параметров и прочитать их оттуда.

Подробнее здесь .

...