首页 > 解决方案 > 如何使用从数字或布尔值的 CloudFormation 参数读取的属性创建 Cfn 资源?

问题描述

我想创建 Firehose 传输流并enabled从 CloudFormation 参数中读取缓冲提示和标志。

我发现了当有人需要一个字符串的情况下如何做到这一点,例如队列名称,

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

我不知道如何为数字或布尔值做这件事。下面代码中的 XXXXXXXXXXXXXXX 和 YYYYYYYYYYYYYYYY 应该使用什么?

        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,
            }
        });

环境

标签: aws-cdk

解决方案


我发现我应该为 YYYYYYYYYYYYYYYY 使用什么。

这是怎么回事?事实证明,某些值的类型不必是标量 ( string, number, ...),但可以是IResolvable允许 CDK 在合成期间评估它们的类型。例如,这里是DataFormatConversionConfigurationPropertyin的声明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,因为 type of intervalInSecondsisnumber而不是number | IResolvable. 但是,类型bufferingHintsIResolvable,因此您应该能够指定整个结构。我还不知道如何构建一个IResolvable返回结构的实例。


推荐阅读