AWS Cloudformation:将 AMI 作为参数,否则回退到使用 Map

AWS Cloudformation: Take an AMI as a parameter, otherwise fallback to using a Map

我想按以下方式设置 Cloudformation 模板:

1) 检查用户的参数。如果提供,请使用它。

2) 如果未提供任何参数,则退回到使用如下所示的映射:

  AWSRegionArch2AMI:
    eu-central-1:
      HVM64: ami-d11dc4ff
    us-east-1:
      HVM64: ami-a13749a2
    us-west-1:
      HVM64: ami-fdd8428a

这里的重要部分是每个区域的默认值;我需要跨区域使用模板,所以我需要有区域特定的默认值。

有人知道执行此操作的好方法吗?

您可以使用 Conditions 完成此操作。基本上,您根据您定义的检查定义一个为真或假的变量,然后您可以根据该值创建模板分支。

下面是一个使用 AMI 选择方法创建单个 EC2 实例的示例模板:

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Description": "Example mostly pulled from http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-sample-templates.html",
    "Mappings": {
        "AWSRegionArch2AMI": {
            "eu-central-1": {"HVM64": "ami-d11dc4ff"},
            "us-east-1": {"HVM64": "ami-a13749a2"},
            "us-west-1": {"HVM64": "ami-fdd8428a"}
        }
    },
    "Parameters": {
        "AMI": {
            "Description": "AMI to use.",
            "AllowedPattern": "(ami-[0-9a-f]{8}){0,1}",
            "Default": "",
            "Type": "String"
        }
    },
    "Conditions": {
        "UseDefaultAMI": {
            "Fn::Equals": [
                {"Ref": "AMI"},
                ""
            ]
        }
    },
    "Resources": {
        "EC2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "ImageId": {
                    "Fn::If": [
                        "UseDefaultAMI",
                        {"Fn::FindInMap": [
                                "AWSRegionArch2AMI",
                                {"Ref": "AWS::Region"},
                                "HVM64"
                        ]},
                        {"Ref": "AMI"}
                    ]
                },
                "InstanceType": "m3.medium"
            }
        }
    }
}