

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

# IAM 教學課程：使用 IAM 角色在 AWS 帳戶之間委派存取權
<a name="tutorial_cross-account-with-roles"></a>

**重要**  
 IAM [最佳實務](best-practices.md)建議您要求人類使用者使用聯合身分提供者來 AWS 使用臨時憑證存取 ，而不是使用具有長期憑證的 IAM 使用者。建議您僅將 IAM 使用者用於聯合身分使用者不支援的[特定使用案例](gs-identities-iam-users.md)。

此教學課程教導您如何使用角色將存取權委派給不同 AWS 帳戶 (稱為**目的地**和**來源**) 中的資源。您與不同帳戶中的使用者分享一個帳戶中的資源。透過以這種方式設定跨帳戶存取，您不需要在每個帳戶中建立個別的 IAM 使用者。此外，使用者不需要為了存取不同 AWS 帳戶中的資源，登出一個帳戶然後登入另一個帳戶。設定角色之後，您會看到如何從 AWS 管理主控台 AWS CLI、 和 API 使用角色。

在本教學課程中，**目的地**帳戶會管理不同應用程式和團隊存取的應用程式資料。在每個帳戶中，應用程式資訊存放在 Amazon S3 儲存貯體中。可以在**來源**帳戶中管理 IAM 使用者，您在其中擁有兩個 IAM 使用者角色：**開發人員**和**分析師**。開發人員和分析師使用**來源**帳戶來產生多個微服務共用的資料。兩個角色都有權在來源帳戶中工作並存取資源。開發人員必須經常更新**目的地**帳戶中的共用資料。開發人員將此資料存放在稱為 `amzn-s3-demo-bucket-shared-container` 的 Amazon S3 儲存貯體中。

在本教學的結尾，您會擁有：
+ 允許**來源**帳戶 (受信任帳戶) 中的使用者在**目的地**帳戶中擔任特定角色。
+ 允許**目的地**帳戶 (信任帳戶) 中的角色存取特定 Amazon S3 儲存貯體。
+ **目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。

開發人員可以使用 中的 角色 AWS 管理主控台 來存取**目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container`儲存貯體。他們也可以透過使用 API 呼叫來存取儲存貯體，而該呼叫是由角色提供的暫時性憑證進行身分驗證。分析師進行類似嘗試來使用角色會失敗。

此工作流程有三個基本步驟：

**[在目的地帳戶中建立角色](#tutorial_cross-account-with-roles-1)**  
首先，您可以使用 AWS 管理主控台 建立**目的地**帳戶 (ID 號碼 999999999999) 與**原始**帳戶 (ID 號碼 111111111111) 之間的信任。透過建立一個名為 *UpdateData* 的 IAM 角色開始。建立角色後，您可以將**來源**帳戶定義為受信任的實體並指定許可政策，該政策允許受信任的使用者更新 `amzn-s3-demo-bucket-shared-container` 儲存貯體。

**[授予角色存取權](#tutorial_cross-account-with-roles-2)**  
在本節中，您修改角色政策，以拒絕分析師存取 `UpdateData` 角色。由於分析師在此案例中具有 PowerUser 存取權，您必須明確*拒絕*使用角色的能力。

**[透過切換角色測試存取](#tutorial_cross-account-with-roles-3)**  
最後，作為開發人員，使用 `UpdateData` 角色來更新**目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。您會了解如何透過 AWS 主控台 AWS CLI、 和 API 存取角色。

## 考量事項
<a name="tutorial_cross-account-with-roles-considerations"></a>

在您使用 IAM 角色委派資源存取權之前 AWS 帳戶，請務必考慮下列事項：
+ 以 AWS 帳戶根使用者身分登入時無法切換到特定角色。
+ IAM 角色和資源型政策只會在單一分割內跨帳戶委派存取許可。例如，假設您在標準 `aws` 分割區的美國西部 (加利佛尼亞北部) 中有一個帳戶。您在 `aws-cn` 分割區的中國 (北京) 中也有一個帳戶。您不能使用中國 (北京) 中帳戶的 Amazon S3 資源型政策，對標準 `aws` 帳戶中的使用者允許存取許可。
+ 您可以使用 AWS IAM Identity Center 來使用安全性聲明標記語言 (SAML) 促進外部 AWS 帳戶 （您 外部的帳戶 AWS Organizations) 的單一登入 (SSO)。如需詳細資訊，請參閱[使用 SAML 2.0 將外部整合 AWS 帳戶 到具有獨立帳單 AWS IAM Identity Center 的中央存取管理](https://community.aws/content/2dIMI8N7w7tGxbE0KQMrkSBfae4/aws-iam-identity-center-integration-with-external-aws-accounts-for-independent-billing?lang=en) 
+ 您可以將角色與 Amazon EC2 執行個體或 AWS Lambda 函數等 AWS 資源建立關聯。如需詳細資訊，請參閱[建立角色以將許可委派給 AWS 服務](id_roles_create_for-service.md)。
+ 如果您想要讓應用程式在另一個 中擔任角色 AWS 帳戶，您可以使用 AWS SDK 來擔任跨帳戶角色。如需詳細資訊，請參閱 *AWS SDKs and Tools Reference Guide* 中的 [Authentication and access](https://docs.aws.amazon.com//sdkref/latest/guide/access.html)。
+ 使用 切換角色 AWS 管理主控台 僅適用於不需要 的帳戶`ExternalId`。例如，假設您將您帳戶的存取權授與第三方，並在許可政策的 `Condition` 元素中需要 `ExternalId`。在這種情況下，第三方只能使用 AWS API 或命令列工具存取您的帳戶。第三方無法使用主控台，因為它必須提供 `ExternalId` 的值。如需此案例的詳細資訊，請參閱 [存取第三方 AWS 帳戶 擁有的](id_roles_common-scenarios_third-party.md)和 AWS 安全部落格中的[如何啟用跨帳戶存取 AWS 管理主控台](https://aws.amazon.com/blogs/security/how-to-enable-cross-account-access-to-the-aws-management-console) 。

## 先決條件
<a name="tutorial_cross-account-with-roles-prereqs"></a>

此教學課程假設您已備妥下列項目：
+ 您可以使用**兩個**不同的 AWS 帳戶 ，一個代表**原始**帳戶，另一個代表**目的地**帳戶。
+ **來源**帳戶中使用者和角色的建立和設定，如下所示：  
****    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)
+ 不需要在**目的地**帳戶中建立任何使用者。
+ 在**目的地**帳戶中建立的 Amazon S3 儲存貯體。您可在此教學課程中將其稱為 `amzn-s3-demo-bucket-shared-container`，但因為 S3 儲存貯體名稱必須是全域唯一，所以您必須使用不同名稱的儲存貯體。

## 在目的地帳戶中建立角色
<a name="tutorial_cross-account-with-roles-1"></a>

您可以允許某個使用者 AWS 帳戶 存取另一個資源 AWS 帳戶。在本教學課程中，我們將透過建立一個角色來完成操作，該角色定義誰可以存取它，以及它會將哪些許可授予給切換到它的使用者。

在教學課程的此步驟中，您在**目的地**帳戶中建立角色，並指定**來源**帳戶作為受信任的實體。您也限制角色的許可為僅擁有讀取和寫入 `amzn-s3-demo-bucket-shared-container` 儲存貯體的存取許可。被授予許可以使用角色的任何人都可以讀取和寫入 `shared-container` 儲存貯體。

在建立角色之前，您需要**原始** AWS 帳戶*伺服器的帳戶 ID*。每個 AWS 帳戶 都有指派的唯一帳戶 ID 識別符。

**若要取得來源 AWS 帳戶 ID**

1. 以**原始**帳戶的管理員 AWS 管理主控台 身分登入 ，然後開啟位於 https：//[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 的 IAM 主控台。

1. 在 IAM 主控台中，在右上角的導覽列中選擇您的使用者名稱。它通常如下：**{{username}}@{{account\_ID\_number\_or\_alias}}**。

   在此案例中，您可以使用帳戶 ID 111111111111 表示**來源**帳戶。不過，如果您在測試環境中使用此案例，則應該使用有效的帳戶 ID。

**若要在目的地帳戶中建立來源帳戶可以使用的角色**

1. 以**目的地**帳戶的管理員 AWS 管理主控台 身分登入 ，然後開啟 IAM 主控台。

1. 建立角色之前，請準備定義角色所需許可的受管政策。您可以在稍後的步驟將此政策連接至角色。

   您想要設定 `amzn-s3-demo-bucket-shared-container` 儲存貯體的讀取和寫入存取許可。雖然 AWS 提供一些 Amazon S3 受管政策，但沒有提供單一 Amazon S3 儲存貯體的讀取和寫入存取權。您可以改為建立自己的政策。

   在導覽窗格中，選擇 **Policies (政策)**，然後選擇 **Create policy (建立政策)**。

1. 選擇 **JSON** 標籤並從下列 JSON 政策文件複製文字。將此文字貼到 ** JSON ** 文字方塊中，以您 Amazon S3 儲存貯體的真實 ARN 替換資源 ARN (`arn:aws:s3:::shared-container`)。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "s3:ListAllMyBuckets",
         "Resource": "*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:ListBucket",
           "s3:GetBucketLocation"
          ],
         "Resource": "{{arn:aws:s3:::amzn-s3-demo-bucket-shared-container}}"
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           "s3:PutObject",
           "s3:DeleteObject"
         ],
         "Resource": "{{arn:aws:s3:::amzn-s3-demo-bucket-shared-container/*}}"
       }
     ]
   }
   ```

------

   `ListAllMyBuckets` 動作授予許可，可列出已經過身分驗證的請求發送者擁有的所有儲存貯體 `ListBucket` 許可允許使用者檢視 `amzn-s3-demo-bucket-shared-container` 儲存貯體中的物件。`GetObject`、`PutObject`、`DeleteObject` 許可允許使用者檢視、更新和刪除 `amzn-s3-demo-bucket-shared-container` 儲存貯體中的內容。
**注意**  
您可以隨時切換**視覺化**與 **JSON** 編輯器選項。不過，如果您進行變更或在**視覺化**編輯器中選擇**下一步**，IAM 就可能會調整您的政策結構，以便針對視覺化編輯器進行最佳化。如需詳細資訊，請參閱[政策結構調整](troubleshoot_policies.md#troubleshoot_viseditor-restructure)。

1. 在**檢視與建立**頁面上，針對政策名稱輸入 **read-write-app-bucket**。檢視政策授與的許可，然後選擇**建立政策**來儲存您的工作。

   新的政策會出現在受管政策清單中。

1. 在導覽窗格中，選擇 **Roles** (角色)，然後選擇 **Create role** (建立角色)。

1. 選擇 ** AWS 帳戶** 角色類型。

1. 針對**帳戶 ID**，輸入**來源**帳戶 ID。

   此教學課程將範例帳戶 ID **111111111111** 用於**來源**帳戶。您應該使用有效的帳戶 ID。如果您使用無效的帳戶 ID (例如 **111111111111**)，IAM 不會讓您建立新的角色。

   現在您不需要要求外部 ID，或要求使用者要有多重要素驗證 (MFA) 才能擔任角色。請保持不選取這些選項。如需更多詳細資訊，請參閱 [AWS IAM 中的多重要素驗證](id_credentials_mfa.md)。

1. 選擇 **Next: Permissions (下一步：許可)**，以設定與角色建立關聯的許可。

1. 選擇您之前建立的政策旁的核取方塊。
**秘訣**  
針對 **Filter (篩選條件)**，選擇 **Customer managed (客戶受管)** 以篩選清單，使其僅包含建立的政策。這會隱藏 AWS 建立的政策並讓找出所需項目更容易。

   然後選擇**下一步**。

1. (選用) 藉由連接標籤作為鍵值對，將中繼資料新增至角色。如需有關在 IAM 中使用標籤的詳細資訊，請參閱 [AWS Identity and Access Management 資源的標籤](id_tags.md)。

1. (選用) 在 **Description** (說明) 中，輸入新角色的說明。

1. 檢閱角色之後，選擇 **Create role (建立角色)**。

    

   `UpdateData` 角色會顯示在角色清單中。

現在，您必須取得角色的 Amazon Resource Name (ARN)，這是該角色的唯一識別碼。當您在來源帳戶中修改開發人員的角色時，可以從目的地帳戶指定角色 ARN，以授予或拒絕許可。

**若要取得 UpdateData 的 ARN**

1. 在 IAM 主控台的導覽窗格中，選擇 **Roles** (角色)。

1. 在角色清單中，選擇 `UpdateData` 角色。

1. 在詳細資訊窗格的 **Summary (摘要)** 區段中，複製 **Role ARN (角色 ARN)** 值。

   目的地帳戶的帳戶 ID 為 999999999999，所以角色 ARN 為 `arn:aws:iam::999999999999:role/UpdateData`。請確定您提供目的地帳戶的真實 AWS 帳戶 ID。

此時，您已在**目的地**和**來源**帳戶之間建立信任。完成上述作業的方法是在**目的地**帳戶中建立角色，它可將**來源**帳戶識別為受信任主體。您也定義切換到 `UpdateData` 角色的使用者可以執行什麼動作。

接下來，修改開發人員角色的許可。

## 授予角色存取權
<a name="tutorial_cross-account-with-roles-2"></a>

此時，分析師和開發人員都擁有許可，允許他們管理**來源**帳戶中的資料。使用以下所需的步驟以新增各種許可允許切換到該角色。

**若要修改開發人員角色，以允許他們切換到 UpdateData 角色**

1. 在**來源**帳戶中以管理員身分登入，並開啟 IAM 主控台。

1. 選擇**角色**，然後選擇**開發人員**。

1. 選擇 **Permissions (許可)** 標籤，選擇 **Add permissions (新增許可)**，然後選擇 **Attach policy (連接政策)**。

1. 請選擇 **JSON** 標籤。

1. 新增以下政策陳述式，以允許針對目的地帳戶中的 `UpdateData` 角色進行 `AssumeRole` 動作。請務必將 `Resource`元素中的 {{DESTINATION-ACCOUNT-ID}} 變更為目的地帳戶的實際 AWS 帳戶 ID。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::{{111122223333}}:role/UpdateData"
       }
   }
   ```

------

   `Allow` 效果明確地允許開發人員群組存取目的地帳戶中的 `UpdateData` 角色。任何嘗試存取角色的開發人員都會成功。

1. 選擇 **Review policy (檢閱政策)**。

1. 輸入**名稱**，例如 **allow-assume-S3-role-in-destination**。

1. 選擇**建立政策**。

在大多數環境中，可能不需要以下程序。不過，如果您使用 PowerUserAccess 許可，則一些群組可能已經能夠切換角色。下列程序顯示如何將 `"Deny"` 許可新增到分析師群組，以確保他們無法擔任角色。如果在您的環境中並不需要此程序，我們建議您不要新增。`"Deny"` 許可會讓整體許可情況變得更複雜，不易管理和了解。只在沒有更好的選項時使用 `"Deny"` 許可。

**若要修改分析師角色以拒絕擔任 `UpdateData` 角色的許可**

1. 選擇**角色**，然後選擇**分析師**。

1. 選擇 **Permissions (許可)** 標籤，選擇 **Add permissions (新增許可)**，然後選擇 **Attach policy (連接政策)**。

1. 請選擇 **JSON** 標籤。

1. 新增以下政策陳述式以拒絕 `UpdateData` 角色的 `AssumeRole` 動作。請務必將 `Resource`元素中的 {{DESTINATION-ACCOUNT-ID}} 變更為目的地帳戶的實際 AWS 帳戶 ID。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Deny",
           "Action": "sts:AssumeRole",
           "Resource": "arn:aws:iam::{{111122223333}}:role/UpdateData"
       }
   }
   ```

------

   `Deny` 效果明確拒絕分析師群組存取目的地帳戶中的 `UpdateData` 角色。任何嘗試存取角色的分析師都會收到存取遭拒的訊息。

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

1. 輸入**名稱**，例如 **deny-assume-S3-role-in-destination**。

1. 選擇**建立政策**。

開發人員角色現在擁有許可，可使用目的地帳戶中的 `UpdateData` 角色。會防止分析師角色使用 `UpdateData` 角色。

接下來，您可以了解開發人員 David 如何存取目的地帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。David 可以從 AWS 管理主控台 AWS CLI、 或 AWS API 存取儲存貯體。

## 透過切換角色測試存取
<a name="tutorial_cross-account-with-roles-3"></a>

完成此教學課程的前兩個步驟後，您會有一個角色可授予存取**目的地**帳戶中的資源。您在**來源**帳戶中也有一個角色，允許使用者使用該角色。此步驟討論如何測試從 AWS 管理主控台、 AWS CLI和 AWS API 切換到該角色。

若要取得您在使用 IAM 角色時可能遇到的常見問題說明，請參閱 [IAM 角色疑難排解](troubleshoot_roles.md)。

### 切換角色 (主控台)
<a name="switch-tutorial_cross-account-with-roles"></a>

如果 David 需要更新 **中目的地**帳戶中的資料 AWS 管理主控台，他可以使用**切換角色**來執行此操作。他會指定帳戶 ID 或別名和角色名稱，而其許可會立即切換到角色所允許的項目。然後他可以利用主控台來使用 `amzn-s3-demo-bucket-shared-container` 儲存貯體，但無法使用**目的地**中的任何其他資源。當 David 使用角色時，他也無法運用他在**來源**帳戶中的進階使用者權限。那是因為一次只有一組許可有效。

David 可以使用 IAM 提供的兩種方式來進入 **Switch Role (切換角色)** 頁面：
+ David 從他們的管理員那裡收到指向預先定義的 Switch Role (切換角色) 組態的連結。該連結是在 **Create Role (建立角色)** 精靈的最終頁面上，或在跨帳戶角色的 **Role Summary (角色摘要)** 頁面上，提供給管理員。選擇此連結會帶領 David 前往已填寫 **Account ID (帳戶 ID)** 和 **Role name (角色名稱)** 欄位的 **Switch Role (切換角色)** 頁面。David 需要做的只有選擇**切換角色**。
+ 管理員不會在電子郵件中傳送連結，但會改為傳送 **Account ID (帳戶 ID)** 號碼和 **Role Name (角色名稱)** 的值。若要切換角色，大衛必須手動輸入該值。下列程序中會以圖表說明：

**擔任角色**

1. David AWS 管理主控台 使用原始****帳戶的一般使用者登入 。

1. 他們選擇管理員電郵給他們的連結。這會將 David 導航到 **Switch Role** (切換角色) 頁面，其中帳戶 ID 或別名以及角色名稱資訊已填寫。

   —或—

   David 在導覽列上選擇他們的名稱 (Identity (身分) 選單)，然後選擇 **Switch Roles** (切換角色)。

   如果這是 David 第一次以這種方式嘗試存取 Switch Role (切換角色) 頁面，他首先停留在初次執行的 **Switch Role (切換角色)** 頁面。此頁面提供有關切換角色如何讓使用者跨 AWS 帳戶管理資源的額外資訊。David 必須在此頁面上選擇 **Switch Role (切換角色)**，以完成此程序的剩餘部分。

1. 接下來，為了存取角色，David 必須手動輸入目的地帳戶 ID 號碼 (`999999999999`) 和角色名稱 (`UpdateData`)。

   此外，David 想要監控 IAM 中目前作用中的角色 (以及相關聯的許可)。為了追蹤此資訊，他在 **Display Name (顯示名稱)** 文字方塊中輸入 `Destination`、選擇紅色選項，然後選擇 **Switch Role (切換角色)**。

1. David 現在可以使用 Amazon S3 主控台來使用 `UpdateData` 角色所具有許可的 Amazon S3 儲存貯體或任何其他資源。

1. 完成後，David 可以回到他們的原始許可。為了執行此作業，他們在導覽列上選擇**目的地**角色顯示名稱，然後選擇**返回到 David @ 111111111111**。

1. 下次 David 想要切換角色和在導覽列中選擇**身分**選單時，他會看到上次的目的地項目仍在那裡。他可以只要選擇該項目即可立即切換角色，而無需重新輸入帳戶 ID 和角色名稱。

### 切換角色 (AWS CLI)
<a name="switch-cli-tutorial_cross-account-with-roles"></a>

 如果 David 需要在命令列的**目的地**環境中工作，則可以使用 [AWS CLI](https://aws.amazon.com/cli/)。他執行 `aws sts assume-role` 命令，並傳遞角色 ARN 以取得該角色的暫時性安全憑證。然後，他會在環境變數中設定這些登入資料，以便後續 AWS CLI 命令使用角色的許可運作。雖然 David 使用該角色，但他無法在**來源**帳戶中使用他的進階使用者許可，因為一次只能有一組許可有效。

請注意，所有存取金鑰和權杖僅為範例，不能如下所示般使用。以您實際環境中的適當值取代。

**擔任角色**

1. David 會開啟命令提示視窗，並透過執行 命令來確認 AWS CLI 用戶端是否正常運作：

   ```
   aws help
   ```
**注意**  
David 的預設環境使用其預設設定檔的 `David` 使用者憑證，這是使用 `aws configure` 命令建立的。如需詳細資訊，請參閱 *AWS Command Line Interface 使用者指南*中的[設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration)。

1. 他透過執行以下命令開始切換角色程序，以切換到**目的地**帳戶中的 `UpdateData` 角色。他從建立角色的管理員角色收到角色 ARN。該命令也會要求您提供工作階段名稱，您可以選擇您想要的任何文字。

   ```
   aws sts assume-role --role-arn "arn:aws:iam::999999999999:role/UpdateData" --role-session-name "David-ProdUpdate"
   ```

   David 然後會在輸出中看到以下：

   ```
   {
       "Credentials": {
           "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
           "SessionToken": "AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLE
   CvSRyh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDy
   EXAMPLE9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3Uuysg
   sKdEXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLEsnf87e
   NhyDHq6ikBQ==",
           "Expiration": "2014-12-11T23:08:07Z",
           "AccessKeyId": "AKIAIOSFODNN7EXAMPLE"
       }
   }
   ```

1. David 在輸出的 Credentials (憑證) 區段看到他們需要的三個部分。
   + `AccessKeyId`
   + `SecretAccessKey`
   + `SessionToken`

   David 需要將 AWS CLI 環境設定為在後續呼叫中使用這些參數。如需設定憑證各種方式的資訊，請參閱[設定 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#config-settings-and-precedence)。您不能使用 `aws configure` 命令，因為它不支援擷取工作階段權杖。不過，您可以將資訊手動輸入到組態檔案中。由於這些是暫時性憑證，其過期時間相對較短，最簡單的方式是將它們新增至您目前命令列工作階段的環境。

1. 為新增三個值到環境，David 剪下並貼上前一個步驟的輸出到以下命令中。建議您剪下並貼上到簡單的文字編輯器，來處理工作階段權杖輸出中的換行問題。它必須新增為單一長字串，即使在這裡為清楚起見以換行方式顯示。

   以下範例顯示 Windows 環境中指定命令，其中 "set" 是用來建立環境變數的命令。在 Linux 或 macOS 電腦上，請改為使用命令 "export"。範例的所有其他部分在所有三個環境中均為有效。

   如需使用 Windows Powershell 工具的詳細資訊，請參閱[切換至 IAM 角色 (Tools for Windows PowerShell)](id_roles_use_switch-role-twp.md)

   ```
   set AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
   set AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
   set AWS_SESSION_TOKEN=AQoDYXdzEGcaEXAMPLE2gsYULo+Im5ZEXAMPLEeYjs1M2FUIgIJx9tQqNMBEXAMPLECvS
   Ryh0FW7jEXAMPLEW+vE/7s1HRpXviG7b+qYf4nD00EXAMPLEmj4wxS04L/uZEXAMPLECihzFB5lTYLto9dyBgSDyEXA
   MPLEKEY9/g7QRUhZp4bqbEXAMPLENwGPyOj59pFA4lNKCIkVgkREXAMPLEjlzxQ7y52gekeVEXAMPLEDiB9ST3UusKd
   EXAMPLE1TVastU1A0SKFEXAMPLEiywCC/Cs8EXAMPLEpZgOs+6hz4AP4KEXAMPLERbASP+4eZScEXAMPLENhykxiHen
   DHq6ikBQ==
   ```

   此時，任何下列命令在這些憑證所識別角色的許可下執行。在 David 的案例中，為 `UpdateData` 角色。
**重要**  
您可以將常用的組態設定和憑證儲存在 AWS CLI維護的檔案中。如需詳細資訊，請參閱《AWS Command Line Interface 使用者指南》中的[使用現有組態與憑證檔案](https://docs.aws.amazon.com//cli/latest/userguide/getting-started-quickstart.html#getting-started-quickstart-existing)。**

1. 執行命令來存取目的地帳戶中的資源。在這個範例中，David 只需要使用下列命令列出他們的 S3 儲存貯體的內容。

   ```
   aws s3 ls s3://shared-container
   ```

   由於 Amazon S3 儲存貯體名稱是全域唯一，所以不需要指定擁有該儲存貯體的帳戶 ID。若要存取其他 AWS 服務的資源，請參閱該服務 AWS CLI 的文件，以取得參考其資源所需的命令和語法。

### 使用 AssumeRole (AWS API)
<a name="api-tutorial_cross-account-with-roles"></a>

當 David 需要從程式碼進行**目的地**帳戶的更新時，他可進行 `AssumeRole` 呼叫以擔任 `UpdateData` 角色。此呼叫會傳回他可用來存取**目的地**帳戶中 `amzn-s3-demo-bucket-shared-container` 儲存貯體的臨時憑證。David 可以使用這些憑證，來進行 API 呼叫以更新 `amzn-s3-demo-bucket-shared-container` 儲存貯體。不過，他無法進行 API 呼叫以存取**目的地**帳戶中任何其他資源，即使他在**來源**帳戶中具有進階使用者許可。

**擔任角色**

1. David 呼叫 `AssumeRole` 作為應用程式的一部分。他們必須指定 `UpdateData` ARN：`arn:aws:iam::999999999999:role/UpdateData`。

   來自 `AssumeRole` 呼叫的回應包含具有 `AccessKeyId` 和 `SecretAccessKey` 的暫時性憑證。也包含 `Expiration` 時間，指出憑證何時過期以及必須請求新憑證的時間。當您使用 AWS SDK 設定角色鏈結時，許多登入資料提供者會在登入資料過期之前自動重新整理登入資料。

1. David 使用暫時性憑證，進行 `s3:PutObject` 呼叫以更新 `amzn-s3-demo-bucket-shared-container` 儲存貯體。他們會將憑證作為 `AuthParams` 參數傳遞到 API 呼叫。由於臨時角色憑證只有 `amzn-s3-demo-bucket-shared-container` 儲存貯體的讀取和寫入存取權，因此目的地帳戶中的任何其他動作會被拒絕。

如需程式碼範例 (使用 Python)，請參閱 [切換到 IAM 角色 (AWS API)](id_roles_use_switch-role-api.md)。

## 其他資源
<a name="tutorial_cross-account-with-roles-related"></a>

下列資源可協助您進一步了解本教學課程中的主題：
+ 如需有關 IAM 使用者的詳細資訊，請參閱 [IAM 身分](id.md)。
+ 如需使用 Amazon S3 儲存貯體的詳細資訊，請參閱 *Amazon Simple Storage Service 使用者指南*中的[建立儲存貯體](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html)。
+  若要了解在您信任區域 (受信任組織或帳戶) 外帳戶中的主體是否具有擔任您角色的許可，請參閱[什麼是 IAM Access Analyzer？](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html)。

## 摘要
<a name="tutorial_cross-account-with-roles-summary"></a>

您已完成跨帳戶 API 存取教學課程。您建立了一個角色，以建立與另一個帳戶的信任，並定義了受信任實體可採取的動作。然後，修改角色政策，以控制哪些 IAM 使用者可存取角色。因此，**來源**帳戶的開發人員可以透過使用臨時憑證，來更新**目的地**帳戶中的 `amzn-s3-demo-bucket-shared-container` 儲存貯體。