Amazon SWF IAM 策略 - Amazon Simple Workflow Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon SWF IAM 策略

IAM 策略包含一个或多个 Statement 元素,每个元素都包含一组定义该策略的元素。有关元素的完整列表以及如何构建策略的一般性讨论,请参阅 The Access Policy Language。Amazon SWF 访问控制基于以下元素:

效果

(必需) 该语句的效果:denyallow

注意

您必须显式允许访问;默认情况下,IAM 会拒绝访问。

资源

(必需)该语句适用的资源( Amazon 服务中用户可以与之交互的实体)。

您可以只针对域授予资源权限。例如,策略只允许对您的账户中特定域进行访问。要表达对域名的权限,请Resource将其设置为该域的亚马逊资源名称 (ARN),其格式为 “arn: aws: swf:区域:accountID:/domain/”。DomainName区域是 Amazon 区域,ac coun tID 是没有破折号的账户 ID DomainName,也是域名。

操作

(必需) 应用语句的操作,可以通过以下格式引用:serviceId:action。对于 Amazon SWF,将 serviceID 设置为 swf。例如,swf:StartWorkflowExecution指的是StartWorkflow执行操作,用于控制允许哪些用户启动工作流程。

如果您授予使用权限 RespondDecisionTaskCompleted,则还可以使用来表达对伪 API 的权限,从而控制Action对包含的决策列表的访问权限。由于 IAM 在默认情况下拒绝访问,您必须显式允许决策程序的决策,否则决策将不被接受。您可以使用 * 值允许所有决策。

状况

(可选) 表示一个或多个操作参数的约束条件,以限制允许的值。

Amazon SWF 操作的范围通常较广,您可以使用 IAM 条件来缩小范围。例如,要限制允许该PollForActivityTask操作访问的任务列表,您可以添加Condition并使用swf:taskList.name密钥指定允许列表。

您可以表达下列实体的约束条件。

  • 工作流类型。名称和版本具有单独密钥。

  • 活动类型。名称和版本具有单独密钥。

  • 任务列表。

  • Tags. 您可以为某些操作指定多个标签。在此情况下,每个标签都有一个单独的密钥。

注意

对于 Amazon SWF,所有值都是字符串,因此您可以使用字符串运算符(如 StringEquals)来限制参数,将参数限制为指定的字符串。但是,StringEquals 等常规字符串比较运算符需要全部请求以包含参数。如果不显式包含参数,且类型注册过程中未提供默认值 (如默认任务列表),则访问将被拒绝。

将条件视为可选项通常很有用,这样一来,您可以调用操作,而无需包含相关参数。例如,您可能希望允许决策者指定一组RespondDecisionTaskCompleted决策,但也允许它为任何特定调用仅指定其中一个决策。这种情况下,可使用 StringEqualsIfExists 运算符限制适当的参数,在参数满足条件时允许访问,但不会在参数不存在时拒绝访问。

有关可限制参数的完整列表和相关密钥,请参阅 API 摘要

下一部分将举例说明如何构建 Amazon SWF 策略。有关详细信息,请参阅字符串条件

Amazon SWF 策略示例

一个工作流由多个操作者组成,包括活动、决策程序等。您可以通过附加适当的 IAM 策略控制每个操作者的访问权限。本章节提供了一些示例。以下所示为最简单的案例:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/*" } ] }

如果您将此策略附加到参与者,它对所有地区的账户都有访问权。您可以使用通配符利用一个值来表示多个资源、操作或地区。

  • Resource 值中的第一个通配符 (*) 表示资源权限适用于所有区域。要将权限限制在单个区域,请使用适当的区域字符串替换通配符,如 us-east-1。

  • Resource 值中的第二个通配符 (*) 让操作者可以访问指定区域中的任何账户域。

  • Action 值中的通配符 (*) 让操作者可以调用任何 Amazon SWF 操作。

有关通配符使用方法的详细信息,请参阅元素描述

以下章节显示的是以更精细方法授予权限的策略的示例。

域权限

如果您想将部门工作流限制到一个特定域中,您可以使用与下述类似的方法:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/department1" } ] }

如果您附加此策略到参与者,它可以调用任何操作,但只能针对 department1 域。

如果您希望参与者有权访问多个域,您可以针对每个域单独授予权限,如下所述:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/department1" }, { "Effect" : "Allow", "Action" : "swf:*", "Resource" : "arn:aws:swf:*:123456789012:/domain/department2" } ] }

如果将此策略附加到一个操作者,它就可以使用 department1department2 域中的任何 Amazon SWF 操作。有时候,您还可以使用通配符表示多个域。

API 权限和约束条件

您控制用户可以对 Action 操作元素使用哪些操作。您可以选择通过使用 Condition 元素限制操作的可允许参数值。

如果您想将参与者限制为只进行特定操作,您可以使用与下述类似的方法:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/department2" } ] }

如果将此策略附加到操作者,它能调用 StartWorkflowExecutiondepartment2 域中启动工作流。它不能在任何其他域中使用任何其他操作或启动工作流。

您可以进一步限制参与者通过限制一个或多个 StartWorkflowExecution 参数值启动的工作流范围,如下所述:

{ "Version": "2012-10-17", "Statement": [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/department1", "Condition" : { "StringEquals" : { "swf:workflowType.name" : "workflow1", "swf:workflowType.version" : "version2" } } } ] }

此策略限制 StartWorkflowExecution 操作的 nameversion 参数。如果将此策略附加到操作者,它只能在 department1 域中运行 workflow1version2,且两个参数都必须包含在请求中。

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

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/some_domain", "Condition" : { "StringEqualsIfExists" : { "swf:taskList.name" : "task_list_name" } } } ] }

参与者可通过此策略在启动工作流执行时选择性地指定任务列表。

您可以限制某些操作的标签列表。在此情况下,每个标签都有一个单独的密钥,所以您会使用 swf:tagList.member.0 限制列表中的第一个标签,使用 swf:tagList.member.1 限制列表中的第二个标签,以此类推,最多能限制 5 个。但是,对于标签列表的限制方法,您必须要谨慎。关于实例,下面是推荐策略的示例:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/some_domain", "Condition" : { "StringEqualsIfExists" : { "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag" } } } ] }

此策略允许您选择指定 some_ok_taganother_ok_tag。但是,此策略只会限制标签列表的第一个元素。列表可以有包含都会被允许的任意值的其他元素,因为此策略不会对 swf:tagList.member.1swf:tagList.member.2 等等应用任何条件。

解决此问题的一个方法是禁止使用标签列表。以下策略要求列表中只能包含一个元素,从而确保只允许有 some_ok_taganother_ok_tag

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:StartWorkflowExecution", "Resource" : "arn:aws:swf:*:123456789012:/domain/some_domain", "Condition" : { "StringEqualsIfExists" : { "swf:tagList.member.0" : "some_ok_tag", "another_ok_tag" }, "Null" : { "swf:tagList.member.1" : "true" } } } ] }

伪 API 权限和约束条件

如果您想限制提供给 RespondDecisionTaskCompleted 的决策,您首先必须允许参与者调用 RespondDecisionTaskCompleted。然后,您可以使用常规 API 的句法,授予适当伪 API 成员权限,如下所示:

{ "Version": "2012-10-17", "Statement" : [ { "Resource" : "arn:aws:swf:*:123456789012:/domain/*", "Action" : "swf:RespondDecisionTaskCompleted", "Effect" : "Allow" }, { "Resource" : "*", "Action" : "swf:ScheduleActivityTask", "Effect" : "Allow", "Condition" : { "StringEquals" : { "swf:activityType.name" : "SomeActivityType" } } } ] }

如果您将此策略附加到参与者,第一个 Statement 元素将允许参与者调用 RespondDecisionTaskCompleted。第二个元素允许操作者使用 ScheduleActivityTask 决策来指导 Amazon SWF 计划活动任务。要允许所有决定,请将 “swf:ScheduleActivity任务” 替换为 “swf: *”。

您可以使用 Condition 运算符像使用常规 API 一样地限制参数。此 ConditionStringEquals 运算符允许 RespondDecisionTaskCompletedSomeActivityType 活动安排一个活动任务,并且它必须安排该任务。如果您想要允许 RespondDecisionTaskCompleted 使用一个参数值但又不需要它这样做,您可以替代使用 StringEqualsIfExists 运算符。

Amazon 托管策略: SimpleWorkflowFullAccess

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

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

权限详细信息

该策略包含以下权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "swf:*" ], "Resource": "*" } ] }

IAM 策略的服务模型限制

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

对于实例,ListOpenWorkflowExecutions 建议对 使用以下策略:

{ "Version": "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Action" : "swf:ListOpenWorkflowExecutions", "Resource" : "arn:aws:swf:*:123456789012:/domain/domain_name", "Condition" : { "StringEquals" : { "swf:typeFilter.name" : "workflow_name", "swf:typeFilter.version" : "workflow_version", "swf:tagFilter.tag" : "some_tag" } } } ] }

Amazon SWF 服务模型不允许在同一个 ListOpenWorkflowExecutions 请求中使用 typeFiltertagFilter 参数。因此,该策略允许通过引发无效请求 ValidationException 来拒绝服务的调用。