我正在使用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来直接获取此字段?
答案 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正式发布,它们从未(据我所知)更新其响应有效负载的语法。