Как получить значение определенного поля из словаря стека облачной информации с помощью Python - PullRequest
0 голосов
/ 07 июня 2018

Я использую AWS Cloudformation для создания стека и хотел бы получить значение поля ' PublicIP ' из словаря, возвращаемого методом description_stacks ().Следующий схематический код работает, но он не устойчив к изменениям в структуре словаря:

#!/usr/bin/python
import sys
import boto3
import rest_client

if len(sys.argv) < 2:
    print "Bad usage: missing stack name"
    exit(1)

session = boto3.Session(profile_name='profile name')
client = session.client('cloudformation')
response = client.describe_stacks(StackName=sys.argv[1])

try:
    ip = response['Stacks'][0]['Outputs'][1]['OutputValue']
    print "Extracted instance IP address ({0})".format(ip)

except IndexError:
    print "IP address not found"
    exit(1)

Есть ли более конкретный API, который я могу использовать, чтобы получить это поле напрямую?

1 Ответ

0 голосов
/ 07 июня 2018

К сожалению, AWS не поддерживает фильтрацию выходных данных по имени.Но довольно просто сделать фильтр, который будет:

#!/usr/bin/python
import sys
import boto3
import rest_client

OUTPUT_KEY = 'InstanceIp'  # <-- Use the proper output name here

if len(sys.argv) < 2:
    print "Bad usage: missing stack name"
    exit(1)

stack_name = sys.argv[1]
session = boto3.Session(profile_name='profile name')
cf_resource = session.resource('cloudformation')
stack = cf_resource.Stack(stack_name)

try:
    ip = filter(lambda x: x['OutputKey'] == OUTPUT_KEY, stack.outputs)[0]['OutputValue']
    print "Extracted instance IP address ({0})".format(ip)

except IndexError:
    print OUTPUT_KEY + " not found in " + stack_name
    exit(1)

Кроме того, я могу заверить вас, что он ориентирован на будущее, поскольку они никогда (насколько мне известно) никогда не обновляют синтаксис своих ответных полезных нагрузок после APIофициально выпущен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...