json - 适用于 EC2 的 CloudFormation 模板 (JSON),具有 VPC、子网和安全组选择

标签 json amazon-web-services amazon-ec2 aws-cloudformation

我正在尝试在 JSON 中设置一个支持 EC2 实例的 CloudFormation 模板,刚刚开始,但在选择 VPC 和子网时遇到问题。最终,这将成为跨多个帐户使用的模板,每个帐户都有多个 VCP 和子网。所有账户均无默认 VPC。

我希望模板提示输入 VPC,然后根据 VPC 迭代有效子网。我一直在处理这篇亚马逊博客文章:Looking up information on AWS CloudFormation stack parameters using AWS Lambda | AWS Management Tools Blog

但是,我似乎无法让它发挥作用。我已按照本文所述设置了具有正确角色的 Lambda 函数,但收到错误“此用户没有默认 VPC”。我也愿意采用更简单的方法来使其发挥作用。

{
   "AWSTemplateFormatVersion":"2010-09-09",
   "Description":"EC2 CloudFormation Template - Version 1.0",
   "Metadata":{},
   "Parameters":{
      "InstanceType":{
         "Description":"EC2 instance type",
         "Type":"String",
         "Default":"t2.small",
         "AllowedValues":[
            "t1.micro",
            "t2.nano",
            "t2.micro",
            "t2.small",
            "t2.medium",
            "t2.large"
         ],
         "ConstraintDescription":"must be a valid EC2 instance type."
      },
      "VpcName" : {
        "Type" : "AWS::EC2::VPC::Id",
        "Description" : "Select the VPC for this EC2 Instances"
      },
      "SubnetName" : {
        "Type" : "AWS::EC2::Subnet::Id",
        "Description" : "The list of SubnetIds"
      }
    },
   "Mappings":{},
   "Conditions":{},
   "Resources":{
     "VcpInfo" : {
       "Type" : "Custom::VcpInfo",
       "Properties" : {
         "ServiceToken" : "arn:aws:lambda:us-east-1:206765214992:function:Test_GetAtt",
         "NameFilter" : { "Ref": "VpcName" }
       }
     },
     "SubnetInfo" : {
       "Type" : "Custom::SubnetInfo",
       "Properties" : {
         "ServiceToken" : "arn:aws:lambda:us-east-1:206765214992:function:Test_GetAtt",
         "NameFilter" : { "Ref": "SubnetName" }
       }
      },
      "EOTSSEC2":{
         "Type":"AWS::EC2::Instance",
         "Properties":{
            "DisableApiTermination":"false",
            "ImageId":"ami-06bee8e1000e44ca4",
            "InstanceType":{ "Ref":"InstanceType"  },
            "Monitoring":"true"
         }
      }
    },
    "Outputs":{
     "VCPCidrBlock" : {
       "Description" : "VCP CidrBlock",
       "Value" : "!GetAtt VcpInfo.CidrBlock"
     },
     "SubnetAvailabilityZon" : {
       "Description" : "Subnet AvailabilityZone",
       "Value" : "!GetAtt SubnetInfo.AvailabilityZone"
     },
     "SubnetCidrBlock" : {
       "Description" : "Subnet CidrBlock",
       "Value" : "!GetAtt SubnetInfo.CidrBlock"
     },
     "SubnetVpcId" : {
       "Description" : "Subnet VpcId",
       "Value" : "!GetAtt SubnetInfo.VpcId"
     }
   }
}

我希望系统提示我输入 VPC,然后向我提供有效的子网列表。

最佳答案

该博文展示了如何获取有关特定资源的属性信息(例如子网),然后在模板中的其他位置使用这些属性,例如在“输出”部分中显示有关这些资源的更多信息选择的资源。

但是,不可能调用自定义资源来操作Parameters 部分。这是因为参数是在构建堆栈之前收集的。

因此,如果您希望提示输入 VPC,然后仅使用属于该 VPC 的子网列表填充子网参数,那么抱歉 - 这是不可能的。

欢迎您创建自己的“前端”,向用户询问信息,包括上述能力,然后调用 CloudFormation 使用所需参数创建堆栈,但事实并非如此可以将自定义逻辑添加到 CloudFormation 管理控制台内的参数。

关于json - 适用于 EC2 的 CloudFormation 模板 (JSON),具有 VPC、子网和安全组选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56569604/

相关文章:

javascript - 向 html 文本区域添加换行符

javascript - 使用动态键解析 JSON 字符串

c# - JSON.parse Html 内容

java - 如何在配置单元中使用 serde 上传 twitter json 数据?

python - 使用 boto 时,长时间运行的客户端对象是否安全?

postgresql - 在 Amazon EC2/Google Compute Engine 中设置 XNAT

linux - 如何从 S3 存储桶中已上传的 VMDK 镜像创建实例

amazon-web-services - Cloudfront 同一存储桶中的多个源

amazon-web-services - 通过 CloudFormation 在启动模板中具有容量预留的 EKS 托管节点组不使用容量预留

amazon-web-services - 如何在启动时为root用户设置环境变量?