AWS CloudFormation识别另一个实例的IP - 循环依赖

时间:2015-11-24 15:15:55

标签: amazon-web-services amazon-cloudformation

我正在使用CloudFormation模板配置两个实例。 “MASTER”和“SLAVE”。

在userdata脚本中,我需要将slave的私有IP传递给master,将master的IP传递给slave。

这是我的模板:

{
  "AWSTemplateFormatVersion" : "2010-09-09",
  "Description" : "",
  "Parameters" : {
  },
  "Resources" : {
    "InstanceSecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "Default Ports",
        "SecurityGroupIngress" : [ 
        { "IpProtocol" : "tcp", "FromPort" : "22", "ToPort" : "22", "CidrIp" : "0.0.0.0/0"}
         ]
         }
         },
      "MASTER" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "Tags":[{"Key":"Name", "Value":"MASTER"}],
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "KeyName" : "mykey",
        "ImageId" : "ami-a25415cb",
        "InstanceType": "m1.large",
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
          "#!/bin/bash -ex", "\n",
          "wget https://s3.amazonaws.com/mybucket/bootstrap.sh","\n",
          "ROLE=MASTER SLAVEIP=",?????," sh bootstrap.sh","\n"
         ] ] } }
      }
      },
      "SLAVE" : {
      "Type" : "AWS::EC2::Instance",
      "Properties" : {
        "Tags":[{"Key":"Name", "Value":"SLAVE"}],
        "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
        "KeyName" : "mykey",
        "ImageId" : "ami-a25415cb",
        "InstanceType": "m1.large",
        "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
          "#!/bin/bash -ex", "\n",
          "wget https://s3.amazonaws.com/mybucket/bootstrap.sh","\n",
          "ROLE=SLAVE MASTERIP=",?????," sh bootstrap.sh","\n"
         ] ] } }
      }
      },
  },
  "Outputs" : {
  }

}

什么是正确的替代?????如果可能的话,如果没有 - 我可以使用哪种替代方案?

UPD:发现这个:{“Fn :: GetAtt”:[“MASTER”,“PrivateIp”]},它在它自己的工作正常,但失败了“模板验证错误:资源之间的循环依赖:[SLAVE, MASTER]“如果我正在尝试同时使用主IP和从属IP。

1 个答案:

答案 0 :(得分:4)

如果您正在使用VPC和子网,则可以通过为每个实例创建AWS::EC2::NetworkInterface来执行此操作。然后在用户数据中使用{ "Fn::GetAtt": [ "MyNetworkInterface", "PrimaryPrivateIpAddress" ] }来引用网络接口的内部IP地址

使用NetworkInterfaces属性

将网络接口与EC2实例相关联
...
"MasterNetInt" : {
  "Type" : "AWS::EC2::NetworkInterface",
  "Properties" : {
    "SubnetId": { "Ref" : "MySubnet" }
  }
},
"SlaveNetInt" : {
  "Type" : "AWS::EC2::NetworkInterface",
  "Properties" : {
    "SubnetId": { "Ref" : "MySubnet" }
  }
},


"Master" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
    "KeyName" : "mykey",
    "ImageId" : "ami-a25415cb",
    "InstanceType": "m1.large",
    "SubnetId": { "Ref" : "MySubnet" },
    "NetworkInterfaces": [ { "Ref" : "MasterNetInt" } ],
    "UserData": { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash -ex", "\n",
      "wget https://s3.amazonaws.com/mybucket/bootstrap.sh","\n",
      "ROLE=MASTER SLAVEIP=", { "Fn::GetAtt": [ "SlaveNetInt", "PrimaryPrivateIpAddress" ] }," sh bootstrap.sh","\n"
     ] ] } }
  }
},
"Slave" : {
  "Type" : "AWS::EC2::Instance",
  "Properties" : {
    "SecurityGroups" : [ { "Ref" : "InstanceSecurityGroup" } ],
    "KeyName" : "mykey",
    "ImageId" : "ami-a25415cb",
    "InstanceType": "m1.large",
    "SubnetId": { "Ref" : "MySubnet" },
    "NetworkInterfaces": [ { "Ref" : "SlaveNetInt" } ],
    "UserData"       : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#!/bin/bash -ex", "\n",
      "wget https://s3.amazonaws.com/mybucket/bootstrap.sh","\n",
      "ROLE=SLAVE MASTERIP=", { "Fn::GetAtt": [ "MasterNetInt", "PrimaryPrivateIpAddress" ] }," sh bootstrap.sh","\n"
     ] ] } }
  }
}
...

如果您不熟悉设置VPC和子网,请阅读以下文档:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Scenario1.html

并参考这些模板示例:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-services-us-west-2.html#d0e113371

基本要求是:

AWS::EC2::VPC
AWS::EC2::InternetGateway
AWS::EC2::VPCGatewayAttachment
AWS::EC2::RouteTable
AWS::EC2::Route
AWS::EC2::Subnet
AWS::EC2::SubnetRouteTableAssociation
AWS::EC2::NetworkAcl
AWS::EC2::SubnetNetworkAclAssociation
AWS::EC2::NetworkAclEntry

AWS::EC2::NetworkInterface
AWS::EC2::Instance