#python-3.x #amazon-web-services #syntax #boto3
#python-3.x #amazon-веб-сервисы #синтаксис #boto3
Вопрос:
Я использую boto3
на python3 для удаления snapshop, при попытке удалить его получаю ошибку ниже (этот синтаксис работал только в python2 boto):
Tracebak (most recent call last):
File "./snapshotcleanup.py"m line 158, in <module>
s.delete()
AttributeError: 'dict' object has no attribute 'delete'
Код :
connection = myinternalclient (User, pass)
// Custom function for connection, you may consider ec2 = boto3.client('ec2')
res = connection.describe_snapshots(OwnersIds=[XX], Filters=[{'Name' : 'tag:Name', 'Value' : ["nonimp*"]'}])
for s in res['Snapshots']:
for tag in s['Tags']:
if 'nonprod' in tag.value():
s.delete()
print("[Deleted Snapshot]: %s" % s['SnapshotId'])
Этого синтаксиса нет в boto3?
Комментарии:
1. Можете ли вы показать фактический код, который выдает ошибку?
2. Добавлен код @Marcin, можете ли вы это проверить
3. Можете ли вы поделиться тем, как вы получаете
res
?4. @Marcin добавил подключение к res
Ответ №1:
Чтобы удалить снимок, вы можете использовать метод delete_snapshot.
Например:
ec2 = boto3.client('ec2')
for s in res['Snapshots']:
for tag in s['Tags']:
if tag['Value'] == 'nonprod':
ec2.delete_snapshot(SnapshotId=s['SnapshotId'])
print("[Deleted Snapshot]: %s" % s['SnapshotId'])
Пожалуйста, дважды проверьте код, поскольку возможны ошибки, поскольку можно случайно удалить неправильные снимки.
Вышеизложенное предполагает, что теги имеют форму ( Key
не проверено в приведенном выше коде):
{
'Key': 'env',
'Value': 'nonprod'
}
Комментарии:
1.
ec2 = boto3.client('ec2')
Нужна строка?, почему не удается использоватьres
?s['SnapshotId']
переменная указывает, что snapshotid должен быть удален, поэтому могу ли я передать идентификатор какres.delete_snapshot(SnapshotId=s['SnapshotId'])
2. @Nullpointer ПРИВЕТ.
res
это всего лишь словарь значений. Удаление значений из него не приведет к удалению снимков в AWS. Для этого вы должны вызвать AWS API. Вы можете использоватьdelete_snahoshot
или альтернативно,delete
на объекте Snapshot , который вам также необходимо явно создать. В любом случае, вы не можете использоватьs.delete()
, потому что он не вызывает AWS API.3. @Nullpointer вы можете повторно использовать
connection
объект. Я думаю, что это то же самое, что и у меняec2
, хотя это не совсем показано в вашем вопросе.4. перед
res
строкой, использованнойconnection = myinternalclient (User, pass)
, Так вот возможно ли это какconnection.delete_snapshot(SnapshotId=s['SnapshotId'])
? Здесь я пытаюсь избежать использования `ec2 = boto3.client (‘ec2’)`5. @Nullpointer Я вижу, что это
connection
пользовательский объектmyinternalclient (User, pass)
. Таким образом, я не знаю, можете ли вы использовать повторно или нет. Если нет, придется создать нового клиента. Аналогично, если вашdescribe_snapshots
отличается от describe_snapshots от boto3 , то невозможно дать правильный ответ, поскольку только вы знаете, какmyinternalclient
работает.