Amazon Simple Workflow Service
开发人员指南 (API Version 2012-01-25)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

使用 IAM 管理对 Amazon SWF 资源的访问

访问 Amazon SWF 资源的每一个参与者,如决策程序、活动工作程序和工作流程管理员,都必须有授权的 AWS 访问密钥。参与者可通过账户的访问密钥访问资源。但是,访问密钥提供对账户所有资源的无限制访问,难以撤销,所以并不适合所有应用程序。

Amazon SWF 使用 AWS Identity and Access Management (IAM)提供对资源的受控制访问。IAM 提供灵活的方法来管理对账户的 AWS 资源的访问,无需公开访问密钥。使用 IAM,您可以创建与 AWS 账户关联的一个或多个用户。每个用户都有一组独立的 IAM 访问密钥,以提供对账户资源的访问。然后,您可以将 IAM 策略附加到用户或用户所在的组,以指定用户可访问的资源。相比简单地指定是否允许或拒绝账户访问,该策略的粒度可以更细。例如,您可以创建允许用户访问账户的策略,但只能针对一组特定的域。

IAM 还具有这样的优点,您可以撤销 IAM 访问而不会影响到您的访问密钥。事实上,定期交替轮换访问密钥(撤销用户的 IAM 访问密钥并发出新密钥)是最佳安全实践。

这个主题讨论的是如何使用 IAM 提供对 Amazon SWF 资源的受控访问方面的详细信息。假设您对以下文档中具体描述的 IAM 有大概了解。

基本原理

Amazon SWF 访问控制主要基于两种权限:

  • 资源权限:用户可以访问何种 Amazon SWF 资源。

    您可以只针对域授予资源权限。

  • API 权限:用户可以调用何种 Amazon SWF 操作。

最简单的方法是授权账户完全访问权 —、在任何域 — 中调用任何 Amazon SWF 操作或完全拒绝访问。但是,IAM 支持更细粒度的访问控制方法,这种方法通常更有用。例如,您可以:

  • 运行用户不受限制地调用任何 Amazon SWF 操作,但只能在特定域中。您可以使用这样一个策略允许开发中的工作流程应用程序使用任何操作,但只能是“沙盒”域。

  • 允许用户访问任何域,但限制其使用 API 的方法。您可以使用这样一个策略允许“审核员”应用程序在任何域中调用 API,但只允许读取访问。

  • 允许用户在特定域中只调用一组有限的操作。您可以使用这样一个策略允许工作流程启动程序只在特定域中调用 StartWorkflowExecution 操作。

Amazon SWF 访问控制基于以下原理:

  • 访问控制决策只基于 IAM 策略;所有的审核与操作策略都通过 IAM 完成。

  • 访问控制模型使用默认拒绝策略;任何未明确允许的访问都会被拒绝。

  • 您可以通过附加适当的 IAM 策略到工作流程参与者,控制对 Amazon SWF 资源的访问。

  • 资源权限只能针对域授予。

  • 您可以通过将条件应用到一个或多个参数上来进一步限制某些操作的使用。

  • 如果您授权使用 RespondDecisionTaskCompleted,则可以针对该操作中的决策列表授予权限。

    每个决策都由一个或多个参数,就像常规 API 调用那样。为了使策略可读性强一点,您可以授予决策权限,就像它们是实际的 API 调用那样,还包括将条件应用于一些参数。这些类型的权限被称为 伪 API 权限。

有关能用条件进行限制的常规和伪 API 参数的摘要,请参阅 API 摘要

Amazon SWF IAM 策略

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

效果

[必要] 语句的影响:拒绝允许

注意

您必须明确允许访问;默认情况下,IAM 拒绝访问。

资源

[必要] 资源 — 是语句所适用的用户可与之 — 活动的 AWS 服务中的实体。

您可以只针对域授予资源权限。例如,策略只允许对您的账户中特定域进行访问。为了授予域权限,将资源设置为域的Amazon 资源名称 (ARN),其格式为 "arn:aws:swf:Region:AccountID:/domain/DomainName"。Region 是 AWS 地区,AccountID 是不带破折号的账户 ID,DomainName 是域名称。

操作

[必要] 适用于语句的操作,您可以通过下列格式:serviceId:action 参考。对于 Amazon SWF,将 serviceID 设置为 swf。例如,swf:StartWorkflowExecution 指的是 StartWorkflowExecution 操作,它用户控制允许哪些用户启动工作流程。

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

条件

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

Amazon SWF 操作的范围通常较广,您可以使用 IAM 条件缩小该范围。例如,为了对 PollForActivityTask 操作允许访问的任务列表范围进行限制,您纳入了条件并使用swf:taskList.name密钥指定可允许的列表。

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

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

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

  • 任务列表。

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

注意

对于 Amazon SWF,值都是字符串,所以您可以使用 StringEquals 等字符串运算符限制参数,将参数限定为特定字符串。但是,StringEquals 等常规字符串比较运算符需要全部请求以列入参数。如果您没有明确列入参数,且类型注册期间没有提供默认任务列表之类的默认值,访问将被拒绝。

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

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

下一章提供了 Amazon SWF 策略构建方法示例。有关详细信息,请参阅 String Conditions

Amazon SWF 策略示例

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

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

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

  • 资源值 (...:swf:*:123...) 中的第一个通配符 '*' 表示资源权限适用于所有地区。要将权限限制到单个地区,可以用相应的地区字符串(如 us-east-1)替代“*”。

  • 资源值 (/domain/*) 中的第二个通配符 '*' 允许参与者访问特定地区内的任何账户域。

  • 操作值中的 '*' 通配符允许参与者调用任何 Amazon SWF 操作。

有关通配符使用方法的详细信息,请参阅 Element Descriptions

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

域权限

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

{ "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" } ] }

如果您附加此策略到参与者,它可以使用 "department1" 和 "department2" 域中的任何 Amazon SWF 操作。有时候,您还可以使用通配符表示多个域。

API 权限和约束条件

您可以控制哪些操作能被用户用于操作元素。您可以选择通过使用条件元素限制操作的可允许参数值。

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

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

如果您将此策略附加到参与者,它能调用 StartWorkflowExecution 以在 "department2" 域中启动工作流程。它不能在任何其它域中使用任何其它操作或启动工作流程。

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

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

此策略限制StartWorkflowExecution操作名称版本参数。如果您附加此策略到参与者,它只能在 "department1" 域中运行 "workflow1" 的 "version2",且两个参数都必须包含在请求中。

您可以使用 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_tag" 或 "another_ok_tag"。但是,此策略只会限制标签列表的第一个元素。列表中可以有全部能被允许的具有任意值的其它元素,因为此策略不会将任何条件应用于 swf:tagList.member.1swf:tagList.member.2 等等。

解决此问题的一个方法是禁止使用标签列表。以下策略确保,只有 "some_ok_tag" 或 "another_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。第二个元素允许参与者使用直接 Amazon SWF 的 ScheduleActivityTask 决策,以排定活动任务。为了允许所有决策,用 "swf:*" 替代 "swf:ScheduleActivityTask"。

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

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" }, "StringEquals" : { "swf:typeFilter.version" : "workflow_version" }, "StringEquals" : { "swf:tagFilter.tag" : "some_tag" } } } ] }

Amazon SWF 服务模型不允许 typeFiltertagFilter 参数用于同一个 ListOpenWorkflowExecutions 请求。因此,该策略允许服务通过将 ValidationException— 抛弃为无效的请求来拒绝 — 的调用。

API 摘要

本章节简要描述了您可以如何使用 IAM 策略对参与者使用各 API 和伪 API 访问 Amazon SWF 资源的方法。

  • 对于除 RegisterDomainListDomains 之外的所有操作,您可以通过授予域资源权限的方式允许或拒绝对任何或所有账户域的访问。

  • 您可以允许或拒绝任何常规 API 成员的权限,如果您授权调用 RespondDecisionTaskCompleted,还可以允许或拒绝任何伪 API 成员的权限。

  • 您可以使用 Condition 限制某些参数的可允许值。

以下章节列出了可针对每个常规和伪 API 成员限制的参数,并提供了相关密钥,指出您可以根据其控制域访问的任何限制条件。

常规 API

本章节列出了常规 API 成员,并简要描述了可进行限制的参数和相关密钥。它还指出了您可以根据其控制域访问的任何限制条件。

CountClosedWorkflowExecutions

  • tagFilter.tag:字符串约束条件。密钥是 swf:tagFilter.tag

  • typeFilter.name:字符串约束条件。密钥是 swf:typeFilter.name

  • typeFilter.version:字符串约束条件。密钥是 swf:typeFilter.version

注意

CountClosedWorkflowExecutions要求 typeFiltertagFilter 相互排斥。

CountOpenWorkflowExecutions

  • tagFilter.tag:字符串约束条件。密钥是 swf:tagFilter.tag

  • typeFilter.name:字符串约束条件。密钥是 swf:typeFilter.name

  • typeFilter.version:字符串约束条件。密钥是 swf:typeFilter.version

注意

CountOpenWorkflowExecutions要求 typeFiltertagFilter 相互排斥。

CountPendingActivityTasks

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

CountPendingDecisionTasks

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

DeprecateActivityType

  • activityType.name:字符串约束条件。密钥是 swf:activityType.name

  • activityType.version:字符串约束条件。密钥是 swf:activityType.version

DeprecateDomain

  • 您不能限制此操作的参数。

DeprecateWorkflowType

  • workflowType.name:字符串约束条件。密钥是 swf:workflowType.name

  • workflowType.version:字符串约束条件。密钥是 swf:workflowType.version

DescribeActivityType

  • activityType.name:字符串约束条件。密钥是 swf:activityType.name

  • activityType.version:字符串约束条件。密钥是 swf:activityType.version

DescribeDomain

  • 您不能限制此操作的参数。

DescribeWorkflowExecution

  • 您不能限制此操作的参数。

DescribeWorkflowType

  • workflowType.name:字符串约束条件。密钥是 swf:workflowType.name

  • workflowType.version:字符串约束条件。密钥是 swf:workflowType.version

GetWorkflowExecutionHistory

  • 您不能限制此操作的参数。

ListActivityTypes

  • 您不能限制此操作的参数。

ListClosedWorkflowExecutions

  • tagFilter.tag:字符串约束条件。密钥是 swf:tagFilter.tag

  • typeFilter.name:字符串约束条件。密钥是 swf:typeFilter.name

  • typeFilter.version:字符串约束条件。密钥是 swf:typeFilter.version

注意

ListClosedWorkflowExecutions要求 typeFiltertagFilter 相互排斥。

ListDomains

  • 您不能限制此操作的参数。

ListOpenWorkflowExecutions

  • tagFilter.tag:字符串约束条件。密钥是 swf:tagFilter.tag

  • typeFilter.name:字符串约束条件。密钥是 swf:typeFilter.name

  • typeFilter.version:字符串约束条件。密钥是 swf:typeFilter.version

注意

ListOpenWorkflowExecutions要求 typeFiltertagFilter 相互排斥。

ListWorkflowTypes

  • 您不能限制此操作的参数。

PollForActivityTask

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

PollForDecisionTask

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

RecordActivityTaskHeartbeat

  • 您不能限制此操作的参数。

RegisterActivityType

  • defaultTaskList.name:字符串约束条件。密钥是 swf:defaultTaskList.name

  • 名称:字符串约束条件。密钥是 swf:name

  • 版本:字符串约束条件。密钥是 swf:version

RegisterDomain

  • 名称:注册的域名称可作为此操作的资源使用。

RegisterWorkflowType

  • defaultTaskList.name:字符串约束条件。密钥是 swf:defaultTaskList.name

  • 名称:字符串约束条件。密钥是 swf:name

  • 版本:字符串约束条件。密钥是 swf:version

RequestCancelWorkflowExecution

  • 您不能限制此操作的参数。

RespondActivityTaskCanceled

  • 您不能限制此操作的参数。

RespondActivityTaskCompleted

  • 您不能限制此操作的参数。

RespondActivityTaskFailed

  • 您不能限制此操作的参数。

RespondDecisionTaskCompleted

  • decisions.member.N:通过伪 API 权限间接限制。有关详细信息,请参阅 伪 API

SignalWorkflowExecution

  • 您不能限制此操作的参数。

StartWorkflowExecution

  • tagList.member.0:字符串约束条件。密钥是 swf:tagList.member.0

  • tagList.member.1:字符串约束条件。密钥是 swf:tagList.member.1

  • tagList.member.2:字符串约束条件。密钥是 swf:tagList.member.2

  • tagList.member.3:字符串约束条件。密钥是 swf:tagList.member.3

  • tagList.member.4:字符串约束条件。密钥是 swf:tagList.member.4

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

  • workflowType.name:字符串约束条件。密钥是 swf:workflowType.name

  • workflowType.version:字符串约束条件。密钥是 swf:workflowType.version

注意

您不能限制超过五个标签。

TerminateWorkflowExecution

  • 您不能限制此操作的参数。

伪 API

本章节列出了表示 RespondDecisionTaskCompleted 中所包含决策的伪 API 成员。如果您已授权使用 RespondDecisionTaskCompleted,您的策略会用与常规 API 相同的方法来授予此 API 成员权限。您可以通过设置一个或多个参数的条件来限制伪 API 的某些成员。本章节列出了伪 API 成员,并简要描述了可进行限制的参数与相关密钥。

注意

aws:SourceIPaws:UserAgentaws:SecureTransport 密钥不可用于伪 API。如果您的预期安全策略需要这些密钥对伪 API 进行访问控制,您可以将其用于 RespondDecisionTaskCompleted 操作。

CancelTimer

  • 您不能限制此操作的参数。

CancelWorkflowExecution

  • 您不能限制此操作的参数。

CompleteWorkflowExecution

  • 您不能限制此操作的参数。

ContinueAsNewWorkflowExecution

  • tagList.member.0:字符串约束条件。密钥是 swf:tagList.member.0

  • tagList.member.1:字符串约束条件。密钥是 swf:tagList.member.1

  • tagList.member.2:字符串约束条件。密钥是 swf:tagList.member.2

  • tagList.member.3:字符串约束条件。密钥是 swf:tagList.member.3

  • tagList.member.4:字符串约束条件。密钥是 swf:tagList.member.4

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

  • is correct (instead of workflowType.version)."?>workflowTypeVersion:字符串约束。密钥是 swf:workflowTypeVersion

注意

您不能限制超过五个标签。

FailWorkflowExecution

  • 您不能限制此操作的参数。

RecordMarker

  • 您不能限制此操作的参数。

RequestCancelActivityTask

  • 您不能限制此操作的参数。

RequestCancelExternalWorkflowExecution

  • 您不能限制此操作的参数。

ScheduleActivityTask

  • activityType.name:字符串约束条件。密钥是 swf:activityType.name

  • activityType.version:字符串约束条件。密钥是 swf:activityType.version

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

SignalExternalWorkflowExecution

  • 您不能限制此操作的参数。

StartChildWorkflowExecution

  • tagList.member.0:字符串约束条件。密钥是 swf:tagList.member.0

  • tagList.member.1:字符串约束条件。密钥是 swf:tagList.member.1

  • tagList.member.2:字符串约束条件。密钥是 swf:tagList.member.2

  • tagList.member.3:字符串约束条件。密钥是 swf:tagList.member.3

  • tagList.member.4:字符串约束条件。密钥是 swf:tagList.member.4

  • taskList.name:字符串约束条件。密钥是 swf:taskList.name

  • workflowType.name:字符串约束条件。密钥是 swf:workflowType.name

  • workflowType.version:字符串约束条件。密钥是 swf:workflowType.version

注意

您不能限制超过五个标签。

StartTimer

  • 您不能限制此操作的参数。