Создание предсказуемых имен стеков для нескольких стеков в AWS CDK - PullRequest
1 голос
/ 17 января 2020

Как получить "хорошие" имена стеков при выполнении npx cdk synth в AWS приложении CDK, которое состоит из нескольких стеков , которые я хотел бы развернуть в нескольких средах ?

#!/usr/bin/env node
import * as cdk from '@aws-cdk/core';
import * as s3 from '@aws-cdk/aws-s3';
import * as lambda from '@aws-cdk/aws-lambda';


class PersistenceStack extends cdk.Stack {
    public readonly bucket: s3.Bucket;
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
        this.bucket = new s3.Bucket(this, 'bucket');
    }
}


interface ApplicationStackProps extends cdk.StackProps {
    bucket: s3.Bucket;
}


class ApplicationStack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props: ApplicationStackProps) {
        super(scope, id, props);
        const myLambda = new lambda.Function(this, 'my-lambda', {
            runtime: lambda.Runtime.NODEJS_12_X,
            code: new lambda.AssetCode('my-lambda'),
            handler: 'index.handler'
        });
        props.bucket.grantReadWrite(myLambda);
    }
}


class MyApp extends cdk.Construct {

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

        const persistenceStack = new PersistenceStack(this, 'persistence-stack', {
            ...props,
            description: 'persistence stack',
            stackName: `${id}-persistence-stack`,
        });

        const applicationStack = new ApplicationStack(this, 'application-stack', {
            ...props,
            description: 'application stack',
            stackName: `${id}-application-stack`,
            bucket: persistenceStack.bucket,
        });
        applicationStack.addDependency(persistenceStack);
    }
}


const app = new cdk.App();

new MyApp(app, `test`, { env: { account: '111111111111', region: 'eu-west-1' } });
new MyApp(app, `prod`, { env: { account: '222222222222', region: 'eu-west-1' } });

Проблема, с которой я сталкиваюсь, заключается в том, что это генерирует выходные данные, подобные:

Successfully synthesized to [...]/my-app/cdk.out
Supply a stack id (prodpersistencestackFE36DF49, testpersistencestack6C35C777, prodapplicationstackA0A96586, testapplicationstackE19450AB) to display its template.

То, что я ожидал увидеть, это "хорошие" имена стеков (так как у меня есть задали свойства stackName при вызове конструкторов):

Successfully synthesized to [...]/my-app/cdk.out
Supply a stack id (prodpersistencestack, testpersistencestack, prodapplicationstack, testapplicationstack) to display its template.

Мотивация: мне нужны «хорошие» (или, по крайней мере, предсказуемые) имена стеков, чтобы передать на следующий шаг наш конвейер CI / CD, чтобы Сервер сборки может развернуть приложение CDK.

AWS Версия CDK: 1.21.1

1 Ответ

1 голос
/ 20 января 2020

Эта AWS проблема CDK решает эту проблему. В его ответе указывается, что идентификаторы стека подобны этой схеме (поскольку в нескольких средах можно иметь одно и то же имя стека).

Чтобы использовать имя стека в качестве параметра развертывания, можно реализовать обратный поиск файла cdk.out/manifest.json, поскольку там доступна информация о сопоставлении между идентификаторами стека и именами стека. Ниже приведен отрывок того, как такой поиск может быть реализован с использованием jq :

# get stack name from somewhere, e.g. test-persistence-stack, prod-persistence-stack, test-application-stack or prod-application-stack from the question above
stackName=    

# extract stack id from ./cdk.out/manifest.json
stackId=$(jq -r --arg stackName "$stackName" \
   '.artifacts
   | to_entries[]
   | select(.value.properties.stackName == $stackName)
   | .key
   ' \
   < "./cdk.out/manifest.json" \
   )

# call cdk deploy with stack id as parameter
npx cdk deploy \
  --app cdk.out \
  --require-approval never \
  "$stackId"
...