如何在 Aws cdk 中使用内部函数 !sub 方法?

How to use intrinsic functions !sub method in Aws cdk?

我想将下面的资源用于我的 cdk 应用程序,我将 Python 用于 CDK:

'arn:aws:s3:::${LoggingBucket}/AWSLogs/${AWSAccoutID}/*'

因此我需要替换 LoggingBucketAWSAccountID 的值。

这是我试过的:

bucket = s3.Bucket(self, "my-bucket", bucket_name = 'my-bucket')

core.Fn.sub('arn:aws:s3:::${LoggingBucket}/AWSLogs/${AWSAccoutID}/*',[bucket.bucket_name, core.Environment.account])

但是我在 core.Fn.sub 行收到此错误:

AttributeError: type object 'property' has no attribute '__jsii_type__'
Subprocess exited with error 1

然后我也试了这个:

mappings = {
    'LoggingBucket': bucket.bucket_name,
    'AWSAccountID': core.Environment.account
}

core.Fn.sub('arn:aws:s3:::${LoggingBucket}/AWSLogs/${AWSAccoutID}/*',mappings)

$ cdk synth

我仍然遇到与上述相同的错误。

问题:

请给我一个关于如何在CDK的cloudformation中使用!sub函数的解决方案。让我也知道我做错了什么。

谢谢。

由于您在使用 AWS CDK 创建基础设施时使用的是常规 python,因此您可以使用 python 的 built-in 'format' 方法:

'arn:aws:s3:::{}/AWSLogs/{}/*'.format(bucket.bucket_name, core.Environment.account)

或使用旧方法 python 字符串格式化

'arn:aws:s3:::%s/AWSLogs/%s/*' % (bucket.bucket_name, core.Environment.account)

由于您使用的是 Python(或其他编程语言),因此无需使用 Cloudformation 提供的内部函数。

我建议使用一种更优雅、更简单的方法来格式化 arn:

arn= f'arn:aws:s3:::{bucket.bucket_name}/AWSLogs/{core.Environment.account}/*'