2015-10-08 1 views
0

J'essaie d'obtenir le json personnalisé de mes piles OpsWorks avec python et boto3. Obtenir le nom est ok mais si je veux obtenir le CustomJson - KeyError. Ne pas avoir une idée pourquoi.Python Boto3 OpsWorks KeyError en obtenant CustomJson

import boto3 
import traceback 

client = boto3.client('opsworks') 

response = client.describe_stacks() 

max_elements = len(response['Stacks']) 

for i in range(max_elements): 
    stack_Name = response['Stacks'][i]['Name'] # works 

    try: 
     stack_CustomJson = response['Stacks'][i]['CustomJson'] # KeyError 
    except: 
     traceback.print_exc() 

C'est la sortie de la console:

$ python3 get_custom_json.py 
Traceback (most recent call last): 
File "get_custom_json.py", line 27, in get_opsworks_details 
stack_CustomJson = response['Stacks'][i]['CustomJson'] 
KeyError: 'CustomJson' 

lecture de la documentation de http://boto3.readthedocs.org/en/latest/reference/services/opsworks.html#OpsWorks.Client.describe_stacks Je ne vois pas une différence entre « Nom » et « CustomJson », sauf que CustomJson est un objet JSON. Dois-je le transformer?

Thx à l'avance

Répondre

0

eut une brève discussion avec un développeur dans mon entreprise. J'ai eu quelques introductions de base pour m'améliorer dans le codage et python et tout ce qui doit (doit perdre certaines de mes pensées d'administrateur). Ne pas itérer sur max_elements, mieux vaut itérer au-dessus de 'stack in stack'.

for stack in response['Stacks']: 
    print(stack['CustomJson']) 

Maintenant ça marche - j'obtiendrai le json personnalisé des piles OpsWorks. Mais il y a toujours le KeyError.

Traceback (most recent call last): 
    File "get_custom_json.py", line 22, in <module> 
     get_opsworks_details() 
    File "get_custom_json.py", line 18, in get_opsworks_details 
     print(stack['CustomJson']) 
    KeyError: 'CustomJson' 

Je vais vérifier si je peux le récupérer pour voir pourquoi cela se produit. [EDIT] Spot aveugle - si une pile n'a pas de json personnalisé, KeyError se produira.

1

Vous obtenez un KeyError de temps en temps car l'élément CustomStack dans la réponse est facultatif. Si une pile personnalisée est spécifiée pour la pile, elle sera retournée. Sinon, la touche CustomStack ne sera pas disponible du tout. Vous devriez faire quelque chose comme:

if 'CustomStack' in stack: 
    # do your thing