[PYTHON] Ich möchte eine Parameterliste aus CloudFormation-Code (yaml) erstellen.

Einführung

Ich habe versucht, eine Liste zu erstellen, indem ich nur die Informationen zu den Parametern aus der yaml-Datei von CloudFormation extrahiert habe. Es ist ein unfertiges Produkt, das je nach Schreibweise von yaml einen Fehler verursachen kann, aber ich persönlich habe den Punkt verstanden, also werde ich es hier lassen.

Referenz

Dies ist die Site, die ich beim Erstellen dieses Skripts als Referenz verwendet habe.

Skript (Python3)

Ich werde das Skript sofort vorstellen.

--Skriptfluss

paramlist.py


## command sample
## python paramlist.py test.yml

#Installieren Sie das Yaml-Modul`$ pip install pyyaml`
import yaml
import sys
import re

#Nicht tief graben
exclusionStr = "|AWSTemplateFormatVersion|Description|Type|TemplateURL|DependsOn|Mappings|Outputs|"

args = sys.argv
path = args[1]

#(1) CloudFormation-Code(yaml)Als Textdatei
f = open(path)
s0 = f.read()
f.close()

#(2) Erweitern Sie die abgekürzte Syntax (Beispiel:`!Sub` -> `Fn::Sub` , `!Ref` -> `Fn::Ref`)
s1 = re.sub("!((Sub|Ref|Join|GetAtt|FindInMap))\s", r'Fn::\1 ', s0)

#(3) Als yaml ohne abgekürzte Syntax lesen
obj = yaml.safe_load(s1)

#(4) Überprüfen Sie den Inhalt von yaml und zeigen Sie eine Liste mit Informationen unter Parameter an.
def readYaml( curObj, pathStr , exeFlg):
    try:
        if exeFlg == 0:
            for key in curObj:
                #Gehe zum nächsten Level
                curFlg = key in exclusionStr
                if not curFlg:
                    if key == "Parameters":
                        nxtFlg = 1
                    else:
                        nxtFlg = 0
                    pathStr += "/" + key
                    readYaml( curObj[key] , pathStr , nxtFlg)
        else:
            print("---- {0} ----".format( pathStr ) )
            #Parameterelemente und Werte anzeigen
            for key in curObj:
                print( "\t{0} - {1}".format(key , curObj[key] ) )
    except Exception as e:
        print("ERROR curObj = {0}, pathStr = {1}, exeFlg = {2}".format( curObj, pathStr, exeFlg ) )
        print(e)

#############################
## -------- START -------- ##
print("---- Parameter List ----" )
readYaml( obj , "" , 0 )

Ausführungsergebnis

Führen Sie das Skript mit dem folgenden CloudFormation-Code aus.

test.yml


AWSTemplateFormatVersion: "2010-09-09"
Description: cloudformation yaml sample

Parameters:
  hogePrefix:  { Type: String , Default: hogefuga123 }
  BucketUrl: { Type: String , Default: "https://hogefuga123.s3.amazonaws.com/" }
  AZName001: { Type: String , Default: ap-northeast-1a }
  AZName002: { Type: String , Default: ap-northeast-1c }
  VPCName: { Type: String , Default: vhoge01 }

Resources:
  VPC:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: !Sub "${BucketUrl}${VPCTemplate}"
      Parameters: 
        hogePrefix: !Ref hogePrefix
        BucketUrl: !Ref BucketUrl
        VPCName: !Ref VPCName

Ausführungsergebnis

$ python paramlist.py test.yml
---- Parameter List ----
---- /Parameters ----
        hogePrefix - {'Type': 'String', 'Default': 'hogefuga123'}
        BucketUrl - {'Type': 'String', 'Default': 'https://hogefuga123.s3.amazonaws.com/'}
        AZName001 - {'Type': 'String', 'Default': 'ap-northeast-1a'}
        AZName002 - {'Type': 'String', 'Default': 'ap-northeast-1c'}
        VPCName - {'Type': 'String', 'Default': 'vhoge01'}
---- /Parameters/Resources/VPC/Properties/Parameters ----
        hogePrefix - Fn::Ref hogePrefix
        BucketUrl - Fn::Ref BucketUrl
        VPCName - Fn::Ref VPCName

Bonus

[Bonus 1] Cloud9-Setup

Dies ist die Umgebungseinstellung bei Verwendung dieses Skripts in AWS Cloud9.

#Standardmäßig Python 2->Wechseln Sie zu Python 3
$ sudo alternatives --config python

$ pip -V
$ sudo pip install --upgrade pip
$ pip -V

#Installieren Sie das Yaml-Modul
$ pip install pyyaml

[Bonus 2] Wenn Sie Yaml so wie es ist laden, tritt ein Fehler auf.

Wie auf der obigen Website beschrieben, führt das Laden von CloudFormation-Code mit abgekürzter Syntax als yaml zu einem Fehler.

$ python sample.py test.yml
test.yaml
Exception occurred while loading YAML...
could not determine a constructor for the tag '!Sub'
  in "test.yaml", line 72, column 20

line.png

Das Skript, das ich erstellt habe, ist unvollständig und ich möchte sicherstellen, dass in keinem Yaml-Format Fehler vorliegen.

Recommended Posts

Ich möchte eine Parameterliste aus CloudFormation-Code (yaml) erstellen.
Ich möchte C ++ - Code aus Python-Code erstellen!
[Python] Ich möchte aus einer verschachtelten Liste einen Taple machen
Ich möchte ein Spiel mit Python machen
Ich möchte Passungen aus meinem Kopf machen
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte viele Prozesse von Python aus starten
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte eine Nachricht von Python an LINE Bot senden
Ich möchte den Wörterbuchtyp in der Liste eindeutig machen
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Python / Machen Sie ein Diktat aus einer Liste.
[Einführung] Ich möchte mit Python einen Mastodon-Bot erstellen! 【Anfänger】
Ich möchte in der Einschlussnotation drucken
Ich möchte ein Glas aus Python verwenden
Ich möchte eine Python-Umgebung erstellen
Ich möchte ein Automatisierungsprogramm erstellen!
Ich habe eine Web-API erstellt
Ich möchte nur ein Signal vom Sub-Thread zum Haupt-Thread senden
[Python-Memo] Ich möchte eine zweistellige Hexadezimalzahl aus einer Dezimalzahl erhalten
Ich möchte eine Liste in der Reihenfolge anderer Listen sortieren
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Ich möchte aus verschiedenen Sprachen eine Verbindung zu PostgreSQL herstellen
Ich möchte einfach ein Rauschmodell erstellen
Ich möchte einen DataFrame in MSSQL einfügen
Ich möchte mit Python ein Fenster erstellen
Ich möchte mit Python eine E-Mail von Google Mail senden.
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 1/3
Ich möchte keinen Codierungstest machen
Ich möchte Ceres Solver aus Python verwenden
Ich möchte eine Art von Implementierung erstellen, die angeschlossen werden kann
Ich las "Wie man ein Hacking Lab macht"
[Python] Ich möchte 7DaysToDie von Discord aus verwalten! 2/3
Ich möchte leicht einen leckeren Laden finden
Ich möchte mit Python in eine Datei schreiben
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
Ich möchte eine Django-App auf Heroku hochladen
[LINE Messaging API] Ich möchte eine Nachricht vom Programm an alle LINE senden
Ich habe eine Bibliothek zum Betreiben des AWS CloudFormation-Stacks über CUI (Python Fabric) erstellt.
Ich möchte gleichzeitig einen Musik-Player erstellen und Musik ablegen
Ich möchte eine Liste der WebDAV-Dateien im Modul Anfragen anzeigen
Ich habe ein Paket erstellt, um eine ausführbare Datei aus dem Hy-Quellcode zu erstellen
Ich möchte in Python schreiben! (1) Überprüfung des Codeformats
Ich möchte den Dateinamen von DataLoader sehen
Ich habe versucht, einen "verdammt großen Literaturkonverter" zu machen.
Ich möchte Timeout einfach in Python implementieren
Ich möchte Bilder von Katzen von Instagram erkennen
Ich möchte einen Python-Generator viele Male iterieren
Ich möchte, dass DQN Puniki einen Homerun macht
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
100 Klopfen bei der Bildverarbeitung !! (021-030) Ich möchte eine Pause machen ...
Ich möchte einem Pandas-Datenrahmen eine group_id geben
Ich möchte mit einem Knopf am Kolben übergehen
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Ich möchte in Python schreiben! (2) Schreiben wir einen Test
[Python] Ich habe ein System erstellt, um "das Rezept, das ich wirklich will" von der Rezeptseite einzuführen!
Ich möchte Leuten sagen, die mit Python direnv aus einem höheren Verzeichnis importieren möchten
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird