如何指示AWS CloudFormation模板在特定区域中创建资源?

时间:2019-01-19 19:43:56

标签: amazon-web-services amazon-ec2 amazon-cloudformation aws-cli

我是CloudFormation模板的新手。我在yaml中具有创建EC2实例的基本模板。每次创建堆栈并使用此模板时,总是在美国东部弗吉尼亚北部地区创建EC2实例。我正在尝试更改此设置,以使EC2实例位于US-WEST-2区域。经过研究,看来这是模板中未指定的内容。相反,我需要在AWS控制台中将该区域更改为us-west-2,然后创建一个新堆栈。我的理解正确吗?

3 个答案:

答案 0 :(得分:5)

很遗憾,您无法在cloudformation模板中指定区域。

您应该将区域作为命令行参数传递

aws --region eu-west-1 cloudformation create-stack --stack-name ...

或在aws cli配置文件~/.aws/config

中指定默认区域
[default]
region=eu-west-1

答案 1 :(得分:0)

我在这里想念什么?我确定我们可以使用参数在CFN模板中指定要在其中创建堆栈的区域,并且确实有活动模板,这些模板可以根据参数值在相应区域中创建堆栈。 AWS :: Region伪参数是一个值,AWS CloudFormation会将其解析为在其中创建堆栈的区域。 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/gettingstarted.templatebasics.html

这是示例模板的小节

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "InstanceType": {
      "Description": "Instance Type",
      "Type": "String",
      "Default": "t2.xlarge"
    },
    "SubnetUSEAST1": {
      "Description": "Subnet on which Ec2 instance needs to be created",
      "Type": "String",
      "Default": "subnet-xxxxxxxx"
    },
    "SubnetUSWEST2": {
      "Description": "Subnet on which Ec2 instance needs to be created",
      "Type": "String",
      "Default": "subnet-yyyyyyyy"
    }
  },
  "Conditions": {
    "useast1": {
      "Fn::Equals": [
        {
          "Ref": "AWS::Region"
        },
        "us-east-1"
      ]
    },
    "uswest2": {
      "Fn::Equals": [
        {
          "Ref": "AWS::Region"
        },
        "us-west-2"
      ]
    }
  },
  "Resources": {
    "EC2Instance": {
      "Type": "AWS::EC2::Instance",
      "Properties": {
        "InstanceType": {
          "Ref": "InstanceType"
        },
        "NetworkInterfaces": [
          {
            "SubnetId": {
              "Fn::If": [
                "useast1",
                {
                  "Ref": "SubnetUSEAST1"
                },
                {
                  "Ref": "SubnetUSWEST2"
                }
              ]
            },
            "AssociatePublicIpAddress": "false",
            "DeviceIndex": "0"
          }
        ]
      }
    }
  }
}

答案 2 :(得分:0)

如果您能够将模板拆分为多个部分,则可以通过一些业务流程和StackSets一次将其部署到不同的区域。