Python 由于格式错误的PolicyDocument,Boto3脚本中存在旧版分析错误

Python 由于格式错误的PolicyDocument,Boto3脚本中存在旧版分析错误,python,amazon-web-services,boto3,amazon-iam,boto,Python,Amazon Web Services,Boto3,Amazon Iam,Boto,我正在尝试在AWS上创建IAM用户并将其附加到具有IAM策略的用户组,但我收到“调用CreatePolicy操作时发生错误(格式错误的PolicyDocument):策略未通过旧版解析”错误,我不确定这是什么意思。我认为这与政策本身有关,但我不确定 import boto3 import sys import json iam = boto3.client('iam') sts = boto3.client('sts') response = iam.create_user( User

我正在尝试在AWS上创建IAM用户并将其附加到具有IAM策略的用户组,但我收到“调用CreatePolicy操作时发生错误(格式错误的PolicyDocument):策略未通过旧版解析”错误,我不确定这是什么意思。我认为这与政策本身有关,但我不确定

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)
)

错误可能与
IDK
变量有关

IDK=sts.get\u caller\u identity()
返回以下格式的dict:

{
    'UserId': 'string',
    'Account': 'string',
    'Arn': 'string'
}
稍后您将使用此对象格式化资源字符串:
“arn:aws:ec2:us-east-2:{}:instance/*”。格式化(IDK)

这将产生无效的主体。我怀疑您可能打算这样做:
f“arn:aws:ec2:us-east-2:{IDK['Account']}}:instance/*”
(使用f-string而不是
str.format
,结果相同)。

尝试通过aws控制台创建策略。使用
json.dumps的输出(一些策略)
作为输入,这对我的用例不起作用,因为我需要用户id,它可能会为每个用户更改,因此不想在策略中硬编码。如果可能,请使用假id,您可能会从控制台获得错误反馈。我已使用控制台测试了策略,它可以使用硬编码的用户id,但当我尝试在boto上动态输入它不起作用。