尝试在 aws 中创建 iam 角色并在 assumeRolePolicyDocument 上出现错误

Trying to create an iam role in aws and getting an error on the assumeRolePolicyDocument

我正在尝试在 AWS 中创建一个 IAM 角色以进行联合访问,并在 python 中使用 boto 或使用 cli 的 powershell 保持 运行ning 到相同的问题。

这是我尝试用 python 做的事情。

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: An error occurred (ValidationError) when calling the CreateRole operation: The specified value for assumeRolePolicyDocument is invalid. It must contain only printable ASCII characters.

我有 运行 json 通过 aws json 验证器并且它验证了,还有 运行 允许字符的正则表达式并且它也通过了.我还尝试从手动创建的角色复制现有的信任策略并将该内容用于我的 json 文件,但这也会产生相同的错误。

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
)