

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon SWF IAM 策略
<a name="swf-dev-iam.policies"></a>

IAM 策略包含一个或多个 `Statement` 元素，每个元素都包含一组定义该策略的元素。有关元素的完整列表以及如何构建策略的一般性讨论，请参阅 [The Access Policy Language](https://docs.aws.amazon.com/IAM/latest/UserGuide/AccessPolicyLanguage.html)。Amazon SWF 访问控制基于以下元素：

效果  
(必需) 该语句的效果：`deny` 或 `allow`。  
您必须显式允许访问；默认情况下，IAM 会拒绝访问。

资源  
（必需）该语句适用的资源（ AWS 服务中用户可以与之交互的实体）。  
您可以只针对域授予资源权限。例如，策略只允许对您的账户中特定域进行访问。要表达对域名的权限，`Resource`请将其设置为该域的亚马逊资源名称 (ARN)，其格式为 “arn: aws: swf::: /domain/”。*Region* *AccountID* *DomainName* *Region*是 AWS 区域，*AccountID*是没有破折号的账户 ID，*DomainName*是域名。

Action  
（必填）该语句适用的操作，您可以使用以下格式来引用该操作：*serviceId*: *action*。对于亚马逊 SWF，请设置为*serviceID*。`swf`例如，`swf:StartWorkflowExecution`指的是[StartWorkflowExecution](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_StartWorkflowExecution.html)操作，用于控制允许哪些用户启动工作流程。  
 如果您授予使用权限 [RespondDecisionTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html)，则还可以使用来表达伪 API 的权限，从而控制`Action`对包含的决策列表的访问权限。由于 IAM 在默认情况下拒绝访问，您必须显式允许决策程序的决策，否则决策将不被接受。您可以使用 `*` 值允许所有决策。

条件  
(可选) 表示一个或多个操作参数的约束条件，以限制允许的值。  
Amazon SWF 操作的范围通常较广，您可以使用 IAM 条件来缩小范围。例如，要限制允许该[PollForActivityTask](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_PollForActivityTask.html)操作访问的任务列表，您可以添加`Condition`并使用`swf:taskList.name`密钥指定允许列表。  
您可以表达下列实体的约束条件。  
+ 工作流类型。名称和版本具有单独密钥。
+ 活动类型。名称和版本具有单独密钥。
+ 任务列表。
+ Tags. 您可以为某些操作指定多个标签。在此情况下，每个标签都有一个单独的密钥。
对于 Amazon SWF，所有值都是字符串，因此您可以使用字符串运算符（如 `StringEquals`）来限制参数，将参数限制为指定的字符串。但是，`StringEquals` 等常规字符串比较运算符需要全部请求以包含参数。如果不显式包含参数，且类型注册过程中未提供默认值 (如默认任务列表)，则访问将被拒绝。  
将条件视为可选项通常很有用，这样一来，您可以调用操作，而无需包含相关参数。例如，您可能希望允许决策者指定一组[RespondDecisionTaskCompleted](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_RespondDecisionTaskCompleted.html)决策，但也允许它为任何特定调用仅指定其中一个决策。这种情况下，可使用 `StringEqualsIfExists` 运算符限制适当的参数，在参数满足条件时允许访问，但不会在参数不存在时拒绝访问。
有关可限制参数的完整列表和相关密钥，请参阅 [API 摘要](swf-dev-iam.api.md)。

下一部分将举例说明如何构建 Amazon SWF 策略。有关详细信息，请参阅[字符串条件](https://docs.aws.amazon.com/IAM/latest/UserGuide/AccessPolicyLanguage_ElementDescriptions.html#AccessPolicyLanguage_ConditionType)。

## 为亚马逊 SWF 编写政策
<a name="swf-dev-iam.policies.examples"></a>

一个工作流程由多个*参与者*组成，包括活动、决策者等。您可以通过附加适当的 IAM 策略控制每个操作者的访问权限。

通过以下操作，参与者将获得所有地区的完全账户访问权限：
+ **操作：**`swf:*`
+ **资源：**`arn:aws:swf:*:123456789012:/domain/*`

 您可以使用通配符利用一个值来表示多个资源、操作或地区。
+ `Resource`值中的第一个通配符 (`*`) 表示资源权限适用于所有**区域**。

  要将权限限制在单个区域，请使用适当的区域字符串替换通配符，如 us-east-1。
+ `Resource` 值中的第二个通配符 (`*`) 让操作者可以访问指定区域中的任何账户域。
+ `Action` 值中的通配符 (`*`) 让操作者可以调用任何 Amazon SWF 操作。

有关通配符使用方法的详细信息，请参阅[元素描述](https://docs.aws.amazon.com/IAM/latest/UserGuide/AccessPolicyLanguage_ElementDescriptions.html)

### 域权限
<a name="swf-dev-iam.policies.examples.domain"></a>

要将部门的工作流程限制在特定域内，您可以授予权限，允许参与者调用任何操作，但仅限于特定部门。

要授予参与者访问多个域名的权限，请以声明列表形式明确每个域的权限：
+ **操作：**`swf:*`
+ **资源：**`arn:aws:swf:*:123456789012:/domain/department1`
+ **资源：**`arn:aws:swf:*:123456789012:/domain/department2`

您可以允许参与者在和域中使用任何 Amazon SWF 操作`department1`。`department2`有时候，您还可以使用通配符表示多个域。

### API 权限和约束条件
<a name="swf-dev-iam.policies.examples.api"></a>

您可以通过在`Action`元素中指定**动**作来控制角色可以使用哪些动作。

通过以下操作，操作者只能调`StartWorkflowExecution`用启动工作流程。它不能使用任何其他操作。
+ **操作：**`swf:StartWorkflowExecution`

**Conditions**  
您可以选择使用元素来限制操作允许的参数值。`Condition`

要限制操作者可以启动哪些工作流程，请按如下方式限制一个或多个`StartWorkflowExecution`参数值：

```
"Condition" : {
   "StringEquals" : { 
      "swf:workflowType.name" : "workflow1",
      "swf:workflowType.version" : "version2" 
    }
}
```

具有先前约束条件的 actor 只能`version2`运行，`workflow1`并且两个参数都必须包含在请求中。

您可以使用 `StringEqualsIfExists` 运算符限制操作，无需将其包含在请求中，如下所述：

```
"Condition" : {
   "StringEqualsIfExists" : { "swf:taskList.name" : "task_list_name" }
}
```

具有先前策略的参与者可以在开始执行工作流程时选择性地指定任务列表。

您可以限制某些操作的标签列表。每个标签都有单独的密钥，因此您可以使用`swf:tagList.member.0`限制列表中的第一个标签，`swf:tagList.member.1`限制列表中的第二个标签，依此类推，最多 5 个。

限制标签列表时必须谨慎行事。例如，***不***建议使用以下条件。

**不**建议使用以下条件，因为它允许您选择性地指定`some_ok_tag`或`another_ok_tag`。但是，条件仅限制标签列表的**第一个元素**。该列表可能包含其他具有任意值的元素，这些元素都是允许的，因为该条件不适用于`swf:tagList.member.1``swf:tagList.member.2`、等的任何条件。

```
// Example to illustrate an insecure Condition
"Condition" : {
   "StringEqualsIfExists" : {
      "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag"
   }
}
```

解决前一个问题的一种方法是禁止使用标签列表。

以下策略要求列表中只能包含一个元素，从而确保只允许有 `some_ok_tag` 或 `another_ok_tag`。

```
"Condition" : {
   "StringEqualsIfExists" : {
      "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag"
    },
    "Null" : { "swf:tagList.member.1" : "true" }
}
```

### 伪 API 权限和约束条件
<a name="pseudo-api-permissions-constraints"></a>

要限制可用的决定`RespondDecisionTaskCompleted`，必须先允许参与者调用`RespondDecisionTaskCompleted`。然后，您可以使用与常规 API 相同的语法来表达相应伪 API 成员的权限，如下所示：
+ **报表 1**

  **资源：**`arn:aws:swf:*:123456789012:/domain/*`

  **操作：**`swf:RespondDecisionTaskCompleted`
+ **报表 2**

  **资源：**`*`

  **操作：**`swf:ScheduleActivityTask`

  **状况**：` "StringEquals" : { "swf:activityType.name" : "SomeActivityType" }`

第一个`Statement`允许演员打电话`RespondDecisionTaskCompleted`。第二条语句允许参与者利用该`ScheduleActivityTask`决定来指示 Amazon SWF 安排活动任务。要允许所有决定，请将 “swf:ScheduleActivityTask” 替换为 “swf: \$1”。

您可以使用 Condition 运算符像使用常规 API 一样地限制参数。前一个示例中的`StringEquals`操作员`Condition``RespondDecisionTaskCompleted`允许为该活动安排`SomeActivityType`活动任务，并且必须安排该任务。如果您想要允许 `RespondDecisionTaskCompleted` 使用一个参数值但又不需要它这样做，您可以替代使用 `StringEqualsIfExists` 运算符。

## AWS 托管策略： SimpleWorkflowFullAccess
<a name="swf-full-accss-mngd-policy"></a>

您可以将 `SimpleWorkflowFullAccess` 策略附加到 IAM 身份。

该策略提供对 Amazon SWF 配置服务的完全访问权限。

## IAM 策略的服务模型限制
<a name="swf-dev-iam.policies.allowed"></a>

在创建 IAM 策略时，您必须考虑服务模型限制条件。创建一个代表无效 Amazon SWF 请求的在语法上有效的 IAM 策略是有可能的；但在访问控制方面得到允许的请求仍然会因为是无效请求而失败。

例如，Amazon SWF 服务模型**不**允许在同一个`[ListOpenWorkflowExecutions](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_ListOpenWorkflowExecutions.html)`请求中使用`typeFilter`和`tagFilter`参数。以下条件将允许服务将拒绝的呼叫（通过抛出`ValidationException`）为无效请求：

```
"Condition" : {
   "StringEquals" : { 
      "swf:typeFilter.name" : "workflow_name",
      "swf:typeFilter.version" : "workflow_version",
      "swf:tagFilter.tag" : "some_tag" 
    }
}
```