Как создать ресурс Cfn с атрибутами, считанными из параметров CloudFormation, которые имеют число c или логическое значение? - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу создать поток доставки пожарного шланга и прочитать подсказки буферизации и флаг enabled из параметров CloudFormation.

Я нашел, как это сделать для случаев, когда кому-то нужна строка, например, имя очереди,

new sqs.Queue(this, 'MyQueue', {
   queueName: Fn.conditionIf('Condition', 'Hello', 'World').toString()
});

Я не могу понять, как сделать это для числа или логического значения. Что я должен использовать для XXXXXXXXXXXXXX и YYYYYYYYYYYYYYY в следующем коде?

        const cfnParam = new CfnParameter(this, "EnableFirehoseDataFormatConversion", {
            type: "String"
        });

        const cfnCondition = new CfnCondition(this, "FirehoseDataFormatConversionEnabled", {
            expression: Fn.conditionEquals(cfnParam.valueAsString, "true"),
        });

        new kinesisf.CfnDeliveryStream(this, "MyFirehose", {
            // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html
            extendedS3DestinationConfiguration: {
                bucketArn: dataBucket.bucketArn,
                bufferingHints: {
                    intervalInSeconds: XXXXXXXXXXXXXX,
                    sizeInMBs: 128,
                },
                compressionFormat: "UNCOMPRESSED",
                dataFormatConversionConfiguration: {
                    enabled: YYYYYYYYYYYYYYY
                },
                roleArn: myRole.roleArn,
                prefix: dataStoragePrefixInS3,
                errorOutputPrefix: errorStoragePrefixInS3,
            }
        });

Среда

  • Версия CLI CLK: 1.30
  • ОС: Ма c 10,13
  • Язык: Машинопись

1 Ответ

0 голосов
/ 15 апреля 2020

Я нашел, что я должен использовать для ГГГГГГГГГГГГ.

Что происходит? Оказывается, что типы некоторых значений не обязательно должны быть скалярами (string, number, ...), но могут быть IResolvable, что позволяет CDK оценивать их во время синтеза. Например, вот объявление DataFormatConversionConfigurationProperty в node_modules/@aws-cdk/aws-kinesisfirehose/lib/kinesisfirehose.generated.d.ts:

export declare namespace CfnDeliveryStream {
    interface DataFormatConversionConfigurationProperty {
        readonly enabled: boolean | cdk.IResolvable;
        readonly inputFormatConfiguration: CfnDeliveryStream.InputFormatConfigurationProperty | cdk.IResolvable;
        readonly outputFormatConfiguration: CfnDeliveryStream.OutputFormatConfigurationProperty | cdk.IResolvable;
        readonly schemaConfiguration: CfnDeliveryStream.SchemaConfigurationProperty | cdk.IResolvable;
    }
}

Это означает, что мы можем использовать следующее для атрибута enabled

const cfnParam = new CfnParameter(this, "EnableFirehoseDataFormatConversion", {
    type: "String"
});

const cfnCondition = new CfnCondition(this, "FirehoseDataFormatConversionEnabled", {
    expression: Fn.conditionEquals(cfnParam.valueAsString, "true"),
});

const enabledOrNot: IResolvable = Fn.conditionIf(cfnCondition.logicalId, true, false);

new kinesisf.CfnDeliveryStream(this, "MyFirehose", {
    // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-kinesisfirehose-deliverystream-extendeds3destinationconfiguration.html
    extendedS3DestinationConfiguration: {
        bucketArn: dataBucket.bucketArn,
        bufferingHints: {
            intervalInSeconds: XXXXXXXXXXXXXX,
            sizeInMBs: 128,
        },
        compressionFormat: "UNCOMPRESSED",
        dataFormatConversionConfiguration: {
            enabled: enabledOrNot
        },
        roleArn: myRole.roleArn,
        prefix: dataStoragePrefixInS3,
        errorOutputPrefix: errorStoragePrefixInS3,
    }
});

Этот подход не работает для XXXXXXXXXXXXXX, потому что тип intervalInSeconds является number, а не number | IResolvable. Однако тип bufferingHints равен IResolvable, поэтому вы должны иметь возможность указать всю структуру. Я пока не знаю, как создать экземпляр IResolvable, который бы возвращал структуру.

...