

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

# 在 Step Functi Amazon ons 中访问跨账户资源
访问跨账户资源

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

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

您可以配置状态机承担一个 IAM 角色，以便从多个 Amazon Web Services 账户访问资源。但是，根据 `Task` 状态的定义，状态机在给定时间只能承担一个 IAM 角色。

**注意**  
跨区域 Amazon SDK 集成和跨区域 Amazon 资源访问在 Step Functions 中不可用。

## 先决条件

+ 本教程以 Lambda 函数为例，演示如何设置跨账户存取。您可以使用任何其他 Amazon 资源，但请确保已在其他账户中配置该资源。
**重要**  
IAM 角色和基于资源的策略仅在单个分区内跨账户委派访问权限。例如，假定您在标准 `aws` 分区的美国西部（加利福尼亚北部）中有一个账户。您在 `aws-cn` 分区的中国（北京）中也有一个账户。您不能使用中国（北京）的账户中 Amazon S3 基于资源的策略，来允许标准 `aws` 账户中用户的访问权限。
+ 在文本文件中记下跨账户资源的 Amazon 资源名称 (ARN)。本教程稍后将在状态机的 `Task` 状态定义中提供此 ARN。以下是 Lambda 函数 ARN 的示例：

  ```
  arn:aws:lambda:us-east-2:account-id:function:functionName
  ```
+ 确保您已创建状态机需要承担的目标 IAM 角色。

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


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

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

1. 打开 [Step Functions 控制台](https://console.amazonaws.cn/states/home?region=us-east-1#/)，然后选择**创建状态机**。

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

1. 要打开 Workflow Studio，请选择**下一步**。

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

1. 在**配置**页面上，执行以下操作：

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

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

   1. 对于**提供 IAM 角色 ARN**，指定目标 IAM 角色 ARN。例如 `arn:aws:iam::111122223333:role/LambdaRole`。
**提示**  
或者，您也可以在包含 IAM 角色 ARN 的状态 JSON 输入中指定现有键值对的[参考路径](amazon-states-language-paths.md#amazon-states-language-reference-paths)。为此，选择**从状态输入中获取运行时的 IAM 角色 ARN**。有关使用引用路径指定值的示例，请参见。

1. 选择**下一步**。

1. 在**检查生成的代码**页面上，选择**下一步**。

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

1. 选择**创建状态机**。

1. 在文本文件中记下状态机的 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 角色。

创建信任关系后，源账户中的用户可以使用 Amazon Security Token Service (Amazon STS) [AssumeRole](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRole.html)API 操作。此操作提供临时安全证书，允许访问目标账户中的 Amazon 资源。

1. 使用 [https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/) 打开 IAM 控制台。

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

1. 选择**信任关系**选项卡。

1. 选择**编辑信任策略**并粘贴以下信任策略。请务必替换 Amazon Web Services 账户 号码和 IAM 角色 ARN。`sts:ExternalId` 字段进一步控制谁可担任该角色。状态机的名称必须仅包含 Amazon Security Token Service `AssumeRole` API 支持的字符。有关更多信息，请参阅《Amazon Security Token Service API Reference》**中的 [AssumeRole](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRole.html)。

   ```
   {
     "Version": "2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "sts:AssumeRole",
         "Principal": {
           "AWS": "arn:aws:iam::account-id: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:region:account-id:stateMachine:testCrossAccount"   //// ARN of the state machine that will assume the role.
           }
         }
       }
     ]
   }
   ```

1. 保持此窗口处于打开状态，然后继续阅读下一个步骤以进行后续操作。

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


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

1. 选择**权限**选项卡。

1. 选择**添加权限**，然后选择**创建内联策略**。

1. 选择 **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 Amazon resource being accessed
       }
     ]
   }
   ```

1. 选择**查看策略**。

1. 在**检查策略**页面上，输入一个权限名称，然后选择**创建策略**。

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


Step Functions 不会自动为所有跨账户服务集成生成[AssumeRole](https://docs.amazonaws.cn/STS/latest/APIReference/API_AssumeRole.html)政策。您必须在状态机的执行角色中添加所需的权限，使其能够在一个或多个 Amazon Web Services 账户中承担目标 IAM 角色。

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

   1. 在源账户中打开[第 1 步](#tutorial-access-cross-acct-resources-update-task-def)中创建的状态机。

   1. 在**状态机详细信息**页面上，选择 **IAM 角色 ARN**。

1. 在**权限**选项卡上，选择**添加权限**，然后选择**创建内联策略**。

1. 选择 **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
       }
     ]
   }
   ```

1. 选择**查看策略**。

1. 在**检查策略**页面上，输入一个权限名称，然后选择**创建策略**。