【问题标题】:How to automatically add an autoscaled EC2 instance to a Security Group?如何自动将自动扩展的 EC2 实例添加到安全组?
【发布时间】:2013-08-03 03:11:10
【问题描述】:

我想将我的 AWS 设置为自动扩展 EC2 实例 (Windows Server 2012)。问题是他们需要将自己的 IP 地址添加到安全组中,这样他们才能与另一个 EC2 进行通信。

  1. AWS 是否可以通过其自动缩放功能自动处理此问题? (我能找到的最接近的方法是将 IAM 角色分配给新实例,但我不能将 IAM 角色添加到安全组,我只能添加 IP 地址。)

  2. 我目前正在研究的方法是使用 AWS CLI(命令行)作为启动脚本。

    ec2-authorize mySecurityGroup -p 1433 -s xx.xx.xx.xx/32
    

但是如何获取当前实例的公网 IP 呢?是否有 AWS CLI 命令可以获取此信息?我宁愿不依赖像“curl echoip.com”这样的外部网站。我听说过 ec2-metadata,但我认为它不适用于 Windows,而且我不想使用其他第三方软件。

【问题讨论】:

  • 您是否有理由无法添加规则以授权给定安全组中的所有实例?您是否尝试设置跨区域访问?
  • 我对这个选项持开放态度。我住在同一个地区。我只是不知道该怎么做(我对 AWS EC2 很陌生)。我以为我只能将 IP 地址添加到安全组中。
  • 它的工作方式类似于添加一个 ip,而不是您需要指定您的安全组 ID(以 sg-XXXXXX 开头)。
  • Arg,终于找到问题所在了。当您在规则中使用安全组(而不是 IP 地址)时,您无法使用公共 IP 来引用该实例。我一直在使用公共 IP 引用该实例(因为它与 IP 地址安全规则一起使用),这就是让我一直感到厌烦的原因。他们应该更好地记录这个怪癖!
  • @wisbucky 您始终可以使用公共主机名。从同一 AWS 区域内解析时,它将解析为私有 IP。

标签: amazon-web-services amazon-ec2 ec2-api-tools


【解决方案1】:

创建一个名为 web 的安全组。举个例子,假设该组的 id 是:sg-7aa91911

创建一个名为 db 的安全组。 将新规则添加到端口 1433 的 db 安全组,源为 sg-7aa91911

创建一个 Autoscaling 启动配置并将 SecurityGroups 设置为 sg-7aa91911 和您需要的任何其他配置。

使用该启动配置创建 Autoscaling 组。

我编写了一个快速 CloudFormation 模板来完成这项任务。您应该能够只运行它,它将创建一个带有连接的安全组的 Autoscaling 组。它还将创建一个空白实例,您可以在其中存储您的数据库。

如果您不想使用 CloudFormation 模板,只需查看定义安全组的位置即可。它显示了如何连接 2 个安全组

{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "test tempalte",

  "Parameters" : {
    "KeyName" : {
      "Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instance",
      "Type" : "String"
    }
  },

  "Mappings" : {
    "RegionMap" : {
      "us-east-1"      : { "AMI" : "ami-7f418316" },
      "us-west-1"      : { "AMI" : "ami-951945d0" },
      "us-west-2"      : { "AMI" : "ami-16fd7026" },
      "eu-west-1"      : { "AMI" : "ami-24506250" },
      "sa-east-1"      : { "AMI" : "ami-3e3be423" },
      "ap-southeast-1" : { "AMI" : "ami-74dda626" },
      "ap-northeast-1" : { "AMI" : "ami-dcfa4edd" }
    }
  },

  "Resources" : {
    "WebServerGroup" : {
      "Type" : "AWS::AutoScaling::AutoScalingGroup",
      "Properties" : {
        "AvailabilityZones" : { "Fn::GetAZs" : "" },
        "LaunchConfigurationName" : { "Ref" : "LaunchConfig" },
        "MinSize" : "1",
        "MaxSize" : "10",
        "DesiredCapacity" : "1"
      }
    },

    "LaunchConfig" : {
      "Type" : "AWS::AutoScaling::LaunchConfiguration",
      "Properties" : {
        "InstanceType" : "m1.small",
        "KeyName" : { "Ref" : "KeyName" },
        "SecurityGroups" : [ {"Ref" : "websg"} ],
        "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}
      }
    },
    "Ec2Instance" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "KeyName" : { "Ref" : "KeyName" },
        "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]},
        "UserData" : { "Fn::Base64" : "80" }
      }
    },

    "websg" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Enable SSH and access, 8080, and 80",
        "SecurityGroupIngress" : [
          {"IpProtocol" : "tcp", "FromPort" : "8080", "ToPort" : "8080", "CidrIp" : "0.0.0.0/0"},
          {"IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0"},
          {"IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0"}
        ]
      }
    },
    "dbsg" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Port opened only to security group",
        "SecurityGroupIngress" : [
          {"IpProtocol" : "tcp", "FromPort" : "1433", "ToPort" : "1433", "SourceSecurityGroupName" : {"Ref" : "websg"}
          }
        ]
      }
    }
  }
}

【讨论】:

  • 感谢您的详细示例。最后,我最大的问题是我试图使用其公共 IP 连接到“数据库”。我终于意识到使用安全组规则时有一个怪癖,您必须使用公共 DNS 或私有 DNS/IP。
猜你喜欢
  • 2021-06-08
  • 2017-04-13
  • 2021-05-29
  • 2017-10-16
  • 2016-04-19
  • 1970-01-01
  • 2018-04-26
  • 2022-01-20
  • 1970-01-01
相关资源
最近更新 更多