如何评估CDK`CfnOutput`(CloudFormation输出)值?

2024-09-27 19:22:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个工具,在cdk deploy之后利用CloudFormation输出,然后根据这些输出使用配置文件设置开发环境

在每个核心基础架构组件(auth、db、webapp、storage等)的末尾,我有一个CfnOutput结构,如下所示:

cdk.CfnOutput(
    self, 'UserPoolID',
    value=self.user_pool.user_pool_id,
)

输出类似于

Stack.AuthUserPoolIDABC1234 = s1lvgk44ul23ahfd91p4rdngnf

我的目标是将该值(s1lvgk44ul23ahfd91p4rdngnf)与其他CloudFormation输出的其他值一起放入配置文件config.js

因此,我在CfnOutput周围编写了一个包装器,如下所示:

import os

def cfn_output(scope, prefix, name, value):
    cdk.CfnOutput(
        scope, name,
        value=value,
    )

    # Save name and value to flat files so that we can read them in other processes
    os.makedirs('.tmp', exist_ok=True)
    with open(os.path.join('.tmp', f'{prefix}{name}.txt'), 'w') as f:
        f.write(value)

所以我用它来代替CfnOutput,就像这样:

cfn_output(
    scope=self,
    prefix='Auth',
    name='UserPoolID',
    value=self.user_pool.user_pool_id
)

运行cdk synth时,生成的文件(.tmp/AuthUserPoolID.txt)包含以下内容:

${Token[TOKEN.249]}

这显然不是我所期望的那样

有什么解决方案或变通方法可以将该令牌解析为可用的东西,或者可能是一个完全不同的解决方案


Tags: nameselfidprefixvalueos配置文件tmp
1条回答
网友
1楼 · 发布于 2024-09-27 19:22:29

相反,我决定使用SDK从CloudFormation堆栈获取经过评估的输出

# Prepare
cloudformation = boto3.client('cloudformation')
stack_name = 'Stack'

# Get stack outputs
res = cloudformation.describe_stacks(StackName=stack_name)
outputs = res['Stacks'][0]['Outputs']

mp = {
    'ApiURL': '',
    'AuthUserPoolClientID': '',
    'AuthUserPoolID': '',
    'DatabaseName': '',
    'StorageHostingBucketName': '',
    'WebappURL': '',
}

# Parse stack output names
for output in outputs:
    ok = output['OutputKey']
    ov = output['OutputValue']

    for k in mp:
        if ok.startswith(k):
            mp[k] = ov

# Generate config.js data
data = {
    'endpoint': mp['ApiURL'],
    'userPoolId': mp['AuthUserPoolID'],
    'userPoolClientId': mp['AuthUserPoolClientID'],
}
json_data = json.dumps(data, separators=(',', ':'))
text = f'window.config={json_data}'

# Write ac.js
configjs = os.path.join(os.path.dirname(__file__), '../static/config.js')
with open(configjs, 'w') as f:
    f.write(text)

相关问题 更多 >

    热门问题