

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

# 在 中使用 IAM 角色 AWS CLI
<a name="cli-configure-role"></a>

[AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html)是一種授權工具，可讓使用者取得額外的 （或不同的） 許可，或取得在不同 AWS 帳戶中執行動作的許可。

**Topics**
+ [先決條件](#cli-role-prereqs)
+ [使用 IAM 角色概觀](#cli-role-overview)
+ [設定和使用角色](#cli-role-prepare)
+ [使用多重要素驗證](#cli-configure-role-mfa)
+ [跨帳戶角色和外部 ID](#cli-configure-role-xaccount)
+ [指定角色工作階段名稱以更輕鬆地稽核](#cli-configure-role-session-name)
+ [擔任具有 Web 身分的角色](#cli-configure-role-oidc)
+ [清除快取的憑證](#cli-configure-role-cache)

## 先決條件
<a name="cli-role-prereqs"></a>

若要執行 `iam` 命令，您需要安裝和設定 AWS CLI。這包括設定已設定的設定檔，因為假設角色與另一個憑證方法配對。如需詳細資訊，請參閱 [安裝或更新至最新版本的 AWS CLI](getting-started-install.md)。

## 使用 IAM 角色概觀
<a name="cli-role-overview"></a>

您可以透過在 `~/.aws/config` 檔案中定義角色的描述檔，將 AWS Command Line Interface (AWS CLI) 設定為使用 IAM 角色。

以下範例顯示名為 `marketingadmin` 的角色描述檔。如果您使用 `--profile marketingadmin`（或使用 [AWS\$1PROFILE 環境變數](cli-configure-envvars.md)指定） 執行命令， AWS CLI 會使用在個別設定檔中定義的登入資料`user1`來擔任具有 Amazon Resource Name (ARN) 的角色`arn:aws:iam::123456789012:role/marketingadminrole`。您可以執行指派給該角色的許可所允許的任何操作。

```
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
source_profile = user1
```

接著，您就可以指定 `source_profile` 來指向另一個具名描述檔，其中包含有許可使用此角色的使用者登入資料。在上述範例中，`marketingadmin` 描述檔使用 `user1` 描述檔中的憑證。當您指定 AWS CLI 命令要使用設定檔 時`marketingadmin`， AWS CLI 會自動查詢連結`user1`設定檔的登入資料，並使用它們來請求指定 IAM 角色的臨時登入資料。CLI 在背景中使用 [sts:AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 操作實現這一點。然後，這些臨時憑證就會用來執行所要求的 AWS CLI 命令。指定的角色必須已連接允許請求的 AWS CLI 命令執行的 IAM 許可政策。

若要從 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或 Amazon Elastic Container Service (Amazon ECS) 容器內執行 AWS CLI 命令，您可以使用連接至執行個體設定檔或容器的 IAM 角色。如果您未指定描述檔或未設定環境變數，則會直接使用該角色。這可讓您避免將長時間存留的存取金鑰存放在您的執行個體。您也可以使用這些執行個體或容器角色來僅取得另一個角色的憑證。若要這樣做，請使用 `credential_source` (而不是 `source_profile`) 以指定如何尋找憑證。`credential_source` 屬性支援下列數值：
+ `Environment` – 從環境變數擷取來源憑證。
+ `Ec2InstanceMetadata` – 使用連接到 Amazon EC2 執行個體描述檔的 IAM 角色。
+ `EcsContainer` – 使用連接到 Amazon ECS 容器的 IAM 角色。

以下範例顯示經由參考 Amazon EC2 執行個體描述檔而使用的相同 `marketingadminrole` 角色。

```
[profile marketingadmin]
role_arn = arn:aws:iam::123456789012:role/marketingadminrole
credential_source = Ec2InstanceMetadata
```

當您叫用角色時，您會有其他選項可以取得，例如使用多重要素驗證、外部 ID (由第三方公司用來存取其用戶端資源)。您也可以指定可在 AWS CloudTrail 日誌中更輕鬆地稽核的唯一角色工作階段名稱。

## 設定和使用角色
<a name="cli-role-prepare"></a>

當您使用指定 IAM 角色的設定檔執行命令時， AWS CLI 會使用來源設定檔的登入資料來呼叫 AWS Security Token Service (AWS STS) 並請求指定角色的臨時登入資料。來源描述檔中的使用者必須有許可針對指定的描述檔中的角色呼叫 `sts:assume-role`。此角色必須有信任關係而允許來源描述檔中的使用者使用該角色。針對角色來擷取並使用臨時憑證的過程就稱為*擔任角色*。

在 IAM 中建立一個角色，並使用您希望使用者按照《AWS Identity and Access Management 使用者指南》**中的[建立角色以將許可委派給 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)下的過程來承擔的許可。如果角色和來源描述檔的 使用者在同一帳戶中，則您可以在設定角色的信任關係時輸入自己的帳戶 ID。

建立角色後，修改信任關係以允許 使用者承擔此角色。

以下範例顯示可連接到角色的信任政策。此政策允許帳戶 (123456789012) 中的任何使用者擔任角色，但***前提是***該帳戶的管理員明確將 `sts:AssumeRole` 許可授予使用者。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

信任政策不會實際授予許可。帳戶的管理員必須連結含有適當許可的政策，才能將擔任角色的許可委派給個別使用者。以下範例顯示可連接到使用者的政策，該政策只允許使用者擔任 `marketingadminrole` 角色。如需有關授予使用者擔任角色之權限的詳細資訊，請參閱《IAM 使用者指南》**中的[授予使用者許可以切換角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_permissions-to-switch.html)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/marketingadminrole"
    }
  ]
}
```

------

使用者不需要額外的許可，即可使用角色描述檔執行 AWS CLI 命令。反之，執行命令所需的許可來自於連接到*角色*的許可。您可以將許可政策連接到角色，以指定可以對哪些 AWS 資源執行哪些動作。如需有關將許可附加至角色 (運作方式與使用者相同) 的詳細資訊，請參閱《IAM 使用者指南》**中的[變更 IAM 使用者的許可](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_change-permissions.html)。

既然您已正確設定角色描述檔、角色許可、角色信任關係和使用者許可，您可以在命令列叫用 `--profile` 選項來使用該角色。例如，以下使用本主題開頭範例所定義的 `marketingadmin` 角色所連接的許可，呼叫 Amazon S3 `ls` 命令。

```
$ aws s3 ls --profile marketingadmin
```

若要使用多個呼叫的角色，可以從命令列為目前工作階段設定 `AWS_PROFILE` 環境變數。因為已定義環境變數，您不需要在每個命令中指定 `--profile` 選項。

**Linux 或 macOS**

```
$ export AWS_PROFILE=marketingadmin
```

**Windows**

```
C:\> setx AWS_PROFILE marketingadmin
```

如需設定使用者與角色的詳細資訊，請參閱《IAM 使用者指南》**中的 [IAM 身分 (使用者、使用者群組和角色)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id.html) 和 [IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id-roles.html)。

## 使用多重要素驗證
<a name="cli-configure-role-mfa"></a>

為了提高安全性，當使用者嘗試使用角色設定檔進行呼叫時，您可以要求使用者提供由多重要素驗證 (MFA) 裝置、U2F 裝置或行動應用程式產生的一次性金鑰。

首先，您可以選擇修改 IAM 角色的信任關係來要求 MFA。這可防止任何人在使用該角色之前未先使用 MFA 進行驗證。相關範例請參閱下列範例中的 `Condition` 行。此政策可讓名為 `anika` 的使用者擔任政策連接的角色，前提是使用者已使用 MFA 進行驗證。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::123456789012:user/anika" },
      "Action": "sts:AssumeRole",
      "Condition": { "Bool": { "aws:multifactorAuthPresent": true } }
    }
  ]
}
```

------

接著，在角色設定檔中新增一行，指定使用者的 MFA 裝置的 ARN。以下範例 `config` 檔案項目顯示兩個角色設定檔，都使用使用者 `anika` 的存取金鑰來請求角色 `cli-role` 的臨時登入資料。使用者 `anika` 具有擔任角色的許可，由角色的信任政策所授予。

```
[profile role-without-mfa]
region = us-west-2
role_arn= arn:aws:iam::128716708097:role/cli-role
source_profile=cli-user

[profile role-with-mfa]
region = us-west-2
role_arn= arn:aws:iam::128716708097:role/cli-role
source_profile = cli-user
mfa_serial = arn:aws:iam::128716708097:mfa/cli-user

[profile cli-user]
region = us-west-2
output = json
```

`mfa_serial` 設定可以採取 ARN，如圖所示，或硬體 MFA 字符的序號。

第一個設定檔 `role-without-mfa` 不需要 MFA。不過，由於連接到該角色的上述範例信任政策要求 MFA，因此使用此設定檔來執行命令的任何嘗試都會失敗。

```
$ aws iam list-users --profile role-without-mfa

An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied
```

第二個設定檔項目 `role-with-mfa` 識別要使用的 MFA 裝置。當使用者嘗試使用此設定檔執行 AWS CLI 命令時， 會 AWS CLI 提示使用者輸入 MFA 裝置提供的一次性密碼 (OTP)。如果 MFA 驗證成功，命令會執行請求操作。OTP 不會顯示在螢幕上。

```
$ aws iam list-users --profile role-with-mfa
Enter MFA code for arn:aws:iam::123456789012:mfa/cli-user:
{
    "Users": [
        {
            ...
```

## 跨帳戶角色和外部 ID
<a name="cli-configure-role-xaccount"></a>

您可以藉由將角色設定為跨帳戶角色，使 使用者能夠使用屬於不同帳戶的角色。在角色建立期間，將角色類型設定為 **Another AWS account** (其他 AWS 帳戶)，如[建立角色以將許可委派給 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html)所述。或者，您可以選取 **Require MFA (需要 MFA)**。如 [使用多重要素驗證](#cli-configure-role-mfa) 中所描述的，**Require MFA** (需要 MFA) 選項在信任關係中設定適當的條件。

如果您使用[外部 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html) 以進一步控制誰可使用跨帳戶的角色，則您還必須將 `external_id` 參數新增至角色描述檔。這通常是在另一個帳戶由公司或組織外的某人控制時才使用。

```
[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/saanvi
external_id = 123456
```

## 指定角色工作階段名稱以更輕鬆地稽核
<a name="cli-configure-role-session-name"></a>

當多人共用一個角色時，稽核就更具挑戰。您想要將呼叫的每個操作與呼叫該動作的個人建立關聯。不過，當該個人使用某個角色時，個人擔任的角色會是與呼叫操作不同的動作，因此您必須手動將兩者建立關聯。

您可以在使用者擔任角色時指定唯一的角色工作階段名稱，藉此簡化此操作。您可以將 `role_session_name` 參數新增至指定角色的 `config` 檔案中的每個具名描述檔。`role_session_name` 值會傳遞到 `AssumeRole` 操作，並成為角色工作階段的 ARN 的一部分。它也包含在所有記錄操作的 AWS CloudTrail 日誌中。

例如，您可以建立以角色為基礎的設定檔，如下所示。

```
[profile namedsessionrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
role_session_name = Session_Maria_Garcia
```

這會導致角色工作階段中具有下列 ARN。

```
arn:aws:iam::234567890123:assumed-role/SomeRole/Session_Maria_Garcia
```

此外，所有 AWS CloudTrail 日誌都會在每個操作擷取的資訊中包含角色工作階段名稱。

## 擔任具有 Web 身分的角色
<a name="cli-configure-role-oidc"></a>

您可以設定設定檔，以指示 AWS CLI 應該使用 [Web 聯合身分和 Open ID Connect (OIDC)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html) 擔任角色。當您在設定檔中指定此項目時， AWS CLI 會自動為您進行對應的 AWS STS `AssumeRoleWithWebIdentity`呼叫。

**注意**  
當您指定使用 IAM 角色的設定檔時， AWS CLI 會進行適當的呼叫來擷取臨時登入資料。這些憑證會儲存在 `~/.aws/cli/cache` 中。指定相同設定檔的後續 AWS CLI 命令會使用快取的暫時登入資料，直到過期為止。此時， AWS CLI 會自動重新整理登入資料。

若要使用 Web 聯合身分擷取並使用臨時憑證，您可以在共用描述檔中指定以下組態值。

[role\$1arn](#cli-configure-role)  
指定要擔任的角色 ARN。

web\$1identity\$1token\$1file  
指定檔案的路徑，該檔案包含由身分提供者提供的 OAuth 2.0 存取字符或 OpenID Connect ID 字符。 AWS CLI 會載入此檔案，並傳遞其內容作為 `WebIdentityToken` 操作的 `AssumeRoleWithWebIdentity` 引數。

[role\$1session\$1name](#cli-configure-role-session-name)  
指定套用到此擔任角色工作階段的選用名稱。

下列是擔任具有 Web 身分角色描述檔所需的最少量組態的組態範例。

```
# In ~/.aws/config

[profile web-identity]
role_arn=arn:aws:iam:123456789012:role/RoleNameToAssume
web_identity_token_file=/path/to/a/token
```

您也可以使用 [環境變數](cli-configure-envvars.md) 提供此組態。

AWS\$1ROLE\$1ARN  
要擔任的角色 ARN。

AWS\$1WEB\$1IDENTITY\$1TOKEN\$1FILE  
Web 身分字符檔案的路徑。

AWS\$1ROLE\$1SESSION\$1NAME  
套用到此擔任角色工作階段的名稱。

**注意**  
這些環境變數目前只適用於擔任具有 Web 身分提供者的角色。它們不適用於一般擔任角色供應商組態。

## 清除快取的憑證
<a name="cli-configure-role-cache"></a>

當您使用角色時， 會在本機 AWS CLI 快取臨時登入資料，直到過期為止。下次您嘗試使用它們時， AWS CLI 會嘗試代表您續約它們。

如果角色的臨時憑證被[撤銷](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_revoke-sessions.html)，則不會自動續約，而嘗試使用它們會失敗。不過，您可以刪除快取，強制 AWS CLI 擷取新的登入資料。

**Linux 或 macOS**

```
$ rm -r ~/.aws/cli/cache
```

**Windows**

```
C:\> del /s /q %UserProfile%\.aws\cli\cache
```