Устаревшая ошибка синтаксического анализа в скрипте Boto3 из-за неправильного оформления policydocument

#python #amazon-web-services #boto3 #amazon-iam #boto

#питон #amazon-веб-сервисы #бото3 #amazon-iam #бото

Вопрос:

Я пытаюсь создать пользователя IAM в AWS и присоединить его к группе пользователей с политиками IAM, но я получаю сообщение «Произошла ошибка (MalformedPolicyDocument) при вызове операции CreatePolicy: ошибка устаревшего синтаксического анализа политики», я не уверен, что это значит. Я думаю, что это связано с самой политикой, но я не уверен.

 import boto3
import sys
import json
iam = boto3.client('iam')
sts = boto3.client('sts')

response = iam.create_user(
    UserName='GoodUser'
)
IDK = sts.get_caller_identity()
print(IDK['UserId'])
response = iam.create_group(
    GroupName='GoodGroup'
)

response = iam.add_user_to_group(
    GroupName='GoodGroup',
    UserName='GoodUser'
)

some_policy = {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:us-east-2:{}:instance/*".format(IDK),
                "arn:aws:ec2:us-east-2:{}:security-group/*".format(IDK),
                "arn:aws:ec2:us-east-2:{}:image/ami-0a91cd140a1fc148a".format(IDK)
            ],
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "ec2:TerminateInstances",
                "ec2:StartInstances",
                "ec2:StopInstances"
            ],
            "Resource": "arn:aws:ec2:us-east-2:{}:instance/*".format(IDK),
            "Condition": {
                "ForAllValues:StringEquals": {
                    "ec2:InstanceType": "t2.micro"
                }
            }
        }
    ]
} 
response = iam.create_policy(
  PolicyName='GoodPolicy',
  PolicyDocument=json.dumps(some_policy)
)
print(response)

IDK1 = iam.attach_user_policy(
    UserName='GoodUser',
    PolicyArn='arn:aws:iam::{}:policy/some_policy'.format(IDK)
)
 

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

1. попробуйте создать политику через консоль AWS. Используйте вывод json.dumps(some_policy) в качестве входных данных

2. Это не сработает для моего варианта использования, потому что мне понадобится идентификатор пользователя, и он может меняться для каждого пользователя, поэтому не хочу жестко кодировать их в политике

3. используйте поддельный идентификатор, если это возможно, и, возможно, вы получите отзыв от консоли о том, что не так

4. Я протестировал политику с помощью консоли, и она работает с жестко запрограммированным идентификатором пользователя, но когда я пытаюсь динамически вводить данные в boto, это не работает.

Ответ №1:

Ошибка может быть связана с вашей IDK переменной.

IDK = sts.get_caller_identity() возвращает dict следующего формата:

 {
    'UserId': 'string',
    'Account': 'string',
    'Arn': 'string'
}
 

Позже вы используете этот объект для форматирования строк ресурсов: "arn:aws:ec2:us-east-2:{}:instance/*".format(IDK)
Это приведет к созданию недействительных участников. Я подозреваю, что вы, возможно, намеревались сделать что-то вроде этого: f"arn:aws:ec2:us-east-2:{IDK['Account']}:instance/*" (используя f-string вместо str.format , результат тот же).