【问题标题】:AWS CDK alternative to using Params in StepFunctionsAWS CDK 替代在 StepFunctions 中使用参数
【发布时间】:2021-10-11 09:50:16
【问题描述】:

我正在使用 js/ts 中的 AWS CDK(ver2,因为我们都讨厌 ver1 中的版本控制),并且出于一些明显的原因,我正在尝试用 CDK 替换我们当前的 Cloudformation 堆栈/实现。

当前的 Cfn 存储库具有如下结构:

.
├── cloudformation
│   ├── params
│   │   └── submit
│   │       ├── e2e.json
│   │       ├── preprod.json
│   │       └── prod.json
│   ├── stack
│   │   └── submit.yml
│   └── tags
│       ├── e2e.json
│       ├── preprod.json
│       └── prod.json
├── deploy.sh
├── ops
│   ├── add-state.sh
│   ├── create-or-update-stack.sh
│   └── upload-zendesk-templates.sh
├── state-machine
│   ├── Submit.json
│   └── SubmitSubStateMachine.json
└── zendesk-template
    ├── some_handlebars_zendesk_template_1.hbs
    └── some_handlebars_zendesk_template_2.hbs

Cloudformation 堆栈在 ./cloudformation/stack/ 下的 yaml 文件中定义。在不同环境中使用的所有 thw 参数都定义在 ./cloudformation/params/{stackname}/{env}/ 目录下的 json 文件中,这些参数在堆栈定义中被引用/反映,看起来像这样(有很多 !Sub!Ref):

ZendeskWorkerLambdaArn:
          Fn::ImportValue: !Sub "${ZendeskWorkerInfrastructureStackName}-ZendeskWorkerLambdaArn"
ZendeskDomain: !Ref ZendeskDomain
FooBarGroupId: !Ref FooBarGroupId

这个堆栈的作用是:

  1. 一旦收到来自后端的调用信号,它就会启动,并且;
  2. 它随后调用一个 lambda 工作程序以及存储在 S3 存储桶中的模板名称(键),并且;
  3. 它还将参数传递给状态机,工作人员在该状态机中获取所有参数并执行一些业务逻辑工作(超出此 Cfn 问题的范围)。

请注意,所有这些车把模板文件都通过在 shell 脚本(./ops/ 下)中运行 aws-cli 上传到 s3 存储桶。

由于我试图使用 CDK 来替换这个非常重配置和重外壳的 Cfn 项目,我遇到了一个问题,我应该为不同的环境处理所有这些参数。我使用cdk.CfnParameter 在CDK 堆栈定义中定义环境变量。我想我可以再做一次,但问题是:

  1. 如何区分相同的变量(名称)但在不同的环境下?
  2. 我必须附加到cdk deploy 命令末尾的环境量很大,这使得整个命令看起来很乏味。 (目前每个环境的 json 文件中定义了大约 40 个参数)
  3. aws 真的不鼓励在部署时使用参数。

我已经没有办法解决这个问题了。如果有人能给我一点想法,非常感谢,也很抱歉这篇超长的帖子。虽然我确实希望我提供了足够的上下文(说到上下文,我应该查看 CDK 上下文吗?)

干杯, 亚当

【问题讨论】:

  • SSM 参数可行吗?
  • 对我来说听起来像是 SSM 的工作

标签: amazon-web-services amazon-cloudformation aws-cdk aws-step-functions infrastructure-as-code


【解决方案1】:

为此我使用 cdk.context.json 和环境变量。

示例 cdk 上下文 json,

{
  "shared": {
    "application": "application name",
  },
  "dev": {
    "environment": "dev",
    }
}

在部署 cdk 时从管道设置环境。

在python中获取如下环境,

ENVIRONMENT = os.environ.get('ENVIRONMENT', 'dev')

并在 Python 中创建如下基础结构时读取该上下文,

   self.context = self.node.try_get_context(ENVIRONMENT)

其他示例请参阅此处-https://docs.aws.amazon.com/cdk/latest/guide/get_context_var.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 2022-08-14
    • 2020-05-09
    • 2022-10-15
    • 2021-04-08
    相关资源
    最近更新 更多