

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

# 中的别名 AWS KMS
<a name="kms-alias"></a>

*别名*是 AWS KMS key的友好名称。例如，别名允许您将 KMS 密钥引用为 `test-key`，而不是 `1234abcd-12ab-34cd-56ef-1234567890ab`。

您可以使用别名在 AWS KMS 控制台、操作和[加密[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)操作](kms-cryptography.md#cryptographic-operations)（例如 E [n](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) crypt 和）中标识 KMS 密钥。[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)别名还使您能够轻松识别 [AWS 托管式密钥](concepts.md#aws-managed-key)。这些 KMS 密钥的别名始终具有 `aws/<service-name>` 形式。例如，亚马逊 DynamoD AWS 托管式密钥 B 的别名是。`aws/dynamodb`您可以为项目建立类似的别名标准，例如在别名前加上项目或类别的名称。

您还可以根据 KMS 密钥的别名允许和拒绝访问 KMS 密钥，而无需编辑策略或管理授权。此功能是[基于属性的访问控制](abac.md) (ABAC) AWS KMS 支持的一部分。有关更多信息，请参阅 [使用别名控制对 KMS 密钥的访问](alias-authorization.md)。

别名的大部分功能来自于您随时更改与别名关联的 KMS 密钥的能力。别名可以使您的代码更易于编写和维护。例如，假设您使用别名来引用特定 KMS 密钥，并且您想要更改 KMS 密钥。在这种情况下，只需将别名与其他 KMS 密钥关联即可。您不需要更改您的代码。

别名还您更容易在不同 AWS 区域中重用相同代码。在多个区域中创建具有相同名称的别名，并将每个别名与其区域中的 KMS 密钥关联。当代码在每个区域中运行时，别名将引用该区域中关联的 KMS 密钥。有关示例，请参阅[了解如何在您的应用程序中使用别名](alias-using.md)。

您可以使用 [CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)API 或使用[AWS::KMS::Alias CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html)在 AWS KMS 控制台中为 KMS 密钥创建别名。

该 AWS KMS API 提供对每个账户和区域中的别名的完全控制。API 包括创建别名 ([CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html))、查看别名和别名 ARNs ([ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html))、更改与别名关联的 KMS 密钥 ([UpdateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateAlias.html)) 以及删除别名 ([DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)) 的操作。

## 别名的作用方式
<a name="alias-about"></a>

了解别名在 AWS KMS中的作用方式。

**别名是一种独立的 AWS 资源**  
别名不是 KMS 密钥的属性。您对别名执行的操作不会影响其关联的 KMS 密钥。您可以为 KMS 密钥创建别名，然后更新别名，使其与其他 KMS 密钥相关联。您甚至可以删除别名，而不会对关联的 KMS 密钥产生任何影响。但是，如果您删除 KMS 密钥，则会删除与该 KMS 密钥关联的所有别名。  
如果您在 IAM policy 中指定别名作为资源，则该策略将引用别名，而不是关联的 KMS 密钥。

**每个别名都有两种格式**  
创建别名时，需要指定别名。 AWS KMS 为您创建别名 ARN。  
+ [别名 ARN](concepts.md#key-id-alias-ARN) 是唯一标识别名的 Amazon Resource Name (ARN)。

  ```
  # Alias ARN
  arn:aws:kms:us-west-2:111122223333:alias/<alias-name>
  ```
+ [别名名称](concepts.md#key-id-alias-name)在账户和所在区域中是唯一的。在 AWS KMS API 中，别名总是以前缀为。`alias/` AWS KMS 控制台中省略了该前缀。

  ```
  # Alias name
  alias/<alias-name>
  ```

**别名不是密钥**  
别名可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。不要在别名名称中包含机密或敏感信息。

**每个别名一次与一个 KMS 密钥关联**  
别名及其 KMS 密钥必须位于同一账户和区域中。  
您可以将别名与同一 AWS 账户 区域中的任何[客户托管密钥](concepts.md#customer-mgn-key)相关联。但是，您无权将别名与 [AWS 托管式密钥](concepts.md#aws-managed-key) 关联。  
例如，此[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)输出显示`test-key`别名恰好与一个目标 KMS 密钥相关联，该密钥由`TargetKeyId`属性表示。  

```
{
     "AliasName": "alias/test-key",
     "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/test-key",
     "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
     "CreationDate": 1593622000.191,
     "LastUpdatedDate": 1593622000.191
}
```

**多个别名可以与同一 KMS 密钥关联**  
例如，您可以将 `test-key` 和 `project-key` 别名与同一个 KMS 密钥关联。  

```
{
     "AliasName": "alias/test-key",
     "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/test-key",
     "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
     "CreationDate": 1593622000.191,
     "LastUpdatedDate": 1593622000.191
},
{
     "AliasName": "alias/project-key",
     "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/project-key",
     "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
     "CreationDate": 1516435200.399,
     "LastUpdatedDate": 1516435200.399
}
```

**别名在账户和区域中必须是唯一的**  
例如，您在每个账户和区域中只能有一个 `test-key` 别名。别名区分大小写，但仅在大小写上不同的别名很容易出错。您不能更改别名名称。但是，您可以删除别名并使用所需名称创建新别名。

**您可以在不同的区域中创建具有相同名称的别名。**  
例如，您可以在美国东部（弗吉尼亚北部）拥有 `finance-key` 别名，在欧洲（法兰克福）拥有 `finance-key` 别名。每个别名都将与其区域中的 KMS 密钥相关联。如果您的代码引用 `alias/finance-key` 之类的别名名称，您可以在多个区域中运行它。在每个区域中，它使用不同的 KMS 密钥。有关更多信息，请参阅 [了解如何在您的应用程序中使用别名](alias-using.md)。

**您可以更改与别名关联的 KMS 密钥**  
您可以使用该[UpdateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateAlias.html)操作将别名与其他 KMS 密钥相关联。例如，如果 `finance-key` 别名与 `1234abcd-12ab-34cd-56ef-1234567890ab` KMS 密钥关联，您可以对其进行更新，使其与 `0987dcba-09fe-87dc-65ba-ab0987654321` KMS 密钥关联。  
但是，当前 KMS 密钥和新的 KMS 密钥必须是相同的类型（要么都是对称的，要么都是非对称的，要么都是 HMAC），并且它们必须具有相同的[密钥用途](create-keys.md#key-usage)（ENCRYPT\$1DECRYPT、SIGN\$1VERIFY 或 GENERATE\$1VERIFY\$1MAC）。此限制可防止使用别名的代码中出现错误。如果您必须将别名与其他类型的密钥关联，并且您已降低风险，则可以删除并重新创建别名。

**有些 KMS 密钥没有别名**  
在 AWS KMS 控制台中创建 KMS 密钥时，必须为其指定一个新的别名。但是，使用该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作创建 KMS 密钥时，不需要别名。此外，您还可以使用[UpdateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateAlias.html)操作来更改与别名关联的 KMS 密钥，使用该[DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)操作来删除别名。因此，有些 KMS 密钥可能有多个别名，有些可能没有别名。

**AWS 在您的账户中创建别名**  
AWS 在您的账户中为[AWS 托管式密钥](concepts.md#aws-managed-key)创建别名。这些别名具有 `alias/aws/<service-name>` 形式的名称，例如 `alias/aws/s3`。  
有些 AWS 别名没有 KMS 密钥。这些预定义的别名通常与您开始使用服务 AWS 托管式密钥 时相关联。

**使用别名标识 KMS 密钥**  
在[加密操作中，您可以使用[别](concepts.md#key-id-alias-name)[名或别名 ARN](concepts.md#key-id-alias-ARN) 来标识 KMS 密钥、[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)和](kms-cryptography.md#cryptographic-operations)。[GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)（如果 [KMS 密钥位于不同的 AWS 账户中](key-policy-modifying-external-accounts.md)，您必须使用其[密钥 ARN](concepts.md#key-id-key-ARN) 或别名 ARN。） 别名不是 KMS 密钥在其他 AWS KMS 操作中的有效标识符。有关每个 AWS KMS API 操作的有效[密钥标识符](concepts.md#key-id)的信息，请参阅《AP *AWS Key Management Service I 参考*》中对`KeyId`参数的描述。  
您不能使用别名名称或别名 ARN 来[标识 IAM policy 中的 KMS 密钥](cmks-in-iam-policies.md)。要根据别名控制对 KMS 密钥的访问权限，请使用 k [ms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 或 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。有关更多信息，请参阅 [ABAC for AWS KMS](abac.md)。

# 控制对别名的访问
<a name="alias-access"></a>

创建或更改别名时，会影响别名及其关联的 KMS 密钥。因此，管理别名的委托人必须具有对别名和所有受影响的 KMS 密钥调用别名操作的权限。您可以通过使用[密钥策略](key-policies.md)、[IAM policy](iam-policies.md) 和[授权](grants.md)来提供这些权限。

**注意**  
请谨慎授予委托人管理标签和别名的权限。更改标签或别名可以允许或拒绝对客户托管密钥的权限。有关详细信息，请参阅 [ABAC for AWS KMS](abac.md) 和 [使用别名控制对 KMS 密钥的访问](alias-authorization.md)。

有关控制对所有 AWS KMS 操作的访问权限的信息，请参见[权限参考](kms-api-permissions-reference.md)。

创建和管理别名的权限如下所示。

## kms: CreateAlias
<a name="alias-access-create"></a>

要创建别名，委托人需要别名和相关 KMS 密钥的以下权限。
+ 别名的 `kms:CreateAlias`。在附加到允许创建别名的委托人的 IAM policy 中提供此权限。

  以下示例策略语句在 `Resource` 元素中指定特定别名。但是您可以列出多个别名 ARNs 或指定别名模式，例如 “test\$1”。您还可以指定 `"*"` 的 `Resource` 值以允许委托人在账户和区域中创建任何别名。创建别名的权限也可以包含在对账户和区域中的所有资源的 `kms:Create*` 权限中。

  ```
  {
    "Sid": "IAMPolicyForAnAlias",
    "Effect": "Allow",
    "Action": [
      "kms:CreateAlias",
      "kms:UpdateAlias",
      "kms:DeleteAlias"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:alias/test-key"
  }
  ```
+ KMS 密钥的 `kms:CreateAlias`。此权限必须在密钥策略或者从密钥策略委派的 IAM policy 中提供。

  ```
  {
    "Sid": "Key policy for 1234abcd-12ab-34cd-56ef-1234567890ab",
    "Effect": "Allow",
    "Principal": {"AWS": "arn:aws:iam::111122223333:user/KMSAdminUser"},
    "Action": [
      "kms:CreateAlias",
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
  ```

您可以使用条件键限制可以与别名关联的 KMS 密钥。例如，您可以使用 k [ms: KeySpec](conditions-kms.md#conditions-kms-key-spec) 条件密钥来允许委托人仅在非对称 KMS 密钥上创建别名。有关您可以用于限制对 KMS 密钥资源的 `kms:CreateAlias` 权限的条件键完整列表，请参阅 [AWS KMS 权限](kms-api-permissions-reference.md)。

## kms: ListAliases
<a name="alias-access-view"></a>

要列出账户和区域中的别名，委托人必须在 IAM policy 中具有 `kms:ListAliases` 权限。由于此策略与任何特定 KMS 密钥或别名资源无关，因此策略中资源元素的值[必须为 `"*"`](iam-policies-best-practices.md#require-resource-star)。

例如，以下 IAM policy 语句授予委托人列出账户和区域中所有 KMS 密钥和别名的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:ListKeys",
      "kms:ListAliases"
    ],
    "Resource": "*"
  }
}
```

------

## kms: UpdateAlias
<a name="alias-access-update"></a>

要更改与别名关联的 KMS 密钥，委托人需要三个权限元素：一个用于别名，一个用于当前 KMS 密钥，另一个用于新的 KMS 密钥。

例如，假设您想要将 `test-key` 别名从具有密钥 ID 1234abcd-12ab-34cd-56ef-1234567890ab 的 KMS 密钥更改为具有密钥 ID 0987dcba-09fe-87dc-65ba-ab0987654321 的 KMS 密钥。在这种情况下，请包括类似于本部分中的示例的策略语句。
+ 别名的 `kms:UpdateAlias`。您可以在附加到委托人的 IAM policy 中提供此权限。以下 IAM policy 指定了一个特定的别名。但是您可以列出多个别名 ARNs 或指定别名模式，例如`"test*"`。您还可以指定 `"*"` 的 `Resource` 值以允许委托人在账户和区域中更新任何别名。

  ```
  {
    "Sid": "IAMPolicyForAnAlias",
    "Effect": "Allow",
    "Action": [
      "kms:UpdateAlias",
      "kms:ListAliases",
      "kms:ListKeys"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:alias/test-key"
  }
  ```
+ 当前与别名关联的 KMS 密钥的 `kms:UpdateAlias`。此权限必须在密钥策略或者从密钥策略委派的 IAM policy 中提供。

  ```
  {
    "Sid": "Key policy for 1234abcd-12ab-34cd-56ef-1234567890ab",
    "Effect": "Allow",
    "Principal": {"AWS": "arn:aws:iam::111122223333:user/KMSAdminUser"},
    "Action": [
      "kms:UpdateAlias",
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
  ```
+ 操作将其与别名关联的 KMS 密钥的 `kms:UpdateAlias`。此权限必须在密钥策略或者从密钥策略委派的 IAM policy 中提供。

  ```
  {
    "Sid": "Key policy for 0987dcba-09fe-87dc-65ba-ab0987654321",
    "Effect": "Allow",
    "Principal": {"AWS": "arn:aws:iam::111122223333:user/KMSAdminUser"},
    "Action": [
      "kms:UpdateAlias", 
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
  ```

您可以使用条件键在 `UpdateAlias` 操作中限制其中一个或两个 KMS 密钥。例如，您可以使用 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥来允许委托人仅在目标 KMS 密钥已具有特定别名时才更新别名。有关您可以用于限制对 KMS 密钥资源的 `kms:UpdateAlias` 权限的条件键完整列表，请参阅 [AWS KMS 权限](kms-api-permissions-reference.md)。

## kms: DeleteAlias
<a name="alias-access-delete"></a>

要删除别名，委托人需要别名和相关 KMS 密钥的权限。

与往常一样，在授予委托人删除资源的权限时，您应该谨慎操作。但是，删除别名不会影响关联的 KMS 密钥。虽然这可能会导致依赖别名的应用程序出现故障，但如果错误地删除了别名，您可以重新创建别名。
+ 别名的 `kms:DeleteAlias`。在附加到允许删除别名的委托人的 IAM policy 中提供此权限。

  以下示例策略语句在 `Resource` 元素中指定别名。但是您可以列出多个别名 ARNs 或指定别名模式，例如`"test*"`，您也可以将`Resource`值指定为`"*"`以允许委托人删除账户和区域中的任何别名。

  ```
  {
    "Sid": "IAMPolicyForAnAlias",
    "Effect": "Allow",
    "Action": [
      "kms:CreateAlias",
      "kms:UpdateAlias",
      "kms:DeleteAlias"
    ],
    "Resource": "arn:aws:kms:us-west-2:111122223333:alias/test-key"
  }
  ```
+ 关联的 KMS 密钥的 `kms:DeleteAlias`。此权限必须在密钥策略或者从密钥策略委派的 IAM policy 中提供。

  ```
  {
    "Sid": "Key policy for 1234abcd-12ab-34cd-56ef-1234567890ab",
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::111122223333:user/KMSAdminUser"
    },
    "Action": [
      "kms:CreateAlias",
      "kms:UpdateAlias",
      "kms:DeleteAlias",
      "kms:DescribeKey"
    ],
    "Resource": "*"
  }
  ```

## 限制别名权限
<a name="alias-access-limiting"></a>

当资源为 KMS 密钥时，您可以使用条件键限制别名权限。例如，以下 IAM policy 允许对特定账户和区域中的 KMS 密钥执行别名操作。但是，它使用 k [ms: KeyOrigin](conditions-kms.md#conditions-kms-key-origin) 条件密钥进一步限制对密钥材料的 KMS 密钥的权限 AWS KMS。

有关您可以用于限制对 KMS 密钥资源的别名权限的条件键完整列表，请参阅 [AWS KMS 权限](kms-api-permissions-reference.md)。

```
{
  "Sid": "IAMPolicyKeyPermissions",
  "Effect": "Allow",
  "Resource": "arn:aws:kms:us-west-2:111122223333:key/*",
  "Action": [
    "kms:CreateAlias",
    "kms:UpdateAlias",
    "kms:DeleteAlias"
  ],
  "Condition": {
    "StringEquals": {
      "kms:KeyOrigin": "AWS_KMS"
    }
  }  
}
```

您不能在资源为别名的策略语句中使用条件键。若要限制委托人可以管理的别名，请使用控制对别名访问的 IAM policy 语句的 `Resource` 元素的值。例如，以下政策声明允许委托人创建、更新或删除 AWS 账户 和区域中的任何别名，除非别名以开头`Restricted`。

```
{
  "Sid": "IAMPolicyForAnAliasAllow",
  "Effect": "Allow",
  "Action": [
    "kms:CreateAlias",
    "kms:UpdateAlias",
    "kms:DeleteAlias"
  ],
  "Resource": "arn:aws:kms:us-west-2:111122223333:alias/*"
},
{
  "Sid": "IAMPolicyForAnAliasDeny",
  "Effect": "Deny",
  "Action": [
    "kms:CreateAlias",
    "kms:UpdateAlias",
    "kms:DeleteAlias"
  ],
  "Resource": "arn:aws:kms:us-west-2:111122223333:alias/Restricted*"
}
```

# 创建别名
<a name="alias-create"></a>

您可以在 AWS KMS 控制台中创建别名，也可以使用 AWS KMS API 操作来创建别名。

别名必须为 1-256 个字符的字符串。它只能包含字母数字字符、正斜杠 (/)、下划线 (\$1) 和连字符 (-)。[客户托管密钥](concepts.md#customer-mgn-key)的别名名称不能以开头 `alias/aws/` 开头。`alias/aws/` 前缀专门预留供 [AWS 托管式密钥](concepts.md#aws-managed-key) 使用。

您可以为新的 KMS 密钥或现有的 KMS 密钥创建别名。您可以添加别名，以便在项目或应用程序中使用特定 KMS 密钥。

您也可以使用 AWS CloudFormation 模板为 KMS 密钥创建别名。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的 [AWS::KMS::Alias](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-kms-alias.html)。

## 使用控制 AWS KMS 台
<a name="alias-create-console"></a>

在 AWS KMS 控制台中[创建 KMS 密钥](create-keys.md)时，必须为新的 KMS 密钥创建别名。要为现有 KMS 密钥创建别名，请使用 KMS 密钥详细信息页面上的 **Aliases**（别名）选项卡。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择**客户托管密钥**。您无法管理 AWS 托管式密钥 或 AWS 拥有的密钥的别名。

1. 在表中，选择 KMS 密钥的密钥 ID 和别名。然后，在 KMS 密钥详细信息页面上，选择 **Aliases**（别名）选项卡。

   如果 KMS 密钥具有多个别名，则表中的 **Aliases**（别名）列会显示一个别名和一个别名摘要，例如**（再加 *n* 个）**。选择别名摘要将直接进入 KMS 密钥详细信息页面上的 **Aliases**（别名）选项卡中。

1. 在 **Aliases**（别名）选项卡上，选择 **Create alias**（创建别名）。输入别名名称，然后选择 **Create alias**（创建别名）。
**重要**  
不要在此字段中包含机密或敏感信息。此字段可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。
**注意**  
不要添加 `alias/` 前缀。控制台会为您自动添加。如果您输入 `alias/ExampleAlias`，实际的别名名称将是 `alias/alias/ExampleAlias`。

## 使用 AWS KMS API
<a name="alias-create-api"></a>

要创建别名，请使用[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)操作。与在控制台中创建 KMS 密钥的过程不同，该[CreateKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateKey.html)操作不会为新的 KMS 密钥创建别名。

**重要**  
不要在此字段中包含机密或敏感信息。此字段可能会以纯文本形式显示在 CloudTrail 日志和其他输出中。

您可以使用 `CreateAlias` 操作为没有别名的新 KMS 密钥创建别名。您也可以使用 `CreateAlias` 操作将别名添加到任何现有 KMS 密钥中或重新创建意外删除的别名。

在 AWS KMS API 操作中，别名必须以开头，`alias/`后跟一个名称，例如`alias/ExampleAlias`。别名在账户和 区域中必须是唯一的。要查找已在使用的别名，请使用[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)操作。别名名称区分大小写。

`TargetKeyId`可以是相同 AWS 区域中的任何[客户托管密钥](concepts.md#customer-mgn-key)。要标识 KMS 密钥，请使用其[密钥 ID](concepts.md#key-id-key-id) 或[密钥 ARN](concepts.md#key-id-key-ARN)。您不能使用另一个别名。

以下示例将创建 `example-key` 别名，并将其与指定的 KMS 密钥相关联。这些示例使用 AWS Command Line Interface (AWS CLI)。有关使用多种编程语言的示例，请参阅[`CreateAlias`与 AWS SDK 或 CLI 配合使用](example_kms_CreateAlias_section.md)。

```
$ aws kms create-alias \
    --alias-name alias/example-key \
    --target-key-id 1234abcd-12ab-34cd-56ef-1234567890ab
```

`CreateAlias` 不返回任何输出。要查看新别名，请使用 `ListAliases` 操作。有关更多信息，请参阅 [使用 AWS KMS API](alias-view.md#alias-view-api)。

# 查找 KMS 密钥的别名和别名 ARN
<a name="alias-view"></a>

别名便于在 AWS KMS 控制台中识别 KMS 密钥。您可以在 AWS KMS 控制台中或使用[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)操作查看 KMS 密钥的别名。该[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)操作返回 KMS 密钥的属性，但不包括别名。

以下过程演示如何使用 AWS KMS 控制台和 AWS KMS API 查看和识别与 KMS 密钥关联的别名。 AWS KMS API 示例使用 [AWS Command Line Interface (AWS CLI)](https://aws.amazon.com/cli/)，但您可以使用任何支持的编程语言。

## 使用控制 AWS KMS 台
<a name="alias-view-console"></a>

 AWS KMS 控制台显示与 KMS 密钥关联的别名。

1. 在 [https://console.aws.amazon.com/km AWS KMS](https://console.aws.amazon.com/kms) s 处打开控制台。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 要查看您账户中自己所创建和管理的密钥，请在导航窗格中选择 **Customer managed keys (客户托管密钥)**。要查看您的账户中为您 AWS 创建和管理的密钥，请在导航窗格中选择**AWS 托管密钥**。

1. **Aliases**（别名）列显示每个 KMS 密钥的别名。如果 KMS 密钥没有别名，则 **Aliases**（别名）列中会显示短划线 (**-**)。

   如果 KMS 密钥具有多个别名，则 **Aliases**（别名）列还会包含别名摘要，例如**（再加 *n* 个）**。例如，以下 KMS 密钥有两个别名，其中一个是 `key-test`。

   要查找 KMS 密钥的所有别名的名称和别名 ARN，请使用 **Aliases**（别名）选项卡。
   + 要直接转到 **Aliases**（别名）选项卡上的 **Aliases**（别名）列中，选择别名摘要（**再加 *n* 个**）。仅当 KMS 密钥具有多个别名时，才会显示别名摘要。
   + 或者，选择 KMS 密钥的别名或密钥 ID（这将打开 KMS 密钥的详细信息页面），然后选择 **Aliases**（别名）选项卡。这些选项卡在 **General configuration**（常规配置）部分下。  
![\[客户自主管理型密钥 interface showing a list with one key and options to create or filter keys.\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/images/find-alias-name-1-sm.png)

1. **Aliases**（别名）选项卡显示 KMS 密钥的所有别名的名称和别名 ARN。您还可以在此选项卡上创建和删除 KMS 密钥的别名。  
![\[Aliases tab showing two key aliases with their names and ARNs listed in a table format.\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/images/alias-tab-1.png)

**AWS 托管式密钥**  
您可以使用别名来识别 AWS 托管式密钥，如本示例**AWS 托管式密钥**页所示。 AWS 托管式密钥 的别名始终具有以下格式：`aws/<service-name>`。例如，亚马逊 DynamoD AWS 托管式密钥 B 的别名是。`aws/dynamodb`

![\[AWS KMS 控制台的 AWS 托管式密钥 页面中的别名\]](http://docs.aws.amazon.com/zh_cn/kms/latest/developerguide/images/alias-console-aws-managed-sm.png)


## 使用 AWS KMS API
<a name="alias-view-api"></a>

该[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)操作返回账户和区域中别名的别名和别名 ARN。输出包括客户托管密钥 AWS 托管式密钥 和客户托管密钥的别名。 AWS 托管式密钥 的别名始终具有格式 `aws/<service-name>`，如 `aws/dynamodb`。

该响应可能还包括没有 `TargetKeyId` 字段的别名。这些是 AWS 已创建但尚未与 KMS 密钥关联的预定义别名。

```
$ aws kms list-aliases
{
    "Aliases": [
        {
            "AliasName": "alias/access-key",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/access-key",
            "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
            "CreationDate": 1516435200.399,
            "LastUpdatedDate": 1516435200.399
        },        
        {
            "AliasName": "alias/ECC-P521-Sign",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/ECC-P521-Sign",
            "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1693622000.704,
            "LastUpdatedDate": 1693622000.704
        },
        {
            "AliasName": "alias/ImportedKey",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/ImportedKey",
            "TargetKeyId": "1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d",
            "CreationDate": 1493622000.704,
            "LastUpdatedDate": 1521097200.235
        },
        {
            "AliasName": "alias/finance-project",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/finance-project",
            "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
            "CreationDate": 1604958290.014,
            "LastUpdatedDate": 1604958290.014
        },
        {
            "AliasName": "alias/aws/dynamodb",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/aws/dynamodb",
            "TargetKeyId": "0987ab65-43cd-21ef-09ab-87654321cdef",
            "CreationDate": 1521097200.454,
            "LastUpdatedDate": 1521097200.454
        },
        {
            "AliasName": "alias/aws/ebs",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/aws/ebs",
            "TargetKeyId": "abcd1234-09fe-ef90-09fe-ab0987654321",
            "CreationDate": 1466518990.200,
            "LastUpdatedDate": 1466518990.200
        }
    ]
}
```

要获取与特定 KMS 密钥关联的所有别名，请使用 `ListAliases` 操作的可选 `KeyId` 参数。`KeyId` 参数采用 KMS 密钥的[密钥 ID](concepts.md#key-id-key-id) 或者[密钥 ARN](concepts.md#key-id-key-ARN)。

此示例获取与 `0987dcba-09fe-87dc-65ba-ab0987654321` KMS 密钥关联的所有别名。

```
$ aws kms list-aliases --key-id 0987dcba-09fe-87dc-65ba-ab0987654321
{
    "Aliases": [
        {
            "AliasName": "alias/access-key",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/access-key",
            "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
            "CreationDate": "2018-01-20T15:23:10.194000-07:00",
            "LastUpdatedDate": "2018-01-20T15:23:10.194000-07:00"
        },
        {
            "AliasName": "alias/finance-project",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/finance-project",
            "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
            "CreationDate": 1604958290.014,
            "LastUpdatedDate": 1604958290.014
        }
    ]
}
```

`KeyId` 参数不采用通配符，但您可以使用编程语言的功能筛选响应。

例如，以下 AWS CLI 命令仅获取的别名。 AWS 托管式密钥

```
$ aws kms list-aliases --query 'Aliases[?starts_with(AliasName, `alias/aws/`)]'
```

例如，以下命令仅获取 `access-key` 别名。别名名称区分大小写。

```
$ aws kms list-aliases --query 'Aliases[?AliasName==`alias/access-key`]'
[
    {
        "AliasName": "alias/access-key",
        "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/access-key",
        "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
        "CreationDate": "2018-01-20T15:23:10.194000-07:00",
        "LastUpdatedDate": "2018-01-20T15:23:10.194000-07:00"
    }
]
```

# 更新别名
<a name="alias-update"></a>

由于别名是独立的资源，因此您可以更改与别名关联的 KMS 密钥。例如，如果`test-key`别名与一个 KMS 密钥关联，则可以使用该[UpdateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_UpdateAlias.html)操作将其与其他 KMS 密钥关联。这是[手动轮换 KMS 密钥](rotate-keys.md)而不更改其密钥材料的几种方法之一。您还可以更新 KMS 密钥，以使将一个 KMS 密钥用于新资源的应用程序现在使用不同的 KMS 密钥。

您无法在 AWS KMS 控制台中更新别名。另外，您不能使用 `UpdateAlias`（或任何其他操作）更改别名名称。要更改别名名称，请删除当前别名，然后为 KMS 密钥创建新的别名。

更新别名时，当前 KMS 密钥和新 KMS 密钥必须为相同类型（均为对称、非对称或 HMAC）。它们还必须拥有相同的密钥用法（`ENCRYPT_DECRYPT`、`SIGN_VERIFY` 或 GENERATE\$1VERIFY\$1MAC）。此限制可防止使用别名的代码中出现加密错误。

以下示例首先使用[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)操作来显示`test-key`别名当前与 KMS 密钥相关联`1234abcd-12ab-34cd-56ef-1234567890ab`。

```
$ aws kms list-aliases --key-id 1234abcd-12ab-34cd-56ef-1234567890ab
{
    "Aliases": [
        {
            "AliasName": "alias/test-key",
            "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/test-key",
            "TargetKeyId": "1234abcd-12ab-34cd-56ef-1234567890ab",
            "CreationDate": 1593622000.191,
            "LastUpdatedDate": 1593622000.191
        }
    ]
}
```

接下来，它使用 `UpdateAlias` 操作将与 `test-key` 别名关联的 KMS 密钥更改为 KMS 密钥 `0987dcba-09fe-87dc-65ba-ab0987654321`。您不需要指定当前关联的 KMS 密钥，只需指定新的（“目标”）KMS 密钥。别名名称区分大小写。

```
$ aws kms update-alias --alias-name 'alias/test-key' --target-key-id 0987dcba-09fe-87dc-65ba-ab0987654321
```

要验证别名现在是否已与目标 KMS 密钥关联，请再次使用 `ListAliases` 操作。此 AWS CLI 命令使用`--query`参数仅获取`test-key`别名。`TargetKeyId` 和 `LastUpdatedDate` 字段将更新。

```
$ aws kms list-aliases --query 'Aliases[?AliasName==`alias/test-key`]'
[
    {
        "AliasName": "alias/test-key",
        "AliasArn": "arn:aws:kms:us-west-2:111122223333:alias/test-key",
        "TargetKeyId": "0987dcba-09fe-87dc-65ba-ab0987654321",
        "CreationDate": 1593622000.191,
        "LastUpdatedDate": 1604958290.154
    }
]
```

# 删除别名
<a name="alias-delete"></a>

您可以在 AWS KMS 控制台中删除别名，也可以使用[DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)操作来删除别名。删除别名之前，请确保别名未使用。虽然删除别名不会影响关联的 KMS 密钥，但它可能会为使用别名的任何应用程序造成问题。如果错误地删除了别名，您可以创建具有相同名称的新别名，并将其与相同或不同的 KMS 密钥关联。

如果您删除 KMS 密钥，则会删除与该 KMS 密钥关联的所有别名。

## 使用控制 AWS KMS 台
<a name="alias-delete-console"></a>

要在 AWS KMS 控制台中删除别名，请使用 KMS 密钥详情页面上的 “**别名**” 选项卡。您可以一次删除一个 KMS 密钥的多个别名。

1. 登录 AWS 管理控制台 并在 [https://console.aws.amazon.com/km](https://console.aws.amazon.com/kms) s 处打开 AWS Key Management Service (AWS KMS) 控制台。

1. 要更改 AWS 区域，请使用页面右上角的区域选择器。

1. 在导航窗格中，选择**客户托管密钥**。您无法管理 AWS 托管式密钥 或 AWS 拥有的密钥的别名。

1. 在表中，选择 KMS 密钥的密钥 ID 和别名。然后，在 KMS 密钥详细信息页面上，选择 **Aliases**（别名）选项卡。

   如果 KMS 密钥具有多个别名，则表中的 **Aliases**（别名）列会显示一个别名和一个别名摘要，例如**（再加 *n* 个）**。选择别名摘要将直接进入 KMS 密钥详细信息页面上的 **Aliases**（别名）选项卡中。

1. 在 **Aliases**（别名）选项卡上，选中要删除的别名旁边的复选框。然后选择**删除**。

## 使用 AWS KMS API
<a name="alias-delete-api"></a>

要删除别名，请使用[DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)操作。此操作一次删除一个别名。别名名称区分大小写，且前面必须带有 `alias/` 前缀。

例如，以下命令删除 `test-key` 别名。此命令不返回任何输出。

```
$ aws kms delete-alias --alias-name alias/test-key
```

要验证别名是否已删除，请使用[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)操作。以下命令使用中的`--query`参数仅 AWS CLI 获取`test-key`别名。响应中的空括号表示 `ListAliases` 响应不包含 `test-key` 别名。要消除括号，请使用 `--output text` 参数和值。

```
$ aws kms list-aliases --query 'Aliases[?AliasName==`alias/test-key`]'
[]
```

# 使用别名控制对 KMS 密钥的访问
<a name="alias-authorization"></a>

您可以根据与 KMS 密钥关联的别名来控制对 KMS 密钥的访问。为此，请使用 [kms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) 和 [kms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。此功能是[基于属性的访问控制](abac.md) (ABAC) AWS KMS 支持的一部分。

`kms:RequestAlias` 条件键基于请求中的别名允许或拒绝对 KMS 密钥的访问。`kms:ResourceAliases` 条件键基于与 KMS 密钥关联的别名允许或拒绝对 KMS 密钥的访问。

这些功能不允许您通过使用策略语句的 `resource` 元素中的别名来标识 KMS 密钥。当别名是 `resource` 元素的值时，策略将应用于别名资源，而不是可能与其关联的任何 KMS 密钥。

**注意**  
标签和别名的更改最多可能需要 5 分钟的时间才能影响 KMS 密钥授权。最近的更改可能会在 API 操作中显示，然后才会影响授权。

使用别名控制对 KMS 密钥的访问权限时，请考虑以下事项：
+ 使用别名来强化[最低权限访问](iam-policies-best-practices.md)的最佳实践。仅为 IAM 委托人授予他们对必须使用或管理的 KMS 密钥的所需权限。例如，使用别名标识用于项目的 KMS 密钥。然后授予项目团队仅使用带有项目别名的 KMS 密钥的权限。
+ 谨慎为委托人提供 `kms:CreateAlias`、`kms:UpdateAlias` 或 `kms:DeleteAlias` 权限，以允许他们添加、编辑和删除标签。当您使用别名控制对 KMS 密钥的访问时，更改别名可以授予委托人使用他们没有权限使用的 KMS 密钥的权限。它还可以拒绝对其他委托人执行其工作所需的 KMS 密钥的访问。
+ 查看您 AWS 账户 中当前有权管理别名的委托人，并在必要时调整权限。不具有更改密钥策略或创建授权权限的密钥管理员可以控制对 KMS 密钥的访问，前提是他们有权管理别名。

  例如，控制台[密钥管理员的默认密钥策略](key-policy-default.md#key-policy-default-allow-administrators)包括对 `kms:CreateAlias`、`kms:DeleteAlias` 和 `kms:UpdateAlias` 权限。IAM policy 可能会授予对您的 AWS 账户中所有 KMS 密钥的别名权限。例如，[AWSKeyManagementServicePowerUser](https://console.aws.amazon.com/iam/home#policies/arn:aws:iam::aws:policy/AWSKeyManagementServicePowerUser)托管策略允许委托人创建、删除和列出所有 KMS 密钥的别名，但不允许对其进行更新。
+ 在设置依赖于别名的策略之前，请查看您 AWS 账户的 KMS 密钥的别名。请确保您的策略仅适用于您要包含的别名。使用[CloudTrail 日志](alias-ct.md)和[CloudWatch 警报](monitoring-cloudwatch.md)提醒您注意可能影响您的 KMS 密钥访问权限的别名更改。此外，[ListAliases](https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html)响应还包括每个别名的创建日期和上次更新日期。
+ 别名策略条件使用模式匹配；它们不绑定到别名的特定实例。使用基于别名的条件键的策略会影响与模式匹配的所有新别名和现有别名。如果删除并重新创建与策略条件匹配的别名，则该条件将应用于新别名，就像对旧别名一样。

`kms:RequestAlias` 条件键依赖于操作请求中明确指定的别名。`kms:ResourceAliases` 条件键取决于与 KMS 密钥关联的别名，即使它们未出现在请求中。

## kms: RequestAlias
<a name="alias-auth-request-alias"></a>

基于标识请求中的 KMS 密钥的别名，允许或拒绝对 KMS 密钥的访问。您可以在[密钥策略或 IAM 策略中使用 kms: RequestAlias](conditions-kms.md#conditions-kms-request-alias) [条件密钥](key-policies.md)。它适用于在请求中使用别名标识 KMS 密钥的操作，即[加密操作[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)](kms-cryptography.md#cryptographic-operations)、和[GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)。它对别名操作无效，例如[CreateAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateAlias.html)或[DeleteAlias](https://docs.aws.amazon.com/kms/latest/APIReference/API_DeleteAlias.html)。

**重要**  
不建议使用带有`kms:RequestAlias`条件的`Deny`策略声明，因为呼叫者可以通过使用[密钥 ID、密钥](concepts.md#key-id-key-id) AR [N](concepts.md#key-id-key-ARN) 或其他别名来标识请求中的 KMS 密钥来绕过该声明。要根据与 KMS 密钥关联的别名拒绝访问，请改用 k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥。

在条件键中，指定[别名名称](concepts.md#key-id-alias-name)或别名名称模式。您不能指定[别名 ARN](concepts.md#key-id-alias-ARN)。

例如，以下密钥策略语句允许委托人在 KMS 密钥上使用指定的操作。权限仅在请求使用包含可标识 KMS 密钥的 `alpha` 别名时有效。

```
{
  "Sid": "Key policy using a request alias condition",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:role/alpha-developer"
  },
  "Action": [
    "kms:Decrypt",
    "kms:GenerateDataKey*",
    "kms:DescribeKey"
  ],
  "Resource": "*",
  "Condition": {
    "StringLike": {
      "kms:RequestAlias": "alias/*alpha*"
    }
  }
}
```

以下来自授权委托人的示例请求将满足条件。但是，使用[密钥 ID](concepts.md#key-id-key-id)、[密钥 ARN](concepts.md#key-id-key-ARN) 或者其他别名的请求将无法满足条件，即使这些值标识了相同的 KMS 密钥。

```
$ aws kms describe-key --key-id "arn:aws:kms:us-west-2:111122223333:alias/project-alpha"
```

## kms: ResourceAliases
<a name="alias-auth-resource-aliases"></a>

基于与 KMS 密钥关联的别名允许或拒绝访问 KMS 密钥，即使请求中未使用别名也是如此。k [ms: ResourceAliases](conditions-kms.md#conditions-kms-resource-aliases) 条件密钥允许您指定别名或别名模式，例如`alias/test*`，这样您就可以在 IAM 策略中使用它来控制对同一区域中多个 KMS 密钥的访问权限。它对任何使用 KMS 密钥的 AWS KMS 操作都有效。

例如，以下 IAM 策略允许委托人分两 AWS 账户次调用 KMS 密钥的指定操作。但是，该权限仅适用于与开头为 `restricted` 的别名相关联的 KMS 密钥。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AliasBasedIAMPolicy",
      "Effect": "Allow",
      "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": [
        "arn:aws:kms:*:111122223333:key/*",
        "arn:aws:kms:*:444455556666:key/*"
      ],
      "Condition": {
        "ForAnyValue:StringLike": {
          "kms:ResourceAliases": "alias/restricted*"
        }
      }
    }
  ]
}
```

------

`kms:ResourceAliases` 条件是资源的条件，而不是请求的。因此，未指定别名的请求仍然可以满足条件。

以下示例请求（指定匹配别名）满足条件。

```
$ aws kms enable-key-rotation --key-id "alias/restricted-project"
```

但是，下面的示例请求也满足条件，前提是指定的 KMS 密钥具有以 `restricted` 开头的别名，即使该别名未在请求中使用。

```
$ aws kms enable-key-rotation --key-id "1234abcd-12ab-34cd-56ef-1234567890ab"
```

# 了解如何在您的应用程序中使用别名
<a name="alias-using"></a>

您可以使用别名在应用程序代码中表示 KMS 密钥。 AWS KMS [加密运算](kms-cryptography.md#cryptographic-operations)中的`KeyId`参数[DescribeKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)、和[GetPublicKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html)接受别名或别名 ARN。

例如，以下 `GenerateDataKey` 命令使用别名名称 (`alias/finance`）来标识 KMS 密钥。别名名称是 `KeyId` 参数的值。

```
$ aws kms generate-data-key --key-id alias/finance --key-spec AES_256
```

如果 KMS 密钥位于其他密钥中 AWS 账户，则必须在这些操作中使用密钥 ARN 或别名 ARN。使用别名 ARN 时，请记住 KMS 密钥的别名是在拥有 KMS 密钥的账户中定义的，并且在每个区域中可能会有所不同。有关查找别名 ARN 的帮助，请参阅 [查找 KMS 密钥的别名和别名 ARN](alias-view.md)。

例如，以下 `GenerateDataKey` 命令使用不在调用者账户中的 KMS 密钥。`ExampleAlias` 别名与指定账户和区域中的 KMS 密钥相关联。

```
$ aws kms generate-data-key --key-id arn:aws:kms:us-west-2:444455556666:alias/ExampleAlias --key-spec AES_256
```

别名的最强大用途之一是在多个 AWS 区域中运行的应用程序中。例如，您可能有一个使用 RSA [非对称 KMS 密钥](symmetric-asymmetric.md)进行签名和验证的全局应用程序。
+ 在美国西部（俄勒冈）(us-west-2) 区域中，您需要使用 `arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab`。
+ 在欧洲（法兰克福）(eu-central-1) 区域中，您需要使用 `arn:aws:kms:eu-central-1:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321`
+ 在亚太地区（新加坡）(ap-southeast-1) 区域中，您需要使用 `arn:aws:kms:ap-southeast-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d`。

您可以在每个区域中创建不同版本的应用程序，也可以使用字典或 switch 语句为每个区域选择正确的 KMS 密钥。但在每个区域中创建具有相同别名名称的别名要容易得多。请记住，别名名称区分大小写。

```
aws --region us-west-2 kms create-alias \
    --alias-name alias/new-app \
    --key-id arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

aws --region eu-central-1 kms create-alias \
    --alias-name alias/new-app \
    --key-id arn:aws:kms:eu-central-1:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321

aws --region ap-southeast-1 kms create-alias \
    --alias-name alias/new-app \
    --key-id arn:aws:kms:ap-southeast-1:111122223333:key/1a2b3c4d-5e6f-1a2b-3c4d-5e6f1a2b3c4d
```

然后，在代码中使用别名。当代码在每个区域中运行时，别名将引用该区域中关联的 KMS 密钥。例如，此代码将使用别名名称调用 [Sign](https://docs.aws.amazon.com/kms/latest/APIReference/API_Sign.html) 操作。

```
aws kms sign --key-id alias/new-app \
    --message $message \
    --message-type RAW \
    --signing-algorithm RSASSA_PSS_SHA_384
```

但是，别名可能有被删除或更新为与其他 KMS 密钥关联的风险。在这种情况下，应用程序尝试使用别名名称验证签名将失败，您可能需要重新创建或更新别名。

要降低此风险，请谨慎授予委托人管理您在应用程序中使用的别名的权限。有关更多信息，请参阅 [控制对别名的访问](alias-access.md)。

对于在多个 AWS 区域中加密数据的应用程序，还有几个其他解决方案，包括 [AWS Encryption SDK](https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/)。

# 在日志中 AWS CloudTrail 查找别名
<a name="alias-ct"></a>

在 AWS KMS API 操作 AWS KMS key 中，您可以使用别名来表示。当您这样做时，KMS 密钥的别名和密钥 ARN 将记录在事件的 AWS CloudTrail 日志条目中。别名显示在 `requestParameters` 字段中。密钥 ARN 显示在 `resources` 字段中。即使某项 AWS 服务 AWS 托管式密钥 在您的账户中使用了，也是如此。

例如，以下[GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html)请求使用`project-key`别名表示 KMS 密钥。

```
$ aws kms generate-data-key --key-id alias/project-key --key-spec AES_256
```

当此请求记录在 CloudTrail 日志中时，日志条目包括所使用的实际 KMS 密钥的别名和密钥 ARN。

```
{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "ABCDE",
        "arn": "arn:aws:iam::111122223333:role/ProjectDev",
        "accountId": "111122223333",
        "accessKeyId": "FFHIJ",
        "userName": "example-dev"
    },
    "eventTime": "2020-06-29T23:36:41Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "205.205.123.000",
    "userAgent": "aws-cli/1.18.89 Python/3.6.10 Linux/4.9.217-0.1.ac.205.84.332.metal1.x86_64 botocore/1.17.12",
    "requestParameters": {
        "keyId": "alias/project-key",
        "keySpec": "AES_256"
    },
    "responseElements": null,
    "requestID": "d93f57f5-d4c5-4bab-8139-5a1f7824a363",
    "eventID": "d63001e2-dbc6-4aae-90cb-e5370aca7125",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
        }
    ],
    "eventType": "AwsApiCall",
    "recipientAccountId": "111122223333"
}
```

有关在 CloudTrail 日志中记录 AWS KMS 操作的详细信息，请参阅[使用记录 AWS KMS API 调用 AWS CloudTrail](logging-using-cloudtrail.md)。