

# 在 AWS CLI 中创建和使用别名
<a name="cli-usage-alias"></a>

别名是您可以在 AWS Command Line Interface（AWS CLI）中创建的快捷方式，用于缩短您经常使用的命令或脚本。您可以在配置文件夹中的 `alias` 文件中创建别名。

**Topics**
+ [先决条件](#cli-usage-alias-prepreqs)
+ [步骤 1：创建别名文件](#cli-usage-alias-create-file)
+ [步骤 2：创建别名](#cli-usage-alias-create-alias)
+ [步骤 3：调用别名](#cli-usage-alias-call-alias)
+ [别名存储库示例](#cli-usage-alias-examples)
+ [资源](#cli-usage-alias-references)

## 先决条件
<a name="cli-usage-alias-prepreqs"></a>

要使用别名命令，您需要完成以下操作：
+ 安装和配置 AWS CLI。有关更多信息，请参阅[安装或更新最新版本的 AWS CLI](getting-started-install.md)和 [AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。
+ 使用最低 AWS CLI 版本 1.11.24 或 2.0.0。
+ （可选）要使用 AWS CLI 别名 bash 脚本，必须使用兼容 bash 的终端。

## 步骤 1：创建别名文件
<a name="cli-usage-alias-create-file"></a>

要创建 `alias` 文件，您可以使用文件导航和文本编辑器，或通过分步过程来使用首选终端。要快速创建别名文件，请使用以下命令块。

------
#### [ Linux and macOS ]

```
$ mkdir -p ~/.aws/cli
$ echo '[toplevel]' > ~/.aws/cli/alias
```

------
#### [ Windows ]

```
C:\> md %USERPROFILE%\.aws\cli
C:\> echo [toplevel] > %USERPROFILE%/.aws/cli/alias
```

------

**创建别名文件**

1. 在 AWS CLI 配置文件夹中创建名为 `cli` 的文件夹。默认情况下，配置文件夹为 `~/.aws/`（Linux 或 macOS）和 `%USERPROFILE%\.aws\` (Windows)。您可以通过文件导航或使用以下命令进行创建。

------
#### [ Linux and macOS ]

   ```
   $ mkdir -p ~/.aws/cli
   ```

------
#### [ Windows ]

   ```
   C:\> md %USERPROFILE%\.aws\cli
   ```

------

   生成的 `cli` 文件夹默认路径为 `~/.aws/cli/`（Linux 或 macOS）和 `%USERPROFILE%\.aws\cli` (Windows)。

1. 在 `cli` 文件夹中，创建不带扩展名的名为 `alias` 的文本文件，然后将 `[toplevel]` 添加到第一行。您可以通过首选的文本编辑器或使用以下命令创建此文件。

------
#### [ Linux and macOS ]

   ```
   $ echo '[toplevel]' > ~/.aws/cli/alias
   ```

------
#### [ Windows ]

   ```
   C:\> echo [toplevel] > %USERPROFILE%/.aws/cli/alias
   ```

------

## 步骤 2：创建别名
<a name="cli-usage-alias-create-alias"></a>

您可以使用基本命令或 bash 脚本创建别名。

### 创建基本命令别名
<a name="cli-usage-alias-create-alias-basic"></a>

您可以在上一步中创建的 `alias` 文件中使用以下语法来添加命令，从而来创建别名。

**语法**

```
aliasname = command [--options]
```

*aliasname* 即您所称的别名。*command* 是您想要调用的命令，它可以包括其他别名。您可以在别名中包含选项或参数，也可以在调用别名时添加选项或参数。

以下示例使用 [https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html) 命令创建名为 `aws whoami` 的别名。由于此别名调用了现有 AWS CLI 命令，因此您可以编写不带 `aws` 前缀的命令。

```
whoami = sts get-caller-identity
```

以下示例利用了上一个 `whoami` 示例并添加了`Account` 筛选条件和文本 `output` 选项。

```
whoami2 = sts get-caller-identity --query Account --output text
```

### 创建子命令别名
<a name="cli-usage-alias-create-alias-sub-command"></a>

**注意**  
子命令别名功能需要最低 AWS CLI 版本 1.11.24 或 2.0.0

您可以在上一步中创建的 `alias` 文件中使用以下语法来添加命令，从而为子命令创建别名。

**语法**

```
[command commandGroup]
aliasname = command [--options]
```

*commandGroup* 是命令命名空间，例如，命令 `aws ec2 describe-regions` 位于 `ec2` 命令组下。*aliasname* 即您所称的别名。*command* 是您想要调用的命令，它可以包括其他别名。您可以在别名中包含选项或参数，也可以在调用别名时添加选项或参数。

以下示例使用 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-regions.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-regions.html) 命令创建名为 `aws ec2 regions` 的别名。由于此别名调用了 `ec2` 命令命名空间下的现有 AWS CLI 命令，因此您可以编写不带 `aws ec2` 前缀的命令。

```
[command ec2]
regions = describe-regions --query Regions[].RegionName
```

要使用命令命名空间之外的命令创建别名，请在完整命令前面加上感叹号前缀。以下示例使用 [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html) 命令创建名为 `aws ec2 instance-profiles` 的别名。

```
[command ec2]
instance-profiles = !aws iam list-instance-profiles
```

**注意**  
别名仅使用现有命令命名空间，您不能创建新的命名空间。例如，您无法使用 `[command johnsmith]` 部分创建别名，因为 `johnsmith` 命令命名空间尚不存在。

### 创建 bash 脚本别名
<a name="cli-usage-alias-create-alias-scripting"></a>

**警告**  
要使用 AWS CLI 别名 bash 脚本，必须使用兼容 bash 的终端

您可以使用以下语法为更高级的流程使用 bash 脚本创建别名。

**语法**

```
aliasname = 
    !f() {
        script content
}; f
```

*aliasname* 即您所称的别名，*script content* 是您调用别名时要运行的脚本。

以下示例使用 `opendns` 输出您当前的 IP 地址。由于您可以在其他别名中使用别名，因此以下 `myip` 别名可用于允许或撤消从其他别名访问 IP 地址的权限。

```
myip =
  !f() {
    dig +short myip.opendns.com @resolver1.opendns.com
  }; f
```

以下脚本示例调用了之前的 `aws myip` 别名，以授权 Amazon EC2 安全组入口的 IP 地址。

```
authorize-my-ip =
  !f() {
    ip=$(aws myip)
    aws ec2 authorize-security-group-ingress --group-id ${1} --cidr $ip/32 --protocol tcp --port 22
  }; f
```

当您调用使用 bash 脚本的别名时，变量将始终按照您输入的顺序进行传递。在 bash 脚本中，不考虑变量名称，仅考虑它们出现的顺序。在以下 `textalert` 别名示例中，`--message` 选项的变量是第一个，`--phone-number` 选项是第二个。

```
textalert =
  !f() {
    aws sns publish --message "${1}" --phone-number ${2}
  }; f
```

## 步骤 3：调用别名
<a name="cli-usage-alias-call-alias"></a>

要运行在 `alias` 文件中创建的别名，请使用以下语法。您可以在调用别名时添加其他选项。

**语法**

```
$ aws aliasname
```

以下示例使用 `aws whoami` 命令别名。

```
$ aws whoami
{
    "UserId": "A12BCD34E5FGHI6JKLM",
    "Account": "1234567890987",
    "Arn": "arn:aws:iam::1234567890987:user/userName"
}
```

以下示例使用了带有其他选项的 `aws whoami` 别名，仅返回 `Account` 输出中的 `text` 数字。

```
$ aws whoami --query Account --output text
1234567890987
```

以下示例使用 `aws ec2 regions` [子命令别名](#cli-usage-alias-create-alias-sub-command)。

```
$ aws ec2 regions
[
    "ap-south-1",
    "eu-north-1",
    "eu-west-3",
    "eu-west-2",
...
```

### 使用 bash 脚本变量调用别名
<a name="cli-usage-alias-call-alias-variables"></a>

调用使用 bash 脚本的别名时，变量将按照输入的顺序进行传递。在 bash 脚本中，不考虑变量的名称，仅考虑它们出现的顺序。例如，在以下 `textalert` 别名中，选项 `--message` 的变量是第一个，`--phone-number` 是第二个。

```
textalert =
  !f() {
    aws sns publish --message "${1}" --phone-number ${2}
  }; f
```

调用 `textalert` 别名时，您需要按照变量在别名中运行的顺序进行传递。在以下示例中，我们使用变量 `$message` 和 `$phone`。`$message` 变量将作为 `${1}` 选项的 `--message` 传递，`$phone` 变量将作为 `${2}` 选项的 `--phone-number` 传递。这会成功调用 `textalert` 别名来发送消息。

```
$ aws textalert $message $phone
{
    "MessageId": "1ab2cd3e4-fg56-7h89-i01j-2klmn34567"
}
```

在以下示例中，将别名调用至 `$phone` 和 `$message` 时，将切换顺序。`$phone` 变量将作为 `${1}` 选项的 `--message` 传递，`$message` 变量将作为 `${2}` 选项的 `--phone-number` 传递。由于变量顺序混乱，因此别名错误地传递了变量。这会导致发生错误，因为 `$message` 的内容与 `--phone-number` 选项的电话号码格式要求不匹配。

```
$ aws textalert $phone $message
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

Unknown options: text
```

## 别名存储库示例
<a name="cli-usage-alias-examples"></a>

*GitHub* 上的 [AWS CLI 别名存储库](https://github.com/awslabs/awscli-aliases)包含由 AWS CLI 开发人员团队和社区创建的 AWS CLI 别名示例。您可以使用整个 `alias` 文件示例，也可以自己使用单个别名。

**警告**  
运行本节中的命令会删除现有 `alias` 文件。为避免覆盖现有别名文件，请更改下载位置。

**使用存储库中的别名**

1. 安装 Git。有关安装说明，请参阅 *Git 文档*中的[入门 - 安装 Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)。

1. 安装 `jp` 命令。`jp` 命令是在 `tostring` 别名中使用的。有关安装说明，请参阅 *GitHub* 上的 [JMESPath (jp) README.md](https://github.com/jmespath/jp)。

1. 安装 `jq` 命令。`jq` 命令是在 `tostring-with-jq` 别名中使用的。有关安装说明，请参阅 *GitHub* 上的 [JSON 处理器 (jq) ](https://stedolan.github.io/jq/download/)。

1. 通过执行以下操作之一下载 `alias` 文件：
   + 运行以下命令，它是从存储库下载的并将 `alias` 文件复制到配置文件夹。

------
#### [ Linux and macOS ]

     ```
     $ git clone https://github.com/awslabs/awscli-aliases.git
     $ mkdir -p ~/.aws/cli
     $ cp awscli-aliases/alias ~/.aws/cli/alias
     ```

------
#### [ Windows ]

     ```
     C:\> git clone https://github.com/awslabs/awscli-aliases.git
     C:\> md %USERPROFILE%\.aws\cli
     C:\> copy awscli-aliases\alias %USERPROFILE%\.aws\cli
     ```

------
   + 直接从存储库下载并保存到 AWS CLI 配置文件夹中的 `cli` 文件夹。默认情况下，配置文件夹为 `~/.aws/`（Linux 或 macOS）和 `%USERPROFILE%\.aws\` (Windows)。

1. 要验证别名是否有效，请运行以下别名。

   ```
   $ aws whoami
   ```

   这将显示与 `aws sts get-caller-identity` 命令相同的响应：

   ```
   {
       "Account": "012345678901",
       "UserId": "AIUAINBADX2VEG2TC6HD6",
       "Arn": "arn:aws:iam::012345678901:user/myuser"
   }
   ```

## 资源
<a name="cli-usage-alias-references"></a>
+ *GitHub* 上的 [AWS CLI 别名存储库](https://github.com/awslabs/awscli-aliases)包含由 AWS CLI 开发人员团队创建的 AWS CLI 别名示例以及 AWS CLI 社区的贡献。
+ 来自 [AWS re:Invent 2016：有效的 AWS CLI 用户](https://www.youtube.com/watch?t=1590&v=Xc1dHtWa9-Q)的别名特征公告 (*YouTube*)。
+ [https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html)