Atribuindo um ip público a um ec2 em cloudformation?

4

No vpc que estou usando no aws ec2, não obtenho um endereço IP público por padrão. Estou tentando adicionar um manualmente depois de fazer referência a isto e este bit de documentação.

Atualmente, meu modelo de cloudformation inclui

"netinterface"    : {
  "Type" : "AWS::EC2::NetworkInterface",
  "Properties" : {
    "SubnetId" : {"Ref": "Subnet"}
   }


},


"billingattributionapi" : {
  "Type"        : "AWS::EC2::Instance",
  "Properties"  : {

    "NetworkInterfaces" : [
      {
        "AssociatePublicIpAddress"  : "true",
        "DeviceIndex"               : "eth0",
        "NetworkInterfaceId"        : {"Ref" : "netinterface"},
        "DeleteOnTermination"       : "true"
      }

    ]
  }
}

Há muito omitido, mas isso é tudo relevante para adicionar um ip.

Meu problema é que a documentação diz que apenas interfaces de rede com um DeviceIndex de eth0 podem ter um endereço IP público, mas usar eth0 resulta em um erro dizendo

    Encountered non numeric value for property DeviceIndex

Mas se eu definir o ID do dispositivo como 0, receberei

The associatePublicIPAddress parameter cannot be specified for a network interface with an ID

Mas se eu remover o NetworkInterfaceId e adicionar um ID de sub-rede conforme exigido pela documentação, obtenho

Network interfaces and an instance-level subnet ID may not be specified on the same request

Neste momento, não tenho ideia do que devo fazer. Segundo a documentação, minha abordagem original parece correta. Alguém já fez isso antes e pode apontar o que estou fazendo errado?

    
por Colin Murphy 20.11.2014 / 23:20

1 resposta

4

Isso é o que funciona para mim:

Defina um IP privado como o endereço IP principal no recurso "AWS :: EC2 :: Instance":

  "NetworkInterfaces" : [
                {
                    "DeleteOnTermination" : true,
                    "Description"         : "Main interface",
                    "DeviceIndex"         : "0",
                    "PrivateIpAddresses"  : [
                        {
                            "PrivateIpAddress" : {
                                "Ref" : "InternalIPAddress"
                            },
                            "Primary"          : true
                        }
                    ],
                    "GroupSet"            : [
                        {
                            "Ref" : "SecurityGroupId"
                        }
                    ],
                    "SubnetId"            : {
                        "Ref" : "VPCSubnet"
                    }
                }
            ],

Observe que a referência a "InternalIPAddress" acima é um parâmetro para passar o IP interno que a máquina deve ter. Eu não acho que seja necessário, pois sem isso, a instância irá pegar um IP através do dhcp.

Em seguida, no modelo, adicione um recurso do tipo "AWS :: EC2 :: EIP":

 "EIPExternalIP"                 : {
        "Type" : "AWS::EC2::EIP",
        "Properties" : {
            "InstanceId" : {
                "Ref" : "Instance"
            },
            "Domain"     : "vpc"
        }
    },

Você pode obter o IP externo com {"Ref": "EIPExternalIP"}

    
por 22.11.2014 / 20:35