【问题标题】:Use a map in Cloudformation to define static dev and prod configs?在 Cloudformation 中使用地图来定义静态开发和产品配置?
【发布时间】:2019-11-26 06:23:08
【问题描述】:

我想为我的所有部署使用一个模板。

我希望在同一个模板中定义我的 dev 和 prod 配置。

当我调用模板时,我为 dev 或 prod 传递了一个参数,而 cloudformation 使用 dev 或 prod 映射的变量 - 这可能吗?

我可以看到它的支持地图,但我不确定如何用它实现我想要的:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/mappings-section-structure.html

有没有一种方法可以让我的所有参数映射,然后为 dev 或 prod 设置一个参数,当我在部署 cloudformation 时设置一个参数时使用参数的 dev 或 prod 属性?

例子:

Parameters:
  env:
    Description: environment
    Type: String
    Default: dev

Mappings: 
  RegionMap: 
    dev: 
      HVM64: "ami-0ff8a91507f77f867"
      HVMG2: "ami-0a584ac55a7631c0c"
    prod: 
      HVM64: "ami-0bdb828fd58c52235"
      HVMG2: "ami-066ee5fd4a9ef77f1"
  DynamoTableName:
    dev: 'devtable'
    prod: 'prodtable'
  SomeOtherVar: ...

Resources: 
  myEC2Instance: 
    Type: "AWS::EC2::Instance"
    Properties: 
      ImageId: !FindInMap
        - RegionMap
        - !Ref env
        - HVM64
      InstanceType: m1.small

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    【讨论】:

    • 我想是的,你能看看我的例子并确保我理解这一点。在我的示例中,我只需要从 cli 传递 env var,就会从地图中获取正确的值?
    • 是的,看起来不错。您在测试中遇到过任何错误吗?
    【解决方案2】:

    如果您或其他人需要一个示例或稍微不同的方法。我为不同的环境使用单独的配置文件,在运行时动态加载它们并填充参数值。

    如果您使用的是命令行,以下示例应该可以在运行时填充参数。

    aws --region ${region} cloudformation create-stack --stack-name ${stack_name} -- template-body file://${CFT_DIR}/${process}-stack.json --parameters ParameterKey=${param1},ParameterValue=${value1} ParameterKey=${param2},ParameterValue=${value2} ParameterKey=${param3},ParameterValue=${value3} 
    

    所有变量都可以根据运行时加载的配置文件进行填充。

    如果你使用的是 AWS java sdk,你可以用这个例子做同样的事情。

    AmazonCloudFormation awsCFTClient = AmazonCloudFormationClientBuilder.defaultClient();
    
    List<Parameter> listOfParameters = new ArrayList<Parameter>();
        listOfParameters.add(getParameter("param1", "value1"));
        listOfParameters.add(getParameter("param2", "value2"));
    
    CreateStackRequest createStackRequest = new CreateStackRequest();
        createStackRequest.setStackName(stackName);
        createStackRequest.setTemplateURL(AWS_S3_URL + cftPath);
        createStackRequest.setParameters(listOfParameters);
    
    awsCFTClient.createStack(createStackRequest);
    

    只需从配置文件中填充参数值并根据环境加载配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2023-03-03
      • 2013-06-17
      • 1970-01-01
      相关资源
      最近更新 更多