Я хотел отфильтровать свои экземпляры на основе значения тега. Это завершено, и я получаю несколько ключей и значений тегов для каждого экземпляра.
Код:
client = boto3.client("ec2")
response = client.describe_instances(
Filters=[
{
'Name': 'tag:Name',
'Values': [
'myapp-*'
]
},
{
'Name': 'instance-state-name',
'Values': [
'running',
]
}
]
)['Reservations']
for ec2_reservation in response:
for ec2_instance in ec2_reservation["Instances"]:
print(ec2_instance)
Ответ: (Я намеренно удалил все остальные поля и вставил только раздел тегов ниже)
'Tags': [{'Key': 'Patch group', 'Value': 'Amazon-Linux'},
{'Key': 'Name', 'Value': 'myapp-mgmt-1'},
{'Key': 'environment', 'Value': 'devl'},
{'Key': 'ssm-managed', 'Value': 'true'},
'Tags': [{'Key': 'Patch group', 'Value': 'Amazon-Linux'},
{'Key': 'Name', 'Value': 'myapp-web-1'},
{'Key': 'environment', 'Value': 'devl'},
{'Key': 'ssm-managed', 'Value': 'true'},
Теперь, когда я пытался напечатать значение имени ключа, я не могу этого сделать. Ниже то, что я пробовал. Не могли бы вы помочь мне разобраться с этим. Может быть продублирован, но не смог найти соответствующую ссылку из других сообщений.
print(ec2_instance["Tags"][0][{'Name':'tag-key', 'Values':['Name']}])
TypeError: unhashable type: 'dict'
Я ожидаю вывод как:
'myapp-mgmt-1'
'myapp-web-1'
Я отредактировал встроенный. Я ожидаю вывода всех значений, где ключ - "Имя"
ec2_instance
дикт дикт ?
Да, это диктовка @RahulAgarwal
На самом деле я искал grep {'Key': 'Name', 'Value': '----'} эту строку из всех тегов с фильтром, примененным к Value только с использованием python
Через какое-то время я это понял. Вот полный код для справки:
Примечание. Используя boto3.resource, мне пришлось циклически переключаться между экземплярами, чтобы получить имена их тегов.
client = boto3.client("ec2")
resource = boto3.resource("ec2")
response = client.describe_instances(
Filters=[
{
'Name': 'tag:Name',
'Values': [
'myapp-*'
]
},
{
'Name': 'instance-state-name',
'Values': [
'running',
]
}
]
)['Reservations']
instanceList = []
for reservation in response:
ec2_instances = reservation["Instances"]
for instance in ec2_instances:
InstanceId = (instance['InstanceId'])
#InstanceState = (instance['State']['Name'])
#InstanceLaunchTime = (instance['LaunchTime'])
ec2instance = resource.Instance(InstanceId)
InstanceName = []
for tags in ec2instance.tags:
if tags["Key"] == 'Name':
InstanceName = tags['Value']
fInstance = (InstanceName, InstanceId)
InstanceDetails = (",".join(fInstance))
instanceList.append(fInstance)
print(json.dumps(instanceList, indent=4))
На данный момент это работает для меня. Пожалуйста, дайте мне знать, если у вас есть лучший способ.
Я не понимаю, чего вы хотите... не могли бы вы опубликовать пример вывода