создайте пользовательского официанта в boto3, чтобы efs ждал, пока цель монтирования не будет удалена

#python-3.x #amazon-web-services #aws-lambda #boto3 #amazon-efs

Вопрос:

  1. Я должен удалить файловые системы, в которых нет тега Retain=true.
  2. Для файловых систем, для которых установлен этот тег со значением false, смонтированные целевые объекты необходимо удалить.
  3. Поскольку удаление подключаемых ресурсов требует времени, мне нужно подождать, пока я смогу удалить свой EFS. Поэтому я разработал этот пользовательский режим ожидания, пока установочные цели не будут удалены.

Вывод следующего кода

Официант не существует: TargetDeleted

Вот мой код

Заранее спасибо

 import boto3
from botocore.waiter import WaiterModel
from botocore.waiter import create_waiter_with_client

client = boto3.client('efs')

waiter_name = "TargetDeleted"
waiter_config = {
    "version": 2,
    "waiters": {
            "MountTargetDeleted": {
                  "delay": 30,
                  "operation": "DescribeMountTargets",
                  "maxAttempts": 90,
                  "acceptors": [
                    {
                      "expected": "deleted",
                      "matcher": "pathAll",
                      "state": "success",
                      "argument": "MountTargets[].LifeCycleState"
                    },
                    {
                      "expected": "updating",
                      "matcher": "pathAll",
                      "state": "failure",
                      "argument": "MountTargets[].LifeCycleState"
                    },
                    {
                      "expected": "creating",
                      "matcher": "pathAll",
                      "state": "failure",
                      "argument": "MountTargets[].LifeCycleState"
                    }
                  ]
            }
        }

}

def lambda_handler(event, context):

    response = client.describe_file_systems()
    fs=response['FileSystems']

    
    for details in fs:
        
        fid=details['FileSystemId']
        tag_response= client.describe_tags(
            FileSystemId=fid
        )
        alltags=tag_response['Tags']
        
        if {'Key': 'Retain', 'Value': 'True'} not in alltags:
            try:
                client.delete_file_system(FileSystemId=fid)
                print("The file", details['FileSystemId'],"deleted")
            except:
                print(client.describe_file_systems(FileSystemId=fid))
                response1 = client.describe_mount_targets(
                    FileSystemId=fid
                )
                
                fs1=response1['MountTargets']
                
                for detail in fs1:
                    mid=detail['MountTargetId']
                    response3 = client.delete_mount_target(
                    MountTargetId=mid
                    )
                
                try:
                    waiter_model = WaiterModel(waiter_config)
                    backup_waiter = create_waiter_with_client(waiter_name, waiter_model, client)
                    client.delete_file_system(FileSystemId=fid)
                    print("The file", details['FileSystemId'],"deleted")
                
                except Exception as e: 
                    print(e)
                    
        else:
            print("Retain tag set to True. The file", details['FileSystemId'],"cannot be deleted")

        

        
 

Комментарии:

1. почему бы вам не сделать исключение как e: печать(e) вместо печати(не работает), чтобы вы могли видеть, как создается исключение, и вы можете узнать больше о том, что не так.

2. вывод @lynkfox-Официант не существует: TargetDeleted

3. @lynkfox Я отредактировал код

Ответ №1:

Имя официанта в конфигурации должно совпадать с именем официанта.

 waiter_name = "MountTargetDeleted"
waiter_config = {
    "version": 2,
    "waiters": {
            "MountTargetDeleted": {
                  "delay": 30,
                  "operation": "DescribeMountTargets",
                  "maxAttempts": 90,
                  "acceptors": [
                    {
                      "expected": "deleted",
                      "matcher": "pathAll",
                      "state": "success",
                      "argument": "MountTargets[].LifeCycleState"
                    },
                    {
                      "expected": "updating",
                      "matcher": "pathAll",
                      "state": "failure",
                      "argument": "MountTargets[].LifeCycleState"
                    },
                    {
                      "expected": "creating",
                      "matcher": "pathAll",
                      "state": "failure",
                      "argument": "MountTargets[].LifeCycleState"
                    }
                  ]
            }
        }

}
 

Кроме того, вы можете рассмотреть возможность поиска путей для условия сбоя.