amazon-web-services - 在 StepFunctions 中使用 Params 的 AWS CDK 替代方案

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

我正在 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文件中。 ,在堆栈定义中被引用/反射(reflect),如下所示(有很多 !Sub!Ref ):

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

这个堆栈的作用是:

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

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

由于我尝试使用 CDK 来替换这个配置繁重且 shell 繁重的 Cfn 项目,因此我遇到了一个问题,即我应该如何处理不同环境的所有这些参数。我用过 cdk.CfnParameter在CDK堆栈定义中定义环境变量。我想我可以再做一次,但问题是:

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

我已经没有办法解决这个问题了。如果有人能给我一点点想法,我将不胜感激,并对这篇超长的帖子表示歉意。不过,我确实希望我已经提供了足够的上下文(说到上下文,CDK 上下文是我应该关注的吗?)

干杯, 亚当

最佳答案

我使用 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

关于amazon-web-services - 在 StepFunctions 中使用 Params 的 AWS CDK 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68682629/

相关文章:

amazon-web-services - 无法在 AWS CodeBuild 镜像中使用 amazon-linux-extras

swift - 保存对下载的 DynamoDB 数据的引用

amazon-s3 - 如何共享 Amazon AWS 凭证(S3、EC2 等)?

amazon-web-services - 在 DynamoDB GlobalTable CloudFormation 模板中添加标签

c# - TestWebACL 错误原因 : Your statement has multiple values set for a field that requires exactly one value

amazon-web-services - 如何在AWS中保留弹性IP

amazon-web-services - 使用具有已解析 URL 属性的 AWS CDK 捆绑程序

python - 检查 Python Boto SimpleDB 的结果集是否为空

javascript - 使用字节的 AWS Rekognition JavaScript SDK

json - 用于创建 EC2 的 AWS CloudFormation 模板 (JSON) - 意外错误