我正在尝试在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文件,但也会产生相同的错误。
答案 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
)