Sunt un începător AWS. Încercarea de a crea o instanță EC2 cu două interfețe de rețea, una ar trebui să fie publică și cealaltă privată.
Iată ce am încercat în șablonul meu YAML:
- Creați un VPC cu două subrețele
- Creați o instanță doar cu interfața de rețea privată
- Creați a doua interfață de rețea (publică) ca o altă entitate YAML
- Atașați a doua interfață de rețea la instanță
- Creați un EIP și asociați-l cu a doua interfață de rețea
Interfața de rețea publică trebuie creată ca o entitate separată pentru că trebuie să o fac !Ref în strofa de asociere EIP.
Proprietăți:
[...]
Gazdă 1:
Tip: „AWS::EC2::Instanță”
Proprietăți:
ID imagine: „ami-02541b8af977f6cdd” # Amazon Linux x86
InstanceType: „t2.micro”
AvailabilityZone: !Selectați [0, !GetAZs '']
KeyName: !Ref KeyName
Interfețe de rețea:
- SubnetId: !Ref SubnetPrivate
DeleteOnTermination: adevărat
DeviceIndex: „0”
GroupSet:
- !Ref SecurityGroup
Etichete:
- Cheie: Nume
Valoare: „simple - host1”
Host1Eth1:
Tip: „AWS::EC2::NetworkInterface”
Proprietăți:
SubnetId: !Ref SubnetPublic
GroupSet:
- !Ref SecurityGroup
Etichete:
- Cheie: Nume
Valoare: „simple - host1 eth1”
Host1Eth1Attachment:
Tip: „AWS::EC2::NetworkInterfaceAttachment”
Proprietăți:
DeleteOnTermination: adevărat
DeviceIndex: 1
NetworkInterfaceId: !Ref Host1Eth1
InstanceId: !Ref Host1
ElasticIP:
Tip: „AWS::EC2::EIP”
Proprietăți:
Domeniu: vpc
Depinde: VPCGatewayAttachment
ElasticIPAssociation:
Tip: „AWS::EC2::EIPAssociation”
Proprietăți:
EIP: !Ref ElasticIP
InstanceId: !Ref Host1
NetworkInterfaceId: !Ref Host1Eth1
Fișierul YAML complet este disponibil aici: https://gist.github.com/kmansoft/6b90b33bcf91eb0d493414ed6c3d9754
Problemă:
Odată ce stiva este creată, Instanța are EIP-ul listat ca IP public în Consolă și există un nume DNS pentru acesta. Cu toate acestea, nu mă pot conecta la instanță folosind SSH (fie prin numele gazdei, fie prin IP).
În mod ciudat, dacă omit EIP-ul din fișierul YAML și îl creez și îl asociez manual folosind Consola AWS, atunci totul funcționează.
Aveți sugestii despre cum să faceți ca EIP public să funcționeze folosind YAML?
Actualizare: am încercat să adaug Depinde: Host1Eth1Attachment
la Asociația ElasticIP
, pentru a mă asigura că comanda este aceeași ca atunci când asociez EIP-ul în Consolă.
Am primit această eroare:
Există mai multe interfețe atașate instanței „i-020622d0cf13e5185”. Vă rugăm să specificați un ID de interfață pentru operație.
chiar dacă al meu Asociația ElasticIP
specifică a NetworkInterfaceId
(si un InstanceId
).
Actualizare 2: Am încercat să-mi schimb Asociația ElasticIP
sa fie asa:
ElasticIPAssociation:
Tip: „AWS::EC2::EIPAssociation”
Proprietăți:
EIP: !Ref ElasticIP
NetworkInterfaceId: !Ref Host1Eth1
Depinde: Host1Eth1Attachment
îndepărtarea InstanceId
. Am o eroare diferită:
InstanceId nu a fost găsit în proprietăți
Acest lucru este ciudat, documentația pentru Asociația AWS::EC2::EIPA
spune ca InstanceId
este „Obligatoriu: condiționat” - „Pentru EC2-VPC, puteți specifica fie ID-ul instanței, fie ID-ul interfeței de rețea, dar nu ambele.”
Pare o eroare CloudFormation?
Actualizare 3
Aceasta - din documentația EC2 - funcționează.
PublicEIPAsociate:
Tip: „AWS::EC2::EIPAssociation”
Proprietăți:
AllocationId: !GetAtt PublicEIP.AllocationId
NetworkInterfaceId: !Ref InterfacePublic
Rețineți că nu există InstanceId
aici (ceea ce nu ar fi funcționat deoarece Instanța are două interfețe de rețea).
De asemenea, rețineți că aceste utilizări AlocationId
si nu EIP
pentru a face referire la EIP.
Documentele spun asta despre AlocationId
: „Acest lucru este necesar pentru EC2-VPC”. Pentru EIP
scrie „Acest lucru este necesar pentru EC2-Classic”. Folosesc EC2-VPC, așa că trec la AlocationId
a avut sens și a funcționat în sfârșit.