【问题标题】:How to evaluate CDK `CfnOutput` (CloudFormation output) values?如何评估 CDK `CfnOutput`(CloudFormation 输出)值?
【发布时间】:2021-09-27 14:04:42
【问题描述】:

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

在每个核心基础架构组件(auth、db、webapp、存储等)的末尾,我有一个 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]}

这显然不是我预期的s1lvgk44ul23ahfd91p4rdngnf

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

【问题讨论】:

    标签: python amazon-web-services amazon-cloudformation aws-cdk


    【解决方案1】:

    相反,我决定使用 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)
    

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2021-12-07
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 2018-12-22
      • 1970-01-01
      • 2015-12-28
      • 2011-11-19
      相关资源
      最近更新 更多