gpt4 book ai didi

typescript - 如何使用AWS CDK管理多个环境?

转载 作者:行者123 更新时间:2023-12-03 13:31:36 25 4
gpt4 key购买 nike

我正在将我们的基础架构代码从Terraform迁移到AWS cdk。而且我正在尝试找到一种最佳方法来管理具有多个要部署的堆栈的多个环境。如果我按照文档中的建议进行操作,则必须为多个环境定义多个堆栈,这可能会造成混淆。例如。

const app = new cdk.App();

new DevStack1(app, 'dev-stack-1', settings.dev)
new DevStack2(app, 'dev-stack-2', settings.dev)
.
.


new ProdStack1(app, 'prod-stack-1', settings.prod)
new ProdStack2(app, 'prod-stack-2', settings.prod)
.
.


在相同环境中的不同堆栈之间共享设置的位置。然后,我将不得不一个接一个地部署每个堆栈。有更好的方法吗?

最佳答案

编辑:,因为此答案具有合理数量的 View ,所以我想对其进行更新以反射(reflect)一种更好的,更CDK的 native 方法。我将在下面保留原始答案,因为它可能对某人更好。
CDK参数可以直接存储在cdk.json键下的context中,并可以使用ConstructNode.try_get_context(param_name)在应用程序内部进行检索。
参阅官方文件:https://docs.aws.amazon.com/cdk/latest/guide/get_context_var.html
因此,这是cdk.json的示例,它针对不同的env使用不同的参数:

{
"app": "python3 app.py",
"context": {
"dev": {
"vpc": {
"vpc_id": "blabla"
}
},
"stage": {
"vpc": {
"vpc_id": "bleble"
}
}
}
现在,您还可以通过CLI键 --context env_name=dev提供上下文参数,并在代码中使用其值来获取相关设置。
实际上,大多数(即使不是全部)通用结构(如 StackAppNestedStack)都具有 node属性,因此您可以从应用程序中的任何位置访问上下文。
使用它有两个注意事项:
  • 它不允许访问较低级别的键(或者至少没有记录)。这意味着您不能使用self.try_get_context("dev.vpc.vpc_id"),您需要通过self.try_get_context("dev")检索顶级 key ,并自行解决。
  • 如果您的上下文中有bool参数,并尝试使用CLI键--context key=False覆盖它们,则这些参数将变成str,如果您使用以下常识语法,则很容易陷入陷阱:
  • if self.try_get_context("deploy_vpc"):
    MyVPC(app, "my new vpc")
    由于“假”作为非空字符串被评估为 True,因此您将无法获得期望的结果。

    旧答案
    我不确定是否对此达成共识,因为CDK仍然是新事物,还支持多种语言。但是我个人所做的是将设置存储在不同环境的YAML文件中,然后通过环境变量提供该文件。
    Python示例:
    Config是一个YAML文件,其中包含一些项,例如资源的必需标记,应用程序级别的某些设置(例如帐户ID和区域)以及堆栈级别的设置(例如资源的名称等)。
    假设采用标准项目布局,则在其中有 app.py主文件和 cdk/cdk_stack.py文件以及堆栈说明。
    app.py中:
    from ruamel.yaml import YAML
    ...
    from cdk.cdk_stack import MyStack


    def load_config() -> dict:
    """
    Import settings from YAML config
    :return: dict with configuration items
    """
    # This variable should always be set
    # CDK doesn't work well with argparse
    config_path = os.getenv("CONFIG_PATH")
    if not config_path:
    raise RuntimeError("You need to supply config file path with CONFIG_PATH env variable")
    # We don't verify config content, let fail in case something is missing
    with open(config_path) as config_file:
    config = YAML().load(config_file.read())
    return config

    def init_app() -> core.App:
    """
    Initiates CDK main_app for deployment
    :return: main_app
    """
    main_app = core.App()
    config = load_config()
    # Account ID and region have to be explicitly set in order to import existing resources
    MyStack(
    main_app,
    "my stack",
    env={
    'account': config["account_id"],
    'region': config["region"]
    },
    config=config
    )
    # Tags are applied to all tagable resources in the stack
    for key, value in config["tags"].items():
    core.Tag.add(scope=main_app, key=key, value=value)
    return main_app


    if __name__ == '__main__':
    app = init_app()
    app.synth()
    然后在 cdk/cdk_stack.py中:
    class MyStack(core.Stack):
    """
    Describes CF resources
    """
    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
    # Pop the config object first, since parent object doesn't expect it and will crash
    config = kwargs.pop("config")
    super().__init__(scope, id, **kwargs)
    ...

    关于typescript - 如何使用AWS CDK管理多个环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61515974/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com