如何在python boto3中迭代嵌套字典
Hi希望只查找停止的实例,并且它们的ID如下所示为嵌套的JSON如何在python boto3中迭代嵌套字典,python,python-3.x,amazon-web-services,boto3,boto,Python,Python 3.x,Amazon Web Services,Boto3,Boto,Hi希望只查找停止的实例,并且它们的ID如下所示为嵌套的JSON { "Reservations": [ { "Groups": [], "Instances": [ { "AmiLaunchIndex": 0, "Architecture": "x86_64", "BlockDeviceMappings&q
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"AttachTime": "2021-03-11 09:43:59+00:00",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-0c49ff5c979904337"
}
}
],
"CapacityReservationSpecification": {
"CapacityReservationPreference": "open"
},
"ClientToken": "",
"CpuOptions": {
"CoreCount": 1,
"ThreadsPerCore": 1
},
"EbsOptimized": false,
"EnaSupport": true,
"EnclaveOptions": {
"Enabled": false
},
"HibernationOptions": {
"Configured": false
},
"Hypervisor": "xen",
"ImageId": "ami-038f1ca1bd58a5790",
"InstanceId": "i-041fb789f1554b7d5",
"InstanceType": "t2.micro",
"KeyName": "HadoopLearning",
"LaunchTime": "2021-03-11 09:43:58+00:00",
"MetadataOptions": {
"HttpEndpoint": "enabled",
"HttpPutResponseHopLimit": 1,
"HttpTokens": "optional",
"State": "applied"
},
"Monitoring": {
"State": "disabled"
},
"NetworkInterfaces": [
{
"Attachment": {
"AttachTime": "2021-03-11 09:43:58+00:00",
"AttachmentId": "eni-attach-022ac34489909cc78",
"DeleteOnTermination": true,
"DeviceIndex": 0,
"NetworkCardIndex": 0,
"Status": "attached"
},
"Description": "",
"Groups": [
{
"GroupId": "sg-5878120b",
"GroupName": "default"
}
],
"InterfaceType": "interface",
"Ipv6Addresses": [],
"MacAddress": "0a:15:95:72:23:6b",
"NetworkInterfaceId": "eni-0d356de72ae7e6bfc",
"OwnerId": "216808211954",
"PrivateDnsName": "ip-172-31-29-51.ec2.internal",
"PrivateIpAddress": "172.31.29.51",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateDnsName": "ip-172-31-29-51.ec2.internal",
"PrivateIpAddress": "172.31.29.51"
}
],
"SourceDestCheck": true,
"Status": "in-use",
"SubnetId": "subnet-e705ccaa",
"VpcId": "vpc-4401543e"
}
],
"Placement": {
"AvailabilityZone": "us-east-1d",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-172-31-29-51.ec2.internal",
"PrivateIpAddress": "172.31.29.51",
"ProductCodes": [],
"PublicDnsName": "",
"RootDeviceName": "/dev/xvda",
"RootDeviceType": "ebs",
"SecurityGroups": [
{
"GroupId": "sg-5878120b",
"GroupName": "default"
}
],
"SourceDestCheck": true,
"State": {
"Code": 80,
"Name": "stopped" ####this one only which is stopped ###
},
"StateReason": {
"Code": "Client.UserInitiatedShutdown",
"Message": "Client.UserInitiatedShutdown: User initiated shutdown"
},
"StateTransitionReason": "User initiated (2021-03-11 10:13:00 GMT)",
"SubnetId": "subnet-e705ccaa",
"Tags": [
{
"Key": "Name",
"Value": "aviral"
}
],
"VirtualizationType": "hvm",
"VpcId": "vpc-4401543e"
},
{
"AmiLaunchIndex": 1,
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/xvda",
"Ebs": {
"AttachTime": "2021-03-11 09:43:59+00:00",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-069a9ca7f860fefd8"
}
}
],
"CapacityReservationSpecification": {
"CapacityReservationPreference": "open"
},
"ClientToken": "",
"CpuOptions": {
"CoreCount": 1,
"ThreadsPerCore": 1
},
"EbsOptimized": false,
"EnaSupport": true,
"EnclaveOptions": {
"Enabled": false
},
"HibernationOptions": {
"Configured": false
},
"Hypervisor": "xen",
"ImageId": "ami-038f1ca1bd58a5790",
"InstanceId": "i-0d0c876682eef71ae",
"InstanceType": "t2.micro",
"KeyName": "HadoopLearning",
"LaunchTime": "2021-03-11 09:43:58+00:00",
"MetadataOptions": {
"HttpEndpoint": "enabled",
"HttpPutResponseHopLimit": 1,
"HttpTokens": "optional",
"State": "applied"
},
"Monitoring": {
"State": "disabled"
},
"NetworkInterfaces": [
{
"Attachment": {
"AttachTime": "2021-03-11 09:43:58+00:00",
"AttachmentId": "eni-attach-0b0eba3fb5b3c3205",
"DeleteOnTermination": true,
"DeviceIndex": 0,
"NetworkCardIndex": 0,
"Status": "attached"
},
"Description": "",
"Groups": [
{
"GroupId": "sg-5878120b",
"GroupName": "default"
}
],
"InterfaceType": "interface",
"Ipv6Addresses": [],
"MacAddress": "0a:3d:3e:bc:96:e3",
"NetworkInterfaceId": "eni-0688951c8bd226676",
"OwnerId": "216808211954",
"PrivateDnsName": "ip-172-31-19-102.ec2.internal",
"PrivateIpAddress": "172.31.19.102",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateDnsName": "ip-172-31-19-102.ec2.internal",
"PrivateIpAddress": "172.31.19.102"
}
],
"SourceDestCheck": true,
"Status": "in-use",
"SubnetId": "subnet-e705ccaa",
"VpcId": "vpc-4401543e"
}
],
"Placement": {
"AvailabilityZone": "us-east-1d",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-172-31-19-102.ec2.internal",
"PrivateIpAddress": "172.31.19.102",
"ProductCodes": [],
"PublicDnsName": "",
"RootDeviceName": "/dev/xvda",
"RootDeviceType": "ebs",
"SecurityGroups": [
{
"GroupId": "sg-5878120b",
"GroupName": "default"
}
],
"SourceDestCheck": true,
"State": {
"Code": 80,
"Name": "running" ###Not this one #####
},
"StateReason": {
"Code": "Client.UserInitiatedShutdown",
"Message": "Client.UserInitiatedShutdown: User initiated shutdown"
},
"StateTransitionReason": "User initiated (2021-03-11 10:13:00 GMT)",
"SubnetId": "subnet-e705ccaa",
"Tags": [
{
"Key": "Name",
"Value": "avinash"
}
],
"VirtualizationType": "hvm",
"VpcId": "vpc-4401543e"
}
],
"OwnerId": "216808211954",
"ReservationId": "r-0d646190512fec9f8"
}
],
"ResponseMetadata": {
"HTTPHeaders": {
"cache-control": "no-cache, no-store",
"content-type": "text/xml;charset=UTF-8",
"date": "Thu, 11 Mar 2021 10:14:39 GMT",
"server": "AmazonEC2",
"strict-transport-security": "max-age=31536000; includeSubDomains",
"transfer-encoding": "chunked",
"vary": "accept-encoding",
"x-amzn-requestid": "58065d1d-76fc-4f7a-9229-18584ee1031e"
},
"HTTPStatusCode": 200,
"RequestId": "58065d1d-76fc-4f7a-9229-18584ee1031e",
"RetryAttempts": 0
}
}
我只想要那些被停止的人的一个实例,然后我想要使用boto3使用他们的实例ID启动他们
我正在使用下面的代码
import boto3
import json
access_key = "XXXXXXXXXX"
secret_key = "XXXXXXXXXXXXXXXXXXXXX"
client = boto3.client('ec2', aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name='us-east-1')
ec2_result = client.describe_instances(
Filters=[
{
'Name': 'tag:Name',
'Values': ['?avi*']
}
]
)
#ids= [ec2_result['Reservations'][0]['Instances'][i]['InstanceId'] for i in range(len(ec2_result['Reservations'][0]['Instances']))]
#print(ids)
print(ec2_result)
使用上面的代码,我得到了第一个块JSON,但我只想要一个停止的实例,因为我的AWS中有4000个实例,我认为以下应该可以工作:
instances_stopped = []
for reservation in ec2_result['Reservations']:
for instance in reservation['Instances']:
instance_id = instance['InstanceId']
if 'State' not in instance:
print(f"Missing state for {instance_id}")
else:
state = instance['State']['Name']
if state == 'stopped':
instances_stopped.append(instance_id)
#print(instance_id, state)
print(instances_stopped)
请尽快删除问题中的访问密钥和秘密密钥谢谢你能建议解决方案吗请你生成新的访问密钥,并删除/删除已烧掉的密钥。好的@Marcin非常感谢,我只在这里等你,请提供输入,要求是我想要所有被停止的实例,名称从avi开始,它们被停止,然后我想要启动它们。你又做了一次,谢谢它现在正在工作。现在指导我如何在python中变得很棒,就像you@RahultheSWE没问题。python使用得越多,您就会变得越好。现在看起来很难,明年您可能要回答专家级的python问题,所以:-)