排查 Amazon Organizations 服务控制策略(SCP)问题
此处的信息有助您诊断和修复服务控制策略(SCP)中的常见错误。
Amazon Organizations 中的服务控制策略(SCP)与 IAM 策略类似并有共用的语法。此语法以 JavaScript 对象表示法
Amazon Organizations 使用部分 IAM 句法和语法。有关详细信息,请参阅SCP 语法。
多个策略对象
一个 SCP 必须包含一个并且只能包含一个 JSON 对象。可通过在两旁放置 { } 括号来表示对象。虽然您可以通过在外部对中嵌入额外 { } 括号在 JSON 对象中嵌套其他对象,但是一个策略只能包含一个最外层的 { } 括号对。以下示例不正确,因为它在顶层包含两个对象 (以红色
标示):
{
"Version": "2012-10-17",
"Statement":
{
"Effect":"Allow",
"Action":"ec2:Describe*",
"Resource":"*"
}
}
{
"Statement": {
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*"
}
}
不过,您可以使用正确的策略语法来实现上面示例的意图。可以将两个数据块合并到单个 Statement
元素中,而不是包含两个完整的策略对象 (每个都有自己的 Statement
元素)。Statement
元素将两个对象组成的数组作为其值,如以下示例所示:
{ "Version": "2012-10-17",
"Statement": [
{ "Effect": "Allow", "Action": "ec2:Describe*", "Resource":" *" }, { "Effect": "Deny", "Action": "s3:*", "Resource": "*" }] }
无法将此示例进一步压缩到带一个元素的 Statement
中,因为两个元素具有不同的作用。通常,您只能在每个语句中的 Effect
和 Resource
元素相同时组合语句。
多个 Statement 元素
此错误乍一看似乎是由上一部分中的错误变化而来的。但是,它在句法上是不同类型的错误。在以下示例中,顶层只有一个策略对象,由单个 { } 括号对表示。但是,该对象包含两个 Statement
元素。
一个 SCP 策略只能包含一个 Statement
元素,名称 (Statement
) 在冒号左侧,它的值在冒号右侧。Statement
元素的值必须是对象,以 { } 括号表示,其中包含一个 Effect
元素、一个 Action
元素和一个 Resource
元素。以下示例不正确,因为它在策略对象中包含两个 Statement
元素:
{
"Version": "2012-10-17",
"Statement
": {
"Effect": "Allow",
"Action": "ec2:Describe*",
"Resource": "*"
},
"Statement
": {
"Effect": "Deny",
"Action": "s3:*",
"Resource": "*"
}
}
因为值对象可以是多个值对象组成的数组,所以您可以通过将两个 Statement
元素合并为一个对象数组元素来解决此问题,如以下示例所示:
{ "Version": "2012-10-17", "Statement":
[
{ "Effect": "Allow", "Action": "ec2:Describe*", "Resource":"*" },
{ "Effect": "Deny", "Action": "s3:*", "Resource": "*" }]
}
Statement
元素的值是对象数组。此示例中的数组包含两个对象,每个对象是 Statement
元素的正确值。数组中的每个对象之间用逗号隔开。
策略文档超出最大大小
SCP 文档的最大大小为 5,120 个字符。此最大大小包括所有字符,含空格。要减小 SCP 的大小,您可以删除引号之外的所有空格字符(如空格和换行符)。
注意
如果您使用 Amazon Web Services Management Console保存策略,JSON 元素之间和引号之外的额外白色空格(如空格和换行符)不计算在内。如果您使用 SDK 操作或 Amazon CLI 保存策略,则策略将完全按照您提供的方式保存,并且不会自动删除字符。