教程:在 Step Function AWS s 中访问跨账户资源 - AWS Step Functions

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

教程:在 Step Function AWS s 中访问跨账户资源

借助 Step Functions 中的跨账户存取支持,您可以共享不同 AWS 账户配置的资源。在本教程中,我们将引导您完成访问在名为生产的账户中定义的跨账户 Lambda 函数的过程。该函数从名为开发的账户中的状态机调用。在本教程中,开发账户被称为源账户生产账户是包含目标IAM角色的目标账户

首先,在您所在Task州的定义中,指定状态机在调用跨账户 Lambda 函数之前必须扮演的目标IAM角色。然后,修改目标IAM角色中的信任策略以允许源账户临时担任目标角色。此外,要调用 AWS 资源,请在目标IAM角色中定义相应的权限。最后,更新源账户的执行角色,指定担任目标角色所需的权限。

您可以将状态机配置为IAM扮演访问多个资源的角色 AWS 账户。但是,根据状态的定义,状态机在给定时间只能扮IAM演一个角色。Task

注意

目前,跨区域 AWS SDK集成和跨区域 AWS 资源访问在 Step Functions 中不可用。

先决条件

  • 本教程以 Lambda 函数为例,演示如何设置跨账户存取。您可以使用任何其他 AWS 资源,但请确保已在其他账户中配置该资源。

    重要

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

  • 在文本文件中记下跨账户资源的 Amazon 资源名称 (ARN)。在本教程的后面部分,你将在状态机的Task状态定义ARN中提供这一点。以下是 Lambda 函数的示例:ARN

    arn:aws:lambda:us-east-2:123456789012:function:functionName
  • 确保你已经创建了状态机需要IAM扮演的目标角色。

第 1 步:更新 Task 状态定义以指定目标角色

在工作流的 Task 状态下,添加一个 Credentials 字段,其中包含状态机在调用跨账户 Lambda 函数之前必须承担的身份。

以下过程演示了如何访问名为 Echo 的跨账户 Lambda 函数。您可以按照以下步骤调用任何 AWS 资源。

  1. 打开 Step Functions 控制台,然后选择创建状态机

  2. 选择创作方法页面上,选择直观地设计工作流,并保留所有默认选择。

  3. 要打开 Workflow Studio,请选择下一步

  4. 操作选项卡上,将一个 Task 状态拖放到画布上。这将调用使用此 Task 状态的跨账户 Lambda 函数。

  5. 配置页面上,执行以下操作:

    1. 将状态重命名为 Cross-account call

    2. 对于函数名称,选择输入函数名称,然后在框ARN中输入 Lambda 函数。例如,arn:aws:lambda:us-east-2:111122223333:function:Echo

    3. 在 “提供IAM角色” 中ARN,指定目标IAM角色ARN。例如,arn:aws:iam::111122223333:role/LambdaRole

      提示

      或者,您也可以在包含角色的状态JSON输入中指定现有键值对的引用路径。IAM ARN为此,请从状态输入中选择 “ARN在运行时获取IAM角色”。有关使用引用路径指定值的示例,请参见指定JSONPath为IAM角色 ARN

  6. 选择下一步

  7. 检查生成的代码页面上,选择下一步

  8. 指定状态机设置页面上,指定新状态机的详细信息,例如名称、权限和日志级别。

  9. 选择创建状态机

  10. 在文本文件中记下状态机的IAM角色ARN和状态机ARN。您需要在目标账户的信任政策ARNs中提供这些信息。

现在,您的 Task 状态定义应类似于以下定义。

{ "StartAt": "Cross-account call", "States": { "Cross-account call": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "Credentials": { "RoleArn": "arn:aws:iam::111122223333:role/LambdaRole" }, "Parameters": { "FunctionName": "arn:aws:lambda:us-east-2:111122223333:function:Echo", }, "End": true } } }

第 2 步:更新目标角色的信任策略

该IAM角色必须存在于目标账户中,并且您必须修改其信任策略以允许源账户临时担任此角色。此外,您可以控制谁可以担任目标IAM角色。

创建信任关系后,源账户中的用户可以使用 AWS Security Token Service (AWS STS) AssumeRoleAPI操作。此操作提供临时安全证书,允许访问目标账户中的 AWS 资源。

  1. 打开IAM控制台,网址为https://console.aws.amazon.com/iam/

  2. 在控制台的导航窗格上,选择角色,然后使用搜索框搜索目标IAM角色。例如,LambdaRole

  3. 选择信任关系选项卡。

  4. 选择编辑信任策略并粘贴以下信任策略。请务必替换 AWS 账户 号码和IAM角色ARN。sts:ExternalId 字段进一步控制谁可担任该角色。状态机的名称必须仅包含 AWS Security Token Service AssumeRoleAPI支持的字符。有关更多信息,请参阅 “AWS Security Token Service API参考AssumeRole中的。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Principal": { "AWS": "arn:aws:iam::123456789012:role/ExecutionRole" // The source account's state machine execution role ARN }, "Condition": { // Control which account and state machine can assume the target IAM role "StringEquals": { "sts:ExternalId": "arn:aws:states:us-east-1:123456789012:stateMachine:testCrossAccount" //// ARN of the state machine that will assume the role. } } } ] }
  5. 保持此窗口处于打开状态,然后继续阅读下一个步骤以进行后续操作。

第 3 步:将所需权限添加到目标角色

IAM策略中的权限决定是允许还是拒绝特定请求。目标IAM角色必须具有调用 Lambda 函数的正确权限。

  1. 选择权限选项卡。

  2. 选择添加权限,然后选择创建内联策略

  3. 选择JSON选项卡,将现有内容替换为以下权限。请务必替换您的 Lambda 函数。ARN

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:us-east-2:111122223333:function:Echo" // The cross-account AWS resource being accessed } ] }
  4. 选择查看策略

  5. 检查策略页面上,输入一个权限名称,然后选择创建策略

第 4 步:在执行角色中添加承担目标角色的权限

Step Functions 不会自动为所有跨账户服务集成生成AssumeRole政策。您必须在状态机的执行角色中添加所需的权限,以允许其在一个或多个中IAM扮演目标角色 AWS 账户。

  1. 在IAM控制台中打开状态机的执行角色,网址为https://console.aws.amazon.com/iam/。要实现此目的,应按照以下步骤进行:

    1. 在源账户中打开第 1 步中创建的状态机。

    2. 状态机详细信息页面上,选择IAM角色ARN

  2. 权限选项卡上,选择添加权限,然后选择创建内联策略

  3. 选择JSON选项卡,将现有内容替换为以下权限。请务必替换您的 Lambda 函数。ARN

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::111122223333:role/LambdaRole" // The target role to be assumed } ] }
  4. 选择查看策略

  5. 检查策略页面上,输入一个权限名称,然后选择创建策略