如何使用python从cloudformation堆栈字典中获取特定字段的值

时间:2018-06-07 07:04:49

标签: python aws-sdk amazon-cloudformation

我正在使用AWS Cloudformation创建一个堆栈,并希望获得' PublicIP '的价值。从describe_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 :(得分:2)

不幸的是,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正式发布,它们从未(据我所知)更新其响应有效负载的语法。