2013-08-02 53 views
3

我想將我的AWS設置爲自動縮放EC2實例(Windows Server 2012)。問題在於他們需要將他們的IP地址添加到安全組,以便他們可以與另一個EC2進行通信。如何自動將自動擴展的EC2實例添加到安全組?

  1. 有沒有一種方法可以通過自動縮放功能自動處理這個問題? (我能找到的最接近的是爲新實例分配一個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,我不想使用其他第三方軟件。

+2

是否有原因讓您無法添加規則來授權給定安全組中的所有實例?您是否嘗試設置跨區域訪問權限? – datasage

+0

我願意接受這個選擇。我留在同一地區。我只是不知道該怎麼做(我對AWS EC2很陌生)。我以爲我只能將IP地址添加到安全組。 – wisbucky

+1

它的作用類似於添加一個IP,您可以指定您的安全組ID(以sg-XXXXXX開頭)。 – datasage

回答

4

創建一個名爲web的安全組。舉例來說,可以說該組的id是:sg-7aa91911

創建一個名爲db的安全組。 向sg-7aa91911的源端口1433的db安全組添加新規則創建自動縮放啓動配置,並將SecurityGroups設置爲sg-7aa91911和您需要的任何其他配置。

使用該啓動配置創建自動調節組。

我寫了一個快速的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"} 
      } 
     ] 
     } 
    } 
    } 
} 
+1

感謝您的詳細示例。最後,我最大的問題是我試圖使用公有IP連接到「DB」。我終於意識到,當您使用安全組規則時會出現一個怪癖,您必須使用Public DNS或Private DNS/IP。 – wisbucky