7

Stiamo adattando le nostre applicazioni modello CloudFormation per utilizzare VPC. All'interno di questo modello abbiamo bisogno di generare in modo programmatico i blocchi CIDR utilizzati per le nostre subnet VPC, al fine di garantire che non siano in conflitto tra gli stack CloudFormation.Generazione di subnet CIDR in blocchi a livello di codice nei modelli CloudFormation (o aggiunta di interi insieme)

Il mio piano iniziale era stato quello di generare i CIDRs di stringhe di concatenare insieme, per esempio:

"ProxyLoadBalancerSubnetA" : { 
    "Type" : "AWS::EC2::Subnet", 
    "Properties" : { 
    "VpcId" : { "Ref" : "Vpc" }, 
    "AvailabilityZone" : "eu-west-1a", 
    "CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, "0.0/24" ] ] } 
    } 
}, 

Su un ulteriore esame però, abbiamo bisogno di usare un singolo VPC piuttosto che avere un VPC per ciascuno dei nostri pile .

AWS limita i VPC a utilizzare un massimo di un blocco CIDR /16 (è stato chiesto di aumentare questo limite, ma apparentemente non è possibile). Ciò significa che non è più possibile utilizzare questo metodo di concatenazione poiché ciascuno dei nostri stack richiede subnet che si estendono su più di 255 indirizzi in totale.

vorrei generare i blocchi CIDR on-the-fly, piuttosto che dover definirli come parametri al modello CloudFormation,

Un'idea che avevo era ogni pila avere un "integer base" e aggiungendo a quello per il blocco CIDR di ciascuna sottorete.

Ad esempio:

"CidrBlock" : { "Fn::Join" : [ ".", [ { "Ref" : "VpcCidrPrefix" }, { "Fn::Sum", [ { "Ref" : "VpcCidrStart" }, 3 ] }, "0/24 ] ] } 

Dove VpcCidrStart è un numero intero che imposta il valore che il terzo ottetto CIDR dovrebbe iniziare all'interno dello script, e 3 è il numero di sottorete.

Ovviamente la funzione intrinseca Fn::Sum non esiste, quindi volevo sapere se qualcuno aveva una soluzione per aggiungere interi in VPC (sembra qualcosa che non dovrebbe essere possibile, dato che CloudFormation è orientato a stringhe), o una soluzione migliore a questo enigma in generale.

risposta

2

La mia soluzione per questo tipo di problemi era utilizzare un linguaggio di programmazione legittimo per compilare un modello in un documento JSON di CloudFormation. Ho usato PHP 5.4, Twig e Symfony Console, ma YMMV.

In sostanza, fai i conti prima del tempo nel linguaggio di programmazione, quindi utilizza quei dati mentre scrivi il tuo documento JSON.

+0

avevo già iniziato a lavorare su un Applicazione "Stack Manager" per gestire le condizioni in cui gli ambienti di staging e produzione richiedono un setup leggermente diverso e per automatizzare gli "spegni" degli ambienti non di produzione di notte - quindi penso che questa soluzione abbia senso per noi. Peccato che CloudFormation manchi comunque di queste funzionalità in modo nativo. – roberthl

+0

Se non lo hai già fatto, sarebbe probabilmente una buona idea descrivere il tuo caso d'uso e presentare la tua richiesta di funzionalità sul forum ufficiale [Forum AWS CloudFormation] (https://forums.aws.amazon.com/forum. jspa? forumID = 92). So che il team di sviluppo gestisce il supporto lì. –

+0

So che è passato un po 'di tempo, ma l'ho implementato e di recente [pubblicato su GitHub] (https://github.com/royaloperahouse/stack-manager). AWS ha recentemente aggiunto la logica e la matematica di base a CloudFormation, ma è piuttosto ingombrante. – roberthl

5

Ho affrontato una situazione simile. Volevo controllare tutto dal modello senza generare il modello usando qualche script. Anche la mia gamma di input è limitata come nel tuo caso. Ho finito per mettere un orribile scribacchino. Mi vergogno a postarla qui ma se aiuta una persona in più, potrebbe valerne la pena.

avere una tabella di mappatura che farà la matematica per voi e definirlo per tutti i possibili ingressi

"Mappings" : { 
    "HorribleHackForSubtraction" : { 
     "1" : {"SubtractOne" : "0"}, 
     "2" : {"SubtractOne" : "1"}, 
     "3" : {"SubtractOne" : "2"}, 
     "4" : {"SubtractOne" : "3"}, 
     "5" : {"SubtractOne" : "4"}, 
     "6" : {"SubtractOne" : "5"}, 
     "7" : {"SubtractOne" : "6"}, 
     "8" : {"SubtractOne" : "7"}, 
     "9" : {"SubtractOne" : "8"}, 
     "10" : {"SubtractOne" : "9"}, 
     "11" : {"SubtractOne" : "10"}, 
     "12" : {"SubtractOne" : "11"}, 
     "13" : {"SubtractOne" : "12"}, 
     "14" : {"SubtractOne" : "13"}, 
     "15" : {"SubtractOne" : "14"}, 
     "16" : {"SubtractOne" : "15"}, 
    } 
}, 

È possibile fare riferimento al valore calcolato come

{ "Fn::FindInMap" : [ "HorribleHackForSubtraction", { "Ref" : "MyInputParam"}, "SubtractOne" ] } 
Problemi correlati