Попытка создать роль 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
)
Другие вопросы по тегам