[PYTHON] Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)

introduction

J'ai essayé de faire une liste en extrayant uniquement les informations sur les paramètres du fichier yaml de CloudFormation. C'est un produit inachevé qui peut causer une erreur selon la façon d'écrire yaml, mais j'ai personnellement compris le point, donc je vais le laisser ici.

référence

C'est le site que j'ai utilisé comme référence lors de la création de ce script.

Script (Python3)

Immédiatement, je présenterai le script.

paramlist.py


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

#installer le module yaml`$ pip install pyyaml`
import yaml
import sys
import re

#Ne creuse pas profondément
exclusionStr = "|AWSTemplateFormatVersion|Description|Type|TemplateURL|DependsOn|Mappings|Outputs|"

args = sys.argv
path = args[1]

#(1) Code CloudFormation(yaml)En tant que fichier texte
f = open(path)
s0 = f.read()
f.close()

#(2) Étendez la syntaxe abrégée (exemple:`!Sub` -> `Fn::Sub` , `!Ref` -> `Fn::Ref`)
s1 = re.sub("!((Sub|Ref|Join|GetAtt|FindInMap))\s", r'Fn::\1 ', s0)

#(3) Lire comme yaml sans syntaxe abrégée
obj = yaml.safe_load(s1)

#(4) Vérifiez le contenu de yaml et affichez une liste d'informations sous Paramètres.
def readYaml( curObj, pathStr , exeFlg):
    try:
        if exeFlg == 0:
            for key in curObj:
                #Passer au niveau suivant
                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 ) )
            #Afficher les éléments et les valeurs des paramètres
            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 )

Résultat d'exécution

Exécutez le script sur le code CloudFormation ci-dessous.

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

Résultat d'exécution

$ 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

prime

[Bonus 1] Configuration de Cloud9

Il s'agit du paramètre d'environnement lors de l'utilisation de ce script sur AWS Cloud9.

#Par défaut sur Python 2->Passer à Python 3
$ sudo alternatives --config python

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

#Installer le module yaml
$ pip install pyyaml

[Bonus 2] Si vous chargez yaml tel quel, une erreur se produira.

Comme présenté sur le site ci-dessus, le chargement de code CloudFormation contenant une syntaxe abrégée en yaml entraînera une erreur.

$ 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

Le script que j'ai créé est incomplet et je veux m'assurer qu'il n'y a aucune erreur dans aucun format yaml.

Recommended Posts

Je souhaite créer une liste de paramètres à partir du code CloudFormation (yaml)
Je veux créer du code C ++ à partir de code Python!
[Python] Je veux faire d'une liste imbriquée un taple
Je veux faire un jeu avec Python
Je veux faire des crises de ma tête
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer beaucoup de processus à partir de python
Je veux faire une macro de clic avec pyautogui (désir)
Je veux faire une macro de clic avec pyautogui (Outlook)
Je veux installer le package de requirements.txt avec poésie
Je souhaite envoyer un message de Python à LINE Bot
Je veux rendre le type de dictionnaire dans la liste unique
Je veux ajouter un joli complément à input () en python
python / Créer un dict à partir d'une liste.
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
Je veux imprimer dans la notation d'inclusion
Je veux utiliser jar de python
Je veux créer un environnement Python
Je veux faire un programme d'automatisation!
J'ai créé une API Web
Je souhaite envoyer un signal uniquement du sous-thread au thread principal
[Mémo Python] Je souhaite obtenir un nombre hexadécimal à 2 chiffres à partir d'un nombre décimal
Je souhaite trier une liste dans l'ordre des autres listes
Je souhaite créer une application Web en utilisant React et Python flask
Je souhaite me connecter à PostgreSQL à partir de plusieurs langues
Je souhaite créer facilement un modèle de bruit
Je veux INSÉRER un DataFrame dans MSSQL
Je veux créer une fenêtre avec Python
Je souhaite envoyer un e-mail depuis Gmail en utilisant Python.
[Python] Je veux gérer 7DaysToDie depuis Discord! 1/3
Je ne veux pas passer un test de codage
Je veux utiliser le solveur ceres de python
Je souhaite créer un type d'implémentation pouvant être branché
J'ai lu "Comment créer un laboratoire de piratage"
[Python] Je veux gérer 7DaysToDie depuis Discord! 2/3
Je veux trouver facilement une délicieuse boutique
Je veux écrire dans un fichier avec Python
J'ai créé un jeu ○ ✕ avec TensorFlow
Je souhaite télécharger une application Django sur heroku
[LINE Messaging API] Je souhaite envoyer un message du programme à tout le monde LINE
J'ai créé une bibliothèque pour faire fonctionner la pile AWS CloudFormation à partir de CUI (Python Fabric)
Je veux créer un lecteur de musique et enregistrer de la musique en même temps
Je souhaite voir une liste de fichiers WebDAV dans le module Requêtes
J'ai créé un package pour créer un fichier exécutable à partir du code source Hy
Je veux écrire en Python! (1) Vérification du format de code
Je veux voir le nom de fichier de DataLoader
J'ai essayé de faire un "putain de gros convertisseur de littérature"
Je veux facilement implémenter le délai d'expiration en python
Je veux détecter des images de chats d'Instagram
Je veux répéter plusieurs fois un générateur Python
Je veux que DQN Puniki frappe un home run
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
100 coups sur le traitement d'image !! (021-030) Je veux faire une pause ...
Je veux donner un group_id à une trame de données pandas
Je veux faire la transition avec un bouton sur le ballon
Je veux escalader une montagne avec l'apprentissage par renforcement
Je veux écrire en Python! (2) Écrivons un test
[Python] J'ai créé un système pour introduire "la recette que je veux vraiment" depuis le site de recettes!
Je veux dire aux gens qui souhaitent importer depuis un répertoire supérieur avec Python direnv
[Mac] Je souhaite créer un serveur HTTP simple qui exécute CGI avec Python