

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

IAM 政策包含一或多個`Statement`元素，每個元素都包含一組定義政策的元素。如需 元素的完整清單，以及如何建構政策的一般討論，請參閱 [存取政策語言](https://docs.aws.amazon.com/IAM/latest/UserGuide/AccessPolicyLanguage.html)。Amazon SWF 存取控制是以下列元素為基礎：

Effect  
(必要) `deny` 或 `allow` 陳述式的影響。  
您必須明確允許存取；IAM 預設拒絕存取。

資源  
（必要） 資源 - 使用者可與之互動的 AWS 服務中的實體 - 陳述式適用的資源。  
您只可以表達網域的資源許可。例如，政策可以僅允許存取您帳戶中的特定網域。若要表達網域的許可，請將 `Resource` 設定為網域的 Amazon Resource Name (ARN)，其格式為 "arn：aws：swf：*Region*：*AccountID*：/domain/*DomainName*"。*區域*是 AWS 區域，*AccountID* 是沒有破折號的帳戶 ID，而 *DomainName* 是網域名稱。

Action  
(必要) 套用陳述式的動作，您可以使用下列格式參照：*serviceId*:*action*。對於 Amazon 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) 的使用許可，則也可以控制所含決策清單的存取權，方法是使用 `Action` 來表達虛擬 API 的許可。由於 IAM 預設拒絕存取，因此必須明確允許決策者的決策，否則將不會接受決策者決策。您可以使用 `*` 值來允許所有決策。

條件  
(選用) 表達一或多個動作參數的限制條件，這樣會限制允許的值。  
Amazon SWF 動作通常範圍廣泛，您可以使用 IAM 條件來減少。例如，若要限制允許 [PollForActivityTask](https://docs.aws.amazon.com/amazonswf/latest/apireference/API_PollForActivityTask.html) 動作存取的任務清單，請包含 `Condition` 並使用 `swf:taskList.name` 索引鍵指定允許清單。  
您可以表達下列實體的限制條件。  
+ 工作流程類型。名稱和版本有不同的索引鍵。
+ 活動類型。名稱和版本有不同的索引鍵。
+ 任務清單。
+ 標籤。您可以為一些動作指定多個標籤。在該情況下，每個標籤都會有不同的索引鍵。
對於 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)。

## 撰寫 Amazon 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`

您可以允許演員在 `department1`和 `department2`網域中使用任何 Amazon SWF 動作。您有時也可以使用萬用字元來代表多個網域。

### API 許可和限制
<a name="swf-dev-iam.policies.examples.api"></a>

您可以在 `Action`元素中指定**動作**，以控制演員可以使用的動作。

透過下列動作，演員只能呼叫 `StartWorkflowExecution`來啟動工作流程。它無法使用任何其他動作。
+ **動作：**`swf:StartWorkflowExecution`

**條件**  
您可以使用 `Condition` 元素，選擇性地限制動作的允許參數值。

若要限制演員可以啟動哪些工作流程，請限制一或多個`StartWorkflowExecution`參數值，如下所示：

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

具有先前限制條件的演員只能執行 `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" 
    }
}
```