试图在aws中创建一个iam角色并在assumeRolePolicyDocument上获取错误

时间:2017-03-16 18:19:17

标签: python amazon-web-services single-sign-on amazon-iam federation

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

以下是我想用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:调用时发生错误(ValidationError)   CreateRole操作:assumeRolePolicyDocument的指定值   是无效的。它必须只包含可打印的ASCII字符。

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

1 个答案:

答案 0 :(得分:0)

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
)