

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

# IAM 政策元素：變數與標籤
<a name="reference_policies_variables"></a>

當您在撰寫政策時不知道資源或條件索引鍵的確切值時，請使用 AWS Identity and Access Management (IAM) 政策變數做為預留位置。

**注意**  
如果 AWS 無法解析變數，這可能會導致整個陳述式無效。例如，如果您使用 `aws:TokenIssueTime` 變數，此變數只會在請求者使用臨時憑證驗證時解析值 (IAM 角色)。為避免變數造成陳述式無效，請使用 [... IfExists 條件運算子。](reference_policies_elements_condition_operators.md#Conditions_IfExists)

**Topics**
+ [簡介](#policy-vars-intro)
+ [在政策中使用變數](#policy-vars-using-variables)
+ [做為政策變數的標籤](#policy-vars-tags)
+ [在此您可以使用政策變數](#policy-vars-wheretouse)
+ [沒有值的政策變數](#policy-vars-no-value)
+ [您可以使用適用於政策變數的請求資訊](#policy-vars-infotouse)
+ [指定預設值](#policy-vars-default-values)
+ [如需詳細資訊](#policy-vars-formoreinfo)

## 簡介
<a name="policy-vars-intro"></a>

在 IAM 政策中，許多動作允許您為要控制存取的特定資源提供名稱。例如，下列政策可讓使用者為 `marketing` 專案列出、讀取和寫入 S3 儲存貯體 `amzn-s3-demo-bucket` 中的物件。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"],
      "Condition": {"StringLike": {"s3:prefix": ["marketing/*"]}}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/marketing/*"]
    }
  ]
}
```

------

在某些情況下，您在編寫政策時可能不知道資源的確切名稱。您可能想要一般化政策，以使其適用於許多使用者，而不必為每個使用者製作政策的唯一副本。建議您建立適用於該群組中任何使用者的單一群組政策，而不是為每個使用者建立單獨政策。

## 在政策中使用變數
<a name="policy-vars-using-variables"></a>

您可以使用在政策中設定預留位置的*政策變數*來定義政策內的動態值。

變數使用 **`$`** 字首後接一對大括號 (**`{ }`**) 進行標記，其中包含請求中的值的變數名稱。

評估政策時，政策變數將取代為來自請求中傳遞的條件式內容金鑰的值。變數可用於以[身分為基礎的政策、資源政策、服務控制政策、工作階段政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)以及 [VPC 端點政策](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints-access.html)。用作許可界限的以身分為基礎的政策也支援政策變數。

全域條件內容索引鍵可以用作跨 AWS 服務請求中的變數。與 AWS 資源互動時，服務特定條件索引鍵也可以用作變數，但只有在針對支援其資源提出請求時才可用。如需每個 AWS 服務和資源可用的內容金鑰清單，請參閱[https://docs.aws.amazon.com/service-authorization/latest/reference/reference.html](https://docs.aws.amazon.com/service-authorization/latest/reference/reference.html)。在某些情況下，您無法使用值填入全域條件內容索引鍵。若要進一步了解每個索引鍵，請參閱 [AWS 全域條件內容索引鍵](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

**重要**  
索引鍵名稱不區分大小寫。例如，`aws:CurrentTime` 等同於 `AWS:currenttime`。
您可以使用任何單一值條件鍵作為變數。您無法使用多重值條件鍵做為變數。

下面範例顯示了 IAM 角色或使用者的政策，它用政策變數替換特定資源名稱。您可以利用 `aws:PrincipalTag` 條件索引鍵來重複使用此政策。此政策被評估時，僅在儲存貯體名稱以 `team` 主體標籤中的團隊名稱作為結尾時，`${aws:PrincipalTag/team}` 才會允許該動作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket"],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket"],
      "Condition": {"StringLike": {"s3:prefix": ["${aws:PrincipalTag/team}/*"]}}
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],      
      "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/team}/*"]
    }
  ]
}
```

------

該變數使用 `$` 字首標記，後跟一對大括號 (`{ }`)。在 `${ }` 字元內，您可以包含要在政策中想要使用的請求中的值的名稱。您可以使用的值將在本頁稍後討論。

如需有關此全域條件索引鍵的詳細資訊，請參閱全域條件金鑰清單中的 [aws:PrincipalTag/*tag-key*](reference_policies_condition-keys.md#condition-keys-principaltag)。

**注意**  
若要使用政策變數，必須在陳述式中包含 `Version` 元素，並且必須將版本設定為支援政策變數的版本。變數已導入版本 `2012-10-17`。舊版的政策語言不支援政策變數。如果不包含 `Version` 元素，並將其設定為適當的版本，則 `${aws:username}` 等變數將被視為政策中的常值字串。  
`Version` 政策元素與政策版本不同。`Version` 政策元素是在政策內使用，並定義政策語言的版本。另一方面，政策版本會在您在 IAM 中變更客戶受管政策時建立。變更的政策不會覆寫現有的政策。IAM 反而會建立新版本的受管政策。若要進一步了解 `Version` 政策元素，請參閱 [IAM JSON 政策元素：Version](reference_policies_elements_version.md)。若要進一步了解政策版本，請參閱 [版本控制 IAM 政策](access_policies_managed-versioning.md)。

允許主體從 S3 儲存貯體的 /David 路徑取得物件之政策如下所示：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/David/*"
      ]
    }
  ]
}
```

------

如果此政策附加至使用者 `David`，該使用者會從其自己的 S3 儲存貯體取得物件，但您必須為包含使用者名稱的每個使用者建立獨立政策。您接著會將每個政策連接到個別使用者。

透過使用政策變數，您可以建立可重複使用的政策。如果 `aws:PrincipalTag` 的標籤鍵值與請求中傳遞的標籤鍵 `owner` 值相符，下列政策將允許使用者從 Amazon S3 儲存貯體取得物件。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [{
    "Sid": "AllowUnlessOwnedBySomeoneElse",
    "Effect": "Allow",
    "Action": ["s3:GetObject"],    
    "Resource": ["*"],
    "Condition": {
        "StringEquals": {
          "s3:ExistingObjectTag/owner": "${aws:PrincipalTag/owner}"
        }
      }
    }
  ]
}
```

------

像這樣使用政策變數來替代使用者時，您不必為每個單獨使用者設定獨立的政策。在下列範例中，政策會附加至由產品經理使用臨時安全憑證擔任的 IAM 角色。使用者提出新增 Amazon S3 物件的請求時，IAM 會將目前請求中的 `dept` 標籤值替換為 `${aws:PrincipalTag}` 變數，並評估該政策。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowOnlyDeptS3Prefix",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/dept}/*"
            ]
        }
    ]
}
```

------

## 做為政策變數的標籤
<a name="policy-vars-tags"></a>

在某些 AWS 服務中，您可以將自己的自訂屬性連接到這些服務建立的資源。例如，您可以將標籤套用至 Amazon S3 儲存貯體或 IAM 使用者。這些標籤均為鍵值組。您定義標籤鍵名稱以及與該鍵名稱關聯的值。例如，您可以建立一個具有 **department** 索引鍵和 **Human Resources** 值的標籤。如需有關標記 IAM 實體的詳細資訊，請參閱 [AWS Identity and Access Management 資源的標籤](id_tags.md)。有關標記其他 AWS 服務建立之資源的資訊，請參閱該服務的文件。如需有關使用標籤編輯器的詳細資訊，請參閱 *AWS 管理主控台 使用者指南中的*[使用標籤編輯器](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/tag-editor.html)。

您可以標記 IAM 資源以簡化探索、整理和追蹤您的 IAM 資源。您也可以標記 IAM 身分來控制存取資源或標記本身。若要進一步了解有關使用標籤以控制存取的詳細資訊，請參閱[使用標籤控制對 IAM 使用者和角色的存取](access_iam-tags.md)。

## 在此您可以使用政策變數
<a name="policy-vars-wheretouse"></a>

 您可以在 `Resource` 元素中使用政策變數，也可以在 `Condition` 元素中使用字串比較。

### 資源元素
<a name="policy-vars-resourceelement"></a>

您可以在 `Resource` 元素中使用政策變數，但只能在 ARN 的資源部分中使用政策變數。ARN 的這個部分會出現在第 5 個冒號 (:) 之後。您無法使用變數來取代第 5 個冒號之前的 ARN 部分，例如服務或帳戶。如需有關 ARN 格式的詳細資訊，請參閱 [IAM ARN](reference_identifiers.md#identifiers-arns)。

若要以標籤值取代 ARN 的一部分，請以 `${ }` 包住字首與索引鍵名稱。例如，以下資源元素僅指其名稱與請求之使用者的部門標籤值相同的儲存貯體。

`"Resource": ["arn:aws::s3:::amzn-s3-demo-bucket/${aws:PrincipalTag/department}"]`

許多 AWS 資源使用包含使用者建立名稱的 ARNs。下列 IAM 政策可確保只有具有相符 access-project、access-application 和 access-environment 標籤值的特定使用者才能修改其資源。此外，使用 [\$1 萬用字元比對](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_resource.html)時，它們能允許自訂資源名稱尾碼。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AllowAccessBasedOnArnMatching",
      "Effect": "Allow",
      "Action": [
        "sns:CreateTopic",
        "sns:DeleteTopic"],      
      "Resource": ["arn:aws:sns:*:*:${aws:PrincipalTag/access-project}-${aws:PrincipalTag/access-application}-${aws:PrincipalTag/access-environment}-*"
      ]
    }
  ]
}
```

------

### 條件元素
<a name="policy-vars-conditionelement"></a>

在涉及字串運算子或 ARN 運算子的任何條件下，您都可以將政策變數用於 `Condition` 值。字串運算子包括 `StringEquals`、`StringLike` 和 `StringNotLike`。ARN 運算子包括 `ArnEquals` 和 `ArnLike`。您無法使用政策變數搭配其他運算子，例如 `Numeric`、`Date`、`Boolean`、`Binary`、`IP Address` 或 `Null` 運算子。如需有關條件運算子的詳細資訊，請參閱 [IAM JSON 政策元素：條件運算子](reference_policies_elements_condition_operators.md)。

在 `Condition` 元素表達式中參照標籤時，請使用相關的字首和索引鍵名稱做為條件金鑰。然後，使用您想在條件值中測試的值。

例如，下列政策範例允許完整存取使用者，但僅限在標籤 `costCenter` 連接至使用者時。此標籤也必須有一個 `12345` 或 `67890` 的值。如果此標籤沒有值，或有任何其他值，請求將會失敗。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
          "iam:*user*"
       ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "iam:ResourceTag/costCenter": [ "12345", "67890" ]
        }
      }
    }
  ]
}
```

------

## 沒有值的政策變數
<a name="policy-vars-no-value"></a>

當政策變數參考的條件內容索引鍵沒有值或不存在於請求授權內容中時，該值實際上是空值。沒有相等或類似的值。在以下情況下，授權內容中可能不存在條件內容索引鍵：
+ 您正在對不支援該條件索引鍵的資源請求中使用服務特定條件內容索引鍵。
+ IAM 主體、工作階段、資源或請求的標籤不存在。
+ 在 [AWS 全域條件內容索引鍵](reference_policies_condition-keys.md) 中列出了每個全域條件內容金鑰的其他情況。

當您在 IAM 政策的條件元素中使用沒有值的變數時 ([IAM JSON 政策元素：條件運算子](reference_policies_elements_condition_operators.md)，例如 `StringEquals` 或 `StringLike` 不匹配)，政策陳述式不會生效。

反向條件運算子 (例如 `StringNotEquals` 或 `StringNotLike`) 確實與空值匹配，因為其正在測試的條件索引鍵的值不等於或不類似於有效空值。

在下列範例中，`aws:principaltag/Team` 必須等於 `s3:ExistingObjectTag/Team` 才能允許存取。未設定 `aws:principaltag/Team` 時，系統會明確拒絕存取。如果在授權內容中沒有值的變數用作政策的 `Resource` 或 `NotResource` 元素的一部分，則包含沒有值之政策變數的資源將不會與任何資源相匹配。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
   {
    "Effect": "Deny", 
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
    "Condition": {
      "StringNotEquals": {
        "s3:ExistingObjectTag/Team": "${aws:PrincipalTag/Team}"
       }
      }
    }
  ]
}
```

------

## 您可以使用適用於政策變數的請求資訊
<a name="policy-vars-infotouse"></a>

 您可以使用 JSON 政策的 `Condition` 元素，來比較[請求內容](reference_policies_evaluation-logic_policy-eval-reqcontext.md)中的金鑰和您在政策中指定的鍵值。當您使用政策變數時， 會從請求內容索引鍵 AWS 取代 值，以取代政策中的 變數。

### 主體索引鍵值
<a name="principaltable"></a>

`aws:username`、`aws:userid` 及 `aws:PrincipalType` 的值取決於啟動請求之主體的類型。例如，請求可能是使用 IAM 使用者、IAM 角色或 AWS 帳戶根使用者的憑證提出。下列資料表顯示不同類型之主體的鍵值。


****  

| Principal | `aws:username` | `aws:userid` | `aws:PrincipalType` | 
| --- | --- | --- | --- | 
| AWS 帳戶根使用者 | (不存在) | AWS 帳戶 ID | Account | 
| IAM 使用者 | ：IAM-user-name | [：唯一 ID](reference_identifiers.md#identifiers-unique-ids) | User | 
| AWS STS 聯合身分使用者主體 | (不存在) | account:caller-specified-name | FederatedUser | 
| OIDC 聯合身分主體 有關使用 Web 聯合身分時可用的政策索引鍵的詳細資訊，請參閱 [AWS OIDC 聯合的可用金鑰](reference_policies_iam-condition-keys.md#condition-keys-wif)。 | (不存在) |   *role-id*：*caller-specified-role-name*  其中 `role-id` 是[角色的唯一 ID](reference_identifiers.md#identifiers-unique-ids)，caller-specified-role-name 由傳遞給 AssumeRoleWithWebIdentity 請求的 [RoleSessionName](https://docs.aws.amazon.com/IAM/latest/APIReference/API_AssumeRole.html#API_AssumeRoleWithWebIdentity_RequestParameters) 參數指定。  | AssumedRole | 
| SAML 聯合身分主體 有關使用 SAML 聯合時可用的政策索引鍵的詳細資訊，請參閱 [單獨辨識以 SAML 為基礎的聯合身分中的使用者](id_roles_providers_saml.md#CreatingSAML-userid)。 | (不存在) |  *role-id*：*caller-specified-role-name* 其中 `role-id` 是[角色的唯一 ID](reference_identifiers.md#identifiers-unique-ids)，而 caller-specified-role-name 由 Attribute 元素指定，其 [Name 屬性](id_roles_providers_create_saml_assertions.md)設定為 https://aws.amazon.com/SAML/attributes/RoleSessionName。  | AssumedRole | 
| 擔任的角色 | (不存在) |  *role-id*：*caller-specified-role-name* 其中 `role-id` 是[角色的唯一 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)，caller-specified-role-name 由傳遞給 AssumeRole 請求的 [RoleSessionName](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html#API_AssumeRole_RequestParameters) 參數指定。  | AssumedRole | 
| 指派給 Amazon EC2 執行個體的角色 | (不存在) |  *role-id*:*ec2-instance-id* 其中 `role-id` 是[角色的唯一 ID](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)，而 ec2-instance-id 是 [EC2 執行個體的唯一識別符](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html)。  | AssumedRole | 
| 匿名呼叫者 (僅限 Amazon SQS、Amazon SNS 和 Amazon S3) | (不存在) | anonymous | Anonymous | 

對於此表格、中的項目，請注意下列事項：
+ 「不存在」**表示該值不在目前請求資訊中，並且任何符合它的嘗試都會失敗並導致陳述式無效。
+ *role-id* 是在建立時指派給每個角色的唯一識別符。您可以使用 AWS CLI 命令顯示角色 ID： `aws iam get-role --role-name rolename`
+ *caller-specified-name* 和 *caller-specified-role-name* 是呼叫程序 (例如，應用程式或服務) 在呼叫取得暫時憑證時所傳遞的名稱。
+ *ec2-instance-id* 是在啟動時指派給執行個體的值，並顯示在 Amazon EC2 主控台的 **Instances** (執行個體) 頁面上。您也可以執行 AWS CLI 命令來顯示執行個體 ID： `aws ec2 describe-instances`

### 聯合身分主體在請求中可用的資訊
<a name="policy-vars-infoWIF"></a>

聯合身分主體是使用 IAM 以外的系統進行身分驗證的使用者。例如，公司可能有內部呼叫 的應用程式以供內部使用 AWS。向使用該應用程式的每個公司使用者提供 IAM 身分可能是不切實際的。相反地，公司可能會使用具有單一 IAM 身分的代理 (中間層) 應用程式，或者公司可能使用 SAML 身分提供者 (IdP)。代理應用程式或 SAML IdP 使用公司網路對個別使用者進行身分驗證。然後，代理應用程式可以使用其 IAM 身分來取得個別使用者的臨時安全憑證。SAML IdP 可以有效地交換 AWS 臨時安全登入資料的身分資訊。然後，臨時登入資料可用於存取 AWS 資源。

同樣，您可以為應用程式需要存取 AWS 資源的行動裝置建立應用程式。在這種情況下，您可以使用 *OIDC 聯合*，其中應用程式使用 Login with Amazon、Amazon Cognito、Facebook 或 Google 等知名身分提供者對使用者進行身分驗證。然後，應用程式可以使用來自這些提供者的使用者身分驗證資訊來取得用來存取 AWS 資源的臨時安全憑證。

使用 OIDC 聯合的建議方法是利用 Amazon Cognito 和 AWS 行動 SDKs。如需詳細資訊，請參閱下列內容：
+ [Amazon Cognito 使用者指南](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html) 
+ [暫時性憑證的常見案例](id_credentials_temp.md#sts-introduction)

### 特殊字元
<a name="policy-vars-specialchars"></a>

有幾個特殊的預先定義的政策變數具有固定值，使您能夠表示具有特殊含意的字元。如果這些特殊字元是字串的一部分，那麼您正在嘗試比對，並且從字面上插入它們會被轉譯。例如，在字串中插入 \$1 星號將被轉譯為萬用字元，比對任何字元，而不是做為文字 \$1。在這些情況下，您可以使用以下預定義的政策變數：
+ **\$1\$1\$1\$1** - 在需要 \$1 星號字元的地方使用。
+ **\$1\$1?\$1** - 在需要 ? 問號字元的地方使用。
+ **\$1\$1\$1\$1** - 在需要 \$1 貨幣符號字元的地方使用。

這些預先定義的政策變數可以在可以使用一般政策變數的任何字串中使用。

## 指定預設值
<a name="policy-vars-default-values"></a>

若要將預設值新增到一個變數，請以單引號 (`' '`) 括住預設值，並使用逗號和空格 (`, `) 分隔變數文字和預設值。

例如，如果主體標記為 `team=yellow`，他們可以存取名為 `amzn-s3-demo-bucket-yellow` 的 `ExampleCorp's` Amazon S3 儲存貯體。具有此資源的政策可讓團隊成員存取其團隊儲存貯體，但不能存取其他團隊的儲存貯體。對於沒有團隊標籤的使用者，它會將 `company-wide` 的預設值設定為儲存貯體名稱。這些使用者只能存取 `amzn-s3-demo-bucket-company-wide` 儲存貯體，其中他們可以檢視廣泛的資訊，例如加入團隊的指示。

```
"Resource":"arn:aws:s3:::amzn-s3-demo-bucket-${aws:PrincipalTag/team, 'company-wide'}"
```

## 如需詳細資訊
<a name="policy-vars-formoreinfo"></a>

如需有關政策的詳細資訊，請參閱以下項目：
+  [中的政策和許可 AWS Identity and Access Management](access_policies.md) 
+  [以身分為基礎的 IAM 政策範例](access_policies_examples.md) 
+  [IAM JSON 政策元素參考](reference_policies_elements.md) 
+  [政策評估邏輯](reference_policies_evaluation-logic.md) 
+  [OIDC 聯合身分](id_roles_providers_oidc.md)