使用变量中JSON信任策略创建AWS IAM角色失败的原因及解决
问题:通过JSON字符串创建AWS IAM角色失败,使用文件则成功
尝试通过JSON字符串(而非文件)提供信任策略创建AWS IAM角色时,使用aws iam create-role --assume-role-policy-document $IAM_ROLE_TRUST_POLICY命令报错,但用file://指定文件则正常执行。
错误信息
Unknown options: "2012-10-17",, "Statement":, [, {, "Effect":, "Allow",, "Principal":, {, "AWS":, "arn:aws:iam::111111111111:user/svc-tooling-user", },, "Action":, "sts:AssumeRole", }, ], }, "Version":
复现步骤
$ IAM_ROLE_TRUST_POLICY=$(cat <<-END { \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"AWS\": \"arn:aws:iam::111111111111:user/svc-tooling-user\" }, \"Action\": \"sts:AssumeRole\" } ] } END ) $ aws iam create-role \ --role-name myTestRole\ --assume-role-policy-document $IAM_ROLE_TRUST_POLICY
原因分析
问题核心是Shell的变量分词机制:
- 直接使用
$IAM_ROLE_TRUST_POLICY时,Shell会将JSON字符串按空格、换行符拆分成多个独立的参数,每个JSON元素(如"Version":、"2012-10-17")都会被当成单独的命令选项 - AWS CLI无法识别这些拆分后的元素,因此抛出"Unknown options"错误
- 另外,你在Here-doc里给双引号加了转义符
\,导致JSON字符串里实际包含\"而非纯双引号,这也会影响CLI对JSON的解析
解决方法
方法1:用双引号包裹变量,修正JSON转义
# 修正变量赋值:Here-doc中无需转义双引号 IAM_ROLE_TRUST_POLICY=$(cat <<-END { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:user/svc-tooling-user" }, "Action": "sts:AssumeRole" } ] } END ) # 用双引号包裹变量,强制Shell将整个JSON作为单一参数传递 aws iam create-role \ --role-name myTestRole \ --assume-role-policy-document "$IAM_ROLE_TRUST_POLICY"
方法2:使用--cli-input-json参数(更稳妥)
直接将完整的请求JSON作为参数传递,避免变量分词问题:
aws iam create-role \ --cli-input-json '{ "RoleName": "myTestRole", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111111111111:user/svc-tooling-user" }, "Action": "sts:AssumeRole" } ] } }'
内容的提问来源于stack exchange,提问作者Rafiq
相关产品推荐
相关产品推荐

