Невозможно удалить политику ролей AWS — NoSuchEntity с Boto3

Я не могу удалить политику ролей из своей учетной записи AWS с помощью Boto3. Я получаю сообщение об ошибке:

botocore.errorfactory.NoSuchEntityException: Произошла ошибка (NoSuchEntity) при вызове операции DeleteRolePolicy: не удается найти политику роли с именем pottoman9000Policy.

Политика и роль создаются и удаляются в рамках одного сценария. Политика отсоединяется до того, как появится этот конкретный бит кода. Я не уверен, почему он находит имя политики.

Вот творение:

# Create IAM policy and Role
def iam_creation(client_name):
    iam_client = boto3.client('iam')

    # Policy template
    client_onboarding_policy = {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowListingOfUserFolder",
                "Action": [
                    "s3:ListBucket",
                    "s3:GetBucketLocation"
                ],
                "Effect": "Allow",
                "Resource": [
                    f"arn:aws:s3:::{client_name}"
                ]
            },
            {
                "Sid": "HomeDirObjectAccess",
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObjectVersion",
                    "s3:DeleteObject",
                    "s3:GetObjectVersion"
                    ],
                    "Resource": f"arn:aws:s3:::{client_name}/*"
            }
        ]
    }

    # Role template
    role_onboarding_policy = {
        "Version": "2012-10-17",
        "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "transfer.amazonaws.com",
                    "s3.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
        ]
    }

    # Create policy from template
    iam_client.create_policy(
        PolicyName=f'{client_name}Policy',
        PolicyDocument=json.dumps(client_onboarding_policy)
    )

    # Create Role from template and create trust relationships
    iam_client.create_role(
        RoleName=f'{client_name}',
        AssumeRolePolicyDocument=json.dumps(role_onboarding_policy)
    )

    # Attach created policy to created role
    iam_client.attach_role_policy(
        PolicyArn=f'arn:aws:iam::111111111111:policy/{client_name}Policy',
        RoleName=f'{client_name}'
    )

Творчество проходит без проблем. Вот удаление

# Delete IAM policy and role
def iam_delete(client_name):
    iam_client = boto3.client('iam')
    iam_resource = boto3.resource('iam')
    role_policy = iam_resource.RolePolicy(f'{client_name}', f'{client_name}Policy')
    role = iam_resource.Role(f'{client_name}')

    # Detach policy from role
    iam_client.detach_role_policy(
        PolicyArn=f'arn:aws:iam::111111111111:policy/{client_name}Policy',
        RoleName=f'{client_name}'
    )

    # Delete policy
    role_policy.delete()

    # Delete role
    role.delete()

Я предполагаю, что это как-то связано с тем, как я назвал политику ролей или не назвал ее. Я подтвердил, что в IAM существует роль Potatoman9000, а также Политика Potatoman9000Policy. Любая помощь приветствуется


person Thatsnotamuffin    schedule 28.04.2020    source источник


Ответы (1)


RolePolicy предназначен для встроенных политик, а не для управляемых политик.

Когда вы вызываете delete, возникает ошибка, потому что вы используете управляемые политики. Из документов об удалить:

Удаляет указанную встроенную политику, встроенную в указанную роль IAM.

Чтобы удалить управляемую политику, вы должны использовать delete_policy.

Удаляет указанную управляемую политику.

person Marcin    schedule 28.04.2020
comment
Это сработало! Клянусь, я сделал delete_policy раньше, но я, должно быть, ошибся. спасибо за помощь - person Thatsnotamuffin; 29.04.2020
comment
@Thatsnotamuffin Рад, что это сработало. Принятие ответа будет оценено. - person Marcin; 29.04.2020