在 Step Functions 中访问其它 AWS 账户中的资源 - AWS Step Functions

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

在 Step Functions 中访问其它 AWS 账户中的资源

为访问工作流中不同 AWS 账户中配置的资源,Step Functions 提供了跨账户存取。使用 Step Functions 服务集成,可以调用任何跨账户 AWS 资源,即使该 AWS 服务不支持基于资源的策略或跨账户调用。

例如,假设您在同一个 AWS 区域拥有两个 AWS 账户,分别称为“开发”和“测试”。使用跨账户存取,“开发”账户中的工作流可以访问“测试”账户中的资源,如 Amazon S3 存储桶、Amazon DynamoDB 表和 Lambda 函数。

重要

IAM 角色和基于资源的策略仅在单个分区内跨账户委派访问权限。例如,假定您在标准 aws 分区的美国西部(加利福尼亚北部)中有一个账户。您在 aws-cn 分区的中国(北京)中也有一个账户。您不能使用中国(北京)的账户中 Amazon S3 基于资源的策略,来允许标准 aws 账户中用户的访问权限。

有关跨账户存取的更多信息,请参阅《IAM 用户指南》中的跨账户策略评估逻辑

虽然每个 AWS 账户都能完全控制自己的资源,但借助 Step Functions,您就可以重组、交换、添加或删除工作流中的步骤,而无需定制任何代码。即使流程发生变化或应用程序不断发展,您也可以这样做。

您还可以调用嵌套状态机的执行,这样它们就可以在不同的账户中使用。这样做可以有效分离和隔离您的工作流。当您在工作流中使用 .sync 服务集成模式访问不同账户中的另一个 Step Functions 工作流时,Step Functions 会使用轮询来消耗您分配的配额。有关更多信息,请参阅 运行作业 (.sync)

注意

目前,跨区域 AWS 开发工具包集成和跨区域 AWS 资源访问在 Step Functions 中不可用。

关键的跨账户资源概念

执行角色

Step Functions 用来运行代码和访问 AWS 资源(例如 AWS Lambda 函数的调用操作)的 IAM 角色。

服务集成

可以在工作流的 Task 状态内调用的 AWS 开发工具包集成 API 操作。

源账户

拥有状态机并已开始执行的 AWS 账户。

目标账户

进行跨账户调用的 AWS 账户。

目标角色

目标账户中的 IAM 角色,状态机在调用目标账户所拥有的资源时会假定该角色。

运行作业 (.sync)

一种服务集成模式,用于调用 AWS Batch 等服务。它还能使 Step Functions 状态机在进入下一状态前等待作业完成。要指示 Step Functions 应该等待,请在 Task 状态定义的 Resource 字段中附加 .sync 后缀。

调用跨账户资源

要在工作流中调用跨账户资源,请执行以下操作:

  1. 在包含资源的目标账户中创建 IAM 角色。此角色向包含状态机的源账户授予访问目标账户资源的权限。

  2. Task 状态的定义中,指定在调用跨账户资源之前由状态机担任的目标 IAM 角色。

  3. 修改目标 IAM 角色中的信任策略来允许源账户临时担任此角色。信任策略必须包含源账户中定义的状态机的 Amazon 资源名称(ARN)。此外,还要在目标 IAM 角色中定义调用 AWS 资源的相应权限。

  4. 更新源账户的执行角色,使其包含担任目标 IAM 角色所需的权限。

有关示例,请参阅教程中的在 Step Functions 中访问跨账户 AWS 资源

注意

您可以配置状态机承担一个 IAM 角色,以便从多个 AWS 账户访问资源。但是,状态机在给定时间只能承担一个 IAM 角色。

访问跨账户资源的概念

跨账户存取 .sync 集成模式

在工作流中使用 .sync 服务集成模式时,Step Functions 会对调用的跨账户资源进行轮询,以确认任务是否完成。这会导致实际任务完成时间与 Step Functions 确认任务完成时间之间出现轻微延迟。目标 IAM 角色需要 .sync 调用所需的权限来完成轮询循环。为此,目标 IAM 角色必须拥有允许源账户承担的信任策略。此外,目标 IAM 角色还需要完成轮询循环所需的权限。

注意

嵌套快速工作流当前尚不支持 arn:aws:states:::states:startExecution.sync。请改用 arn:aws:states:::aws-sdk:sfn:startSyncExecution

.sync 调用的信任策略更新

更新目标 IAM 角色的信任策略,如下面的示例所示。sts:ExternalId 字段进一步控制谁可担任该角色。状态机的名称必须仅包含 AWS Security Token Service AssumeRole API 支持的字符。有关更多信息,请参阅 AWS Security Token Service API 参考中的 AssumeRole

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::sourceAccountID:role/InvokeRole", }, "Condition": { "StringEquals": { "sts:ExternalId": "arn:aws:states:us-east-2:sourceAccountID:stateMachine:stateMachineName" } } } ] }

.sync 调用所需的权限

要授予状态机所需的权限,请更新目标 IAM 角色所需的权限。有关更多信息,请参阅 Step Functions 如何为集成服务生成 IAM 策略。示例策略中的 Amazon EventBridge 权限不是必需的。例如,要启动状态机,请添加以下权限。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "states:StartExecution" ], "Resource": [ "arn:aws:states:region:accountID:stateMachine:stateMachineName" ] }, { "Effect": "Allow", "Action": [ "states:DescribeExecution", "states:StopExecution" ], "Resource": [ "arn:aws:states:region:accountID:execution:stateMachineName:*" ] } ] }