

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Step Functions 中存取跨帳戶 AWS 資源
<a name="tutorial-access-cross-acct-resources"></a>

透過 Step Functions 中的跨帳戶存取支援，您可以共用在不同的 中設定的資源 AWS 帳戶。在本教學課程中，我們會逐步引導您存取名為**生產**之帳戶中定義的跨帳戶 Lambda 函數。此函數是從名為**開發**之帳戶中的狀態機器叫用。在本教學課程中，**開發**帳戶稱為*來源帳戶*，而**生產**帳戶是包含目標 IAM 角色的目標*帳戶*。

若要開始，請在`Task`狀態的定義中，指定狀態機器在叫用跨帳戶 Lambda 函數之前必須擔任的目標 IAM 角色。然後，修改目標 IAM 角色中的信任政策，以允許來源帳戶暫時擔任目標角色。此外，若要呼叫 AWS 資源，請在目標 IAM 角色中定義適當的許可。最後，更新來源帳戶的執行角色，以指定擔任目標角色所需的許可。

您可以將狀態機器設定為擔任 IAM 角色，以從多個 存取資源 AWS 帳戶。不過，根據狀態的定義，`Task`狀態機器在特定時間只能擔任一個 IAM 角色。

**注意**  
Step Functions 不提供跨區域 AWS SDK 整合和跨區域 AWS 資源存取。

## 先決條件
<a name="tutorial-access-cross-acct-resources-prereq"></a>
+ 本教學課程使用 Lambda 函數的範例，示範如何設定跨帳戶存取。您可以使用任何其他 AWS 資源，但請確定您已在不同的帳戶中設定資源。
**重要**  
IAM 角色和資源型政策只會在單一分割內跨帳戶委派存取許可。例如，假設您在標準 `aws` 分割區的美國西部 (加利佛尼亞北部) 中有一個帳戶。您在 `aws-cn` 分割區的中國 (北京) 中也有一個帳戶。您不能使用中國 (北京) 中帳戶的 Amazon S3 資源型政策，對標準 `aws` 帳戶中的使用者允許存取許可。
+ 在文字檔案中記下跨帳戶資源的 Amazon Resource Name (ARN)。在本教學稍後，您將在狀態機器`Task`的狀態定義中提供此 ARN。以下是 Lambda 函數 ARN 的範例：

  ```
  arn:aws:lambda:us-east-2:{{account-id}}:function:{{functionName}}
  ```
+ 請確定您已建立狀態機器需要擔任的目標 IAM 角色。

## 步驟 1：更新任務狀態定義以指定目標角色
<a name="tutorial-access-cross-acct-resources-update-task-def"></a>

在工作流程`Task`的狀態中，新增`Credentials`欄位，其中包含在叫用跨帳戶 Lambda 函數之前，狀態機器必須擔任的身分。

下列程序示範如何存取稱為 的跨帳戶 Lambda 函數`Echo`。您可以依照下列步驟呼叫任何 AWS 資源。

1. 開啟 [Step Functions 主控台](https://console.aws.amazon.com/states/home?region=us-east-1#/)，然後選擇**建立狀態機器**。

1. 在**選擇撰寫方法**頁面上，選擇**以視覺化方式設計工作流程**，並保留所有預設選擇。

1. 若要開啟工作流程 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`。
**提示**  
或者，您也可以在狀態的 JSON 輸入中指定現有鍵值對的[參考路徑](amazon-states-language-paths.md#amazon-states-language-reference-paths)，其中包含 IAM 角色 ARN。若要這樣做，請選擇**在執行時間從狀態輸入取得 IAM 角色 ARN**。如需使用參考路徑指定值的範例，請參閱 [將 JSONPath 指定為 IAM 角色 ARN](state-task.md#example-credentials-specify-dynamic-jsonpath)。

1. 選擇**下一步**。

1. 在**檢閱產生的程式碼**頁面上，選擇**下一步**。

1. 在**指定狀態機器設定**頁面上，指定新狀態機器的詳細資訊，例如名稱、許可和記錄層級。

1. 選擇 **Create state machine (建立狀態機器)**。

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：更新目標角色的信任政策
<a name="tutorial-access-cross-acct-resources-update-target-trust-policy"></a>

IAM 角色必須存在於目標帳戶中，而且您必須修改其信任政策，以允許來源帳戶暫時擔任此角色。此外，您可以控制誰可以擔任目標 IAM 角色。

建立信任關係後，來自來源帳戶的使用者可以使用 AWS Security Token Service (AWS STS) [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) API 操作。此操作提供臨時安全登入資料，以允許存取目標帳戶中 AWS 的資源。

1. 前往 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 開啟 IAM 主控台。

1. 在主控台的導覽窗格中，選擇**角色**，然後使用搜尋方塊來搜尋目標 IAM 角色。例如 `{{LambdaRole}}`。

1. 選擇**信任關係**標籤。

1. 選擇**編輯信任政策**並貼上下列信任政策。請務必取代 AWS 帳戶 數字和 IAM 角色 ARN。`sts:ExternalId` 欄位進一步控制誰可以擔任該角色。狀態機器的名稱只能包含 `AssumeRole` API AWS Security Token Service 支援的字元。如需詳細資訊，請參閱《AWS Security Token Service API 參考》**中的 [AssumeRole](https://docs.aws.amazon.com/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：在目標角色中新增必要的許可
<a name="tutorial-access-cross-acct-resources-add-permissions"></a>

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 AWS resource being accessed
       }
     ]
   }
   ```

1. 選擇**檢閱政策**。

1. 在**檢閱政策**頁面上，輸入許可的名稱，然後選擇**建立政策**。

## 步驟 4：在執行角色中新增許可以擔任目標角色
<a name="tutorial-access-cross-acct-resources-update-exec-role"></a>

Step Functions 不會為所有跨帳戶服務整合自動產生 [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 政策。您必須在狀態機器的執行角色中新增必要的許可，以允許它在一或多個 中擔任目標 IAM 角色 AWS 帳戶。

1. 在 IAM 主控台中開啟狀態機器的執行角色，網址為 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/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. 在**檢閱政策**頁面上，輸入許可的名稱，然後選擇**建立政策**。