Попытка создать роль iam в aws и получить ошибку в acceptRolePolicyDocument
Я пытаюсь создать роль IAM в AWS для федеративного доступа и продолжаю сталкиваться с той же проблемой в python, используя boto или powershell, используя cli.
Вот что я пытаюсь сделать с питоном.
import boto3
tpdoc = r'c:\folders\trustPolicy.json'
with open(tpdoc, 'r') as tpfile:
data = tpfile.read()
client = boto3.client('iam')
response = client.create_role(
RoleName="testrole",
AssumeRolePolicyDocument=data
)
Этот ссылочный trustPolicy.json построен так
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRoleWithSAML",
"Effect": "Allow",
"Condition": {
"StringEquals": {
"SAML:aud": "https://signin.aws.amazon.com/saml"
}
},
"Principal": {
"Federated": "arn:aws:iam::1234567890:saml-provider/myidp"
}
}
]
}
Когда я запускаю этот код с этим файлом, я получаю следующую ошибку
ClientError: Произошла ошибка (ValidationError) при вызове операции CreateRole: указанное значение для acceptRolePolicyDocument недопустимо. Он должен содержать только печатные символы ASCII.
Я запустил json через валидатор aws json, и он проверяет, а также запустил регулярное выражение для допустимых символов, и это тоже проходит. Я также попытался скопировать существующую политику доверия из роли, созданной вручную, и использовать это содержимое для моего файла JSON, но это также вызывает ту же ошибку.
1 ответ
AssumeRolePolicyDocument
требуется закодированное в URL содержимое файла. Мы можем использовать urllib.quote()
за это:
import boto3
import urllib
tpdoc = r'c:\folders\trustPolicy.json'
with open(tpdoc, 'r') as tpfile:
data = tpfile.read()
encodedPolicy = urllib.quote(data)
client = boto3.client('iam')
response = client.create_role(
RoleName="testrole",
AssumeRolePolicyDocument=encodedPolicy
)