Невозможно удалить снимок с помощью boto3 с помощью python3

#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 работает.