

# AWS CLI 版本 2 中的新功能和变化
<a name="cliv2-migration-changes"></a>

本主题介绍 AWS CLI 版本 1 和 AWS CLI 版本 2 之间的新功能和行为变化。这些变化可能要求您更新脚本或命令，以便在版本 2 中获得与版本 1 中相同的行为。

**Topics**
+ [AWS CLI 版本 2 新功能](#cliv2-migration-changes-features)
+ [AWS CLI 版本 1 和 AWS CLI 版本 2 之间的突破性更改](#cliv2-migration-changes-breaking)

## AWS CLI 版本 2 新功能
<a name="cliv2-migration-changes-features"></a>

AWS CLI 版本 2 是 AWS CLI 的最新主版本，支持所有最新功能。版本 2 中引入的某些功能无法向后兼容版本 1，您必须升级才能访问这些功能。这些功能如下所示：

**不需要 Python 解释器**  
AWS CLI 版本 2 不需要单独安装 Python。它包括一个嵌入式版本。

**[向导](cli-usage-wizard.md)**  
您可以将向导与 AWS CLI 版本 2 结合使用。此向导将引导您构建某些命令。

**[IAM Identity Center 身份验证IAM Identity Center 概念教程：AWS IAM Identity Center 和 Amazon S3AWS CLI 示例](cli-configure-sso.md)**  
如果您的企业使用 AWS IAM Identity Center(IAM Identity Center)，则用户可以登录到 Active Directory、内置 IAM Identity Center 目录或[连接到 IAM Identity Center 的其他 IdP](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source-idp.html)。然后，它们映射到允许您运行 AWS CLI 命令的 AWS Identity and Access Management (IAM) 角色。

**[自动提示](cli-usage-parameters-prompting.md)**  
如果启用，当您运行 `aws` 命令时，AWS CLI 版本 2 可以提示您输入命令、参数和资源。

**[在 AWS CLI 中运行官方 Amazon ECR Public 映像或 Docker 映像](getting-started-docker.md)**  
AWS CLI 的官方 Docker 映像提供 AWS 直接支持和维护的隔离、可移植性和安全性。这样，您可以在基于容器的环境中使用 AWS CLI 版本 2，而无需自行管理安装。

**[客户端分页程序](cli-usage-pagination.md#cli-usage-pagination-clientside)**  
AWS CLI 版本 2 支持使用客户端分页程序处理输出。原定设置情况下，此功能处于启用状态，并通过操作系统的原定设置分页程序返回所有输出。

**[`aws configure import`](cli-configure-files.md#cli-config-aws_configure_import)**  
导入从 AWS 管理控制台生成的 `.csv` 凭证。将导入一个配置文件名称与 IAM 用户名匹配的 `.csv` 文件。

**[https://docs.aws.amazon.com/cli/latest/reference/configure/list-profiles.html](https://docs.aws.amazon.com/cli/latest/reference/configure/list-profiles.html)**  
列出您已经配置的所有配置文件的名称。

**[YAML 流输出格式](cli-usage-output-format.md#yaml-stream-output)**  
`yaml` 和 `yaml-stream` 格式利用 [YAML](https://yaml.org) 格式，同时通过向您流式传输数据，使您在查看大型数据集时的响应能力更高。您可以在整个查询下载之前开始查看和使用 YAML 数据。

**[适用于 DynamoDB 的新的高级 `ddb` 命令](https://docs.aws.amazon.com/cli/latest/reference/ddb/index.html)**  
AWS CLI 版本 2 具有高级 Amazon DynamoDB 命令 [https://docs.aws.amazon.com/cli/latest/reference/api/latest/reference/ddb/put.html](https://docs.aws.amazon.com/cli/latest/reference/api/latest/reference/ddb/put.html) 和 [https://docs.aws.amazon.com/cli/latest/reference/api/latest/reference/ddb/select.html](https://docs.aws.amazon.com/cli/latest/reference/api/latest/reference/ddb/select.html)。这些命令提供了一个简化的界面，用于将项目放入 DynamoDB 表中以及在 DynamoDB 表或索引中进行搜索。

**[https://docs.aws.amazon.com/cli/latest/reference/logs/tail.html](https://docs.aws.amazon.com/cli/latest/reference/logs/tail.html)**  
AWS CLI 版本 2 具有自定义 `aws logs tail` 命令，用于跟踪 Amazon CloudWatch 日志组的日志。原定设置情况下，该命令从过去十分钟内所有关联的 CloudWatch Logs 流返回日志。

**[添加了对高级 `s3` 命令的元数据支持](cli-services-s3-commands.md#using-s3-commands-before-large)**  
AWS CLI 版本 2 将 `--copy-props` 参数添加到高级 `s3` 命令中。使用此参数，您可以为 Amazon Simple Storage Service (Amazon S3) 配置其他元数据和标签。

**[`AWS_REGION`](cli-configure-envvars.md#envvars-list-AWS_REGION)**  
AWS CLI 版本 2 有一个与 AWS SDK 兼容的环境变量，名为 `AWS_REGION`。此变量指定要向其发送请求的 AWS 区域。它覆盖 `AWS_DEFAULT_REGION` 环境变量，该变量仅适用于 AWS CLI。

## AWS CLI 版本 1 和 AWS CLI 版本 2 之间的突破性更改
<a name="cliv2-migration-changes-breaking"></a>

本节介绍 AWS CLI 版本 1 和 AWS CLI 版本 2 之间行为方面的所有变化。这些变化可能要求您更新脚本或命令，以便在版本 2 中获得与版本 1 中相同的行为。

**Topics**
+ [添加了用于设置文本文件编码的环境变量](#cliv2-migration-encodingenvvar)
+ [原定设置情况下，二进制参数作为 base64 编码字符串进行传递](#cliv2-migration-binaryparam)
+ [改进了执行分段复制时 Amazon S3 处理文件属性和标签的方式](#cliv2-migration-s3-copy-metadata)
+ [不自动检索 `http://` 或 `https://` URL 以获取参数](#cliv2-migration-paramfile)
+ [原定设置情况下，使用分页程序处理所有输出](#cliv2-migration-output-pager)
+ [时间戳输出值标准化为 ISO 8601 格式](#cliv2-migration-timestamp)
+ [改进了 CloudFormation 部署的处理，而这不会导致任何更改](#cliv2-migration-cfn)
+ [更改了区域 Amazon S3 端点对于 `us-east-1` 区域的原定设置行为](#cliv2-migration-s3-regional-endpoint)
+ [已更改区域 AWS STS 端点的原定设置行为](#cliv2-migration-sts-regional-endpoint)
+ [`ecr get-login` 已删除并替换为 `ecr get-login-password`](#cliv2-migration-ecr-get-login)
+ [AWS CLI 版本 2 对插件的支持会不断变化](#cliv2-migration-profile-plugins)
+ [已删除隐藏别名支持](#cliv2-migration-aliases)
+ [不支持 `api_versions` 配置文件设置](#cliv2-migration-api-versions)
+ [AWS CLI 版本 2 仅使用签名 v4 对 Amazon S3 请求进行身份验证](#cliv2-migration-sigv4)
+ [AWS CLI 版本 2 与分页参数更一致](#cliv2-migration-skeleton-paging)
+ [AWS CLI 版本 2 在所有命令间提供了更一致的返回代码](#cliv2-migration-return-codes)

### 添加了用于设置文本文件编码的环境变量
<a name="cliv2-migration-encodingenvvar"></a>

 原定设置情况下，[Blob](cli-usage-parameters-types.md#parameter-type-blob)的文本文件使用与已安装的区域设置相同的编码。由于 AWS CLI 版本 2 使用的是 Python 的嵌入式版本，因此，不支持 `PYTHONUTF8` 和 `PYTHONIOENCODING` 环境变量。要将文本文件的编码设置为不同于区域设置，请使用 `AWS_CLI_FILE_ENCODING` 环境变量。下面的示例将 AWS CLI 设置为在 Windows 上使用 `UTF-8` 打开文本文件。

```
AWS_CLI_FILE_ENCODING=UTF-8
```

有关更多信息，请参阅 [为 AWS CLI 配置环境变量](cli-configure-envvars.md)。

### 原定设置情况下，二进制参数作为 base64 编码字符串进行传递
<a name="cliv2-migration-binaryparam"></a>

在 AWS CLI 中，有些命令需要使用 [base64](https://wikipedia.org/wiki/Base64) 编码的字符串，其他命令则需要使用 UTF-8 编码的字节字符串。在 AWS CLI 版本 1 中，在两种编码字符串类型之间传递数据通常需要一些中间处理。AWS CLI 版本 2 使处理二进制参数更加一致，从而有助于更可靠地将值从一个命令传递到另一个命令。

原定设置情况下，AWS CLI 版本 2 将所有二进制输入和二进制输出参数作为 base64 编码字符串 `blobs`（二进制大型对象）进行传递。有关更多信息，请参阅 [Blob](cli-usage-parameters-types.md#parameter-type-blob)。

要恢复为 AWS CLI 版本 1 行为，请使用 `cli\$1binary\$1format` 文件配置或 `--cli-binary-format` 参数。

### 改进了执行分段复制时 Amazon S3 处理文件属性和标签的方式
<a name="cliv2-migration-s3-copy-metadata"></a>

当您使用 `aws s3` 命名空间中的 AWS CLI 版本 1 命令将文件从一个 S3 存储桶位置复制到另一个存储桶位置，并且该操作使用[分段复制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CopyingObjctsMPUapi.html)时，源对象中的任何文件属性都不会复制到目标对象。

原定设置情况下，AWS CLI 版本 2 中的相应命令将所有标签和某些属性从源副本传输到目标副本。与 AWS CLI 版本 1 相比较，这可能会导致对 Amazon S3 端点进行更多 AWS API 调用。要更改 AWS CLI 版本 2 中 `s3` 命令的原定设置行为，请使用 `--copy-props` 参数。

有关更多信息，请参阅 [分段复制中的文件属性和标签](cli-services-s3-commands.md#using-s3-commands-before-tags)。

### 不自动检索 `http://` 或 `https://` URL 以获取参数
<a name="cliv2-migration-paramfile"></a>

当参数值以 `http://` 或 `https://` 开头，但不使用返回的内容作为参数值时，AWS CLI 版本 2 不执行 `GET` 操作。因此，将从 AWS CLI 版本 2 中删除关联的命令行选项 `cli_follow_urlparam`。

如果您需要检索 URL 并将 URL 内容传递给参数值，我们建议您使用 `curl` 或类似的工具将 URL 的内容下载到本地文件。然后，使用 `file://` 语法读取该文件的内容，并将其用作参数值。

例如，以下命令不再尝试检索在 `http://www.example.com` 中找到的页面的内容，并将这些内容作为参数传递。相反，它将文字文本字符串 `https://example.com` 作为参数传递。

```
$ aws ssm put-parameter \
    --value http://www.example.com \
    --name prod.microservice1.db.secret \
    --type String 2
```

如果您需要检索 Web URL 的内容并将其用作参数，则可以在版本 2 中执行以下操作。

```
$ curl https://my.example.com/mypolicyfile.json -o mypolicyfile.json
$ aws iam put-role-policy \
    --policy-document file://./mypolicyfile.json \
    --role-name MyRole \
    --policy-name MyReadOnlyPolicy
```

在前面的示例中，`-o` 参数指示 `curl` 将文件保存在与源文件同名的当前文件夹中。第二个命令检索该下载文件的内容，并将内容作为 `--policy-document` 的值传递。

### 原定设置情况下，使用分页程序处理所有输出
<a name="cliv2-migration-output-pager"></a>

原定设置情况下，AWS CLI 版本 2 会通过操作系统的原定设置分页程序返回所有输出。此程序是 Linux 或 macOS 上的 [https://ss64.com/bash/less.html](https://ss64.com/bash/less.html) 程序，以及 Windows 上的 [https://docs.microsoft.com/windows-server/administration/windows-commands/more](https://docs.microsoft.com/windows-server/administration/windows-commands/more) 程序。这样，通过一次一页显示服务的输出，从而帮助您浏览大量输出。

您可以将 AWS CLI 版本 2 配置为使用其他分页程序或根本不使用分页程序。有关更多信息，请参阅 [客户端分页程序](cli-usage-pagination.md#cli-usage-pagination-clientside)。

### 时间戳输出值标准化为 ISO 8601 格式
<a name="cliv2-migration-timestamp"></a>

原定设置情况下，AWS CLI 版本 2 以 [ISO 8601 格式](https://wikipedia.org/wiki/ISO_8601)返回所有时间戳响应值。在 AWS CLI 版本 1 中，命令以 HTTP API 响应返回的任何格式返回时间戳值，而格式可能因服务而异。

要查看以由 HTTP API 响应返回的格式表示的时间戳，请在 `config` 文件中使用 `wire` 值。有关更多信息，请参阅 `cli\$1timestamp\$1format`。

### 改进了 CloudFormation 部署的处理，而这不会导致任何更改
<a name="cliv2-migration-cfn"></a>

原定设置情况下，在 AWS CLI 版本 1 中，如果您部署的 CloudFormation 模板未导致任何更改，则 AWS CLI 返回失败错误代码。如果您不认为这是一个错误，并希望您的脚本继续运行，这可能导致出现问题。在 AWS CLI 版本 1 中，可以通过添加返回 `0` 的标志 `-–no-fail-on-empty-changeset` 来解决此问题。

因为这是常见使用案例，所以，当部署没有导致更改并且操作返回空更改集时，AWS CLI 版本 2 原定设置为返回成功的退出代码 `0`。

要恢复到原始行为，请添加标志 `--fail-on-empty-changeset`。

### 更改了区域 Amazon S3 端点对于 `us-east-1` 区域的原定设置行为
<a name="cliv2-migration-s3-regional-endpoint"></a>

当您将 AWS CLI 版本 1 配置为使用 `us-east-1` 区域时，AWS CLI 使用物理托管在 `us-east-1` 区域中的全局 `s3.amazonaws.com` 端点。AWS CLI 版本 2 会在指定区域时使用真正的区域端点 `s3.us-east-1.amazonaws.com`。要强制 AWS CLI 版本 2 使用全局端点，您可以将命令的区域设置为 `aws-global`。

### 已更改区域 AWS STS 端点的原定设置行为
<a name="cliv2-migration-sts-regional-endpoint"></a>

原定设置情况下，AWS CLI 版本 2 会将所有 AWS Security Token Service (AWS STS) API 请求发送到当前配置的 AWS 区域的区域端点。

默认情况下，AWS CLI 版本 1 的 `1.42.0` 之前的任何发行版都会将 AWS STS 请求发送到全球 AWS STS 端点。您可以使用 [https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html#cli-config-sts_regional_endpoints](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-files.html#cli-config-sts_regional_endpoints) 设置来控制版本 1 中的此原定设置行为。

不低于 `1.42.0` 的任何版本都使用区域端点作为默认值，如果您要从这些较新的版本迁移到 AWS CLI 版本 2，则此行为将保持不变。

### `ecr get-login` 已删除并替换为 `ecr get-login-password`
<a name="cliv2-migration-ecr-get-login"></a>

AWS CLI 版本 2 将 `aws ecr get-login` 命令替换为 `aws ecr get-login-password` 命令，以改进与容器身份验证的自动集成。

`aws ecr get-login-password` 命令可降低在进程列表、shell 历史记录或其他日志文件中公开您的凭证的风险。它还提高了与 `docker login` 命令的兼容性，从而改善自动化处理的效果。

该 `aws ecr get-login-password` 命令在 AWS CLI 版本 1.17.10 及更高版本以及 AWS CLI 版本 2 中提供。为保持向后兼容性，较早的 `aws ecr get-login` 命令仍在 AWS CLI 版本 1 中可用。

使用 `aws ecr get-login-password` 命令，您可以替换以下用于检索密码的代码。

```
$ (aws ecr get-login --no-include-email)
```

要降低在 shell 历史记录或日志中公开密码的风险，请改用以下示例命令。在此示例中，密码会被直接传送给 `docker login` 命令，通过 `--password-stdin` 选项分配给密码参数。

```
$ aws ecr get-login-password | docker login --username AWS --password-stdin MY-REGISTRY-URL
```

有关更多信息，请参阅《AWS CLI 版本 2 参考指南》**中的 [https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html](https://docs.aws.amazon.com/cli/latest/reference/ecr/get-login-password.html)。

### AWS CLI 版本 2 对插件的支持会不断变化
<a name="cliv2-migration-profile-plugins"></a>

AWS CLI 版本 2 中的插件支持完全是暂时的，目的是在发布更新的稳定版插件接口之前帮助用户从 AWS CLI 版本 1 进行迁移。不保证某个特定的插件甚或是 AWS CLI 插件接口在未来版本的 AWS CLI 版本 2 中受支持。如果您依赖于插件，请务必锁定到 AWS CLI 的特定版本，并在升级时测试插件的功能。

要启用插件支持，请在 `~/.aws/config` 中创建 `[plugins]` 区段。

```
[plugins]
cli_legacy_plugin_path = <path-to-plugins>/python3.7/site-packages
<plugin-name> = <plugin-module>
```

在 `[plugins]` 区段中，定义 `cli_legacy_plugin_path` 变量并将其值设置为插件模块所在的 Python 站点包路径。然后，您可以通过提供插件名称 (`plugin-name`) 以及包含插件源代码的 Python 模块 (`plugin-module`) 的文件名，对插件进行配置。AWS CLI 会通过导入插件的 `plugin-module` 并调用插件的 `awscli_initialize` 函数来加载每个插件。

### 已删除隐藏别名支持
<a name="cliv2-migration-aliases"></a>

AWS CLI 版本 2 不再支持版本 1 中支持的以下隐藏别名。

在下表中，第一列显示适用于所有版本（包括 AWS CLI 版本 2）的服务、命令和参数。第二列显示不再适用于 AWS CLI 版本 2 的别名。


| 有效的服务、命令和参数 | 过时的别名 | 
| --- | --- | 
| cognito-identity create-identity-pool open-id-connect-provider-arns | open-id-connect-provider-ar-ns | 
| storagegateway describe-tapes tape-arns | tape-ar-ns | 
| storagegateway.describe-tape-archives.tape-arns | tape-ar-ns | 
| storagegateway.describe-vtl-devices.vtl-device-arns | vtl-device-ar-ns | 
| storagegateway.describe-cached-iscsi-volumes.volume-arns | volume-ar-ns | 
| storagegateway.describe-stored-iscsi-volumes.volume-arns | volume-ar-ns | 
| route53domains.view-billing.start-time | start | 
| deploy.create-deployment-group.ec2-tag-set | ec-2-tag-set | 
| deploy.list-application-revisions.s3-bucket | s-3-bucket | 
| deploy.list-application-revisions.s3-key-prefix | s-3-key-prefix | 
| deploy.update-deployment-group.ec2-tag-set | ec-2-tag-set | 
| iam.enable-mfa-device.authentication-code1 | authentication-code-1 | 
| iam.enable-mfa-device.authentication-code2 | authentication-code-2 | 
| iam.resync-mfa-device.authentication-code1 | authentication-code-1 | 
| iam.resync-mfa-device.authentication-code2 | authentication-code-2 | 
| importexport.get-shipping-label.street1 | street-1 | 
| importexport.get-shipping-label.street2 | street-2 | 
| importexport.get-shipping-label.street3 | street-3 | 
| lambda.publish-version.code-sha256 | code-sha-256 | 
| lightsail.import-key-pair.public-key-base64 | public-key-base-64 | 
| opsworks.register-volume.ec2-volume-id | ec-2-volume-id | 

### 不支持 `api_versions` 配置文件设置
<a name="cliv2-migration-api-versions"></a>

AWS CLI 版本 2 不支持通过使用 `api_versions` 配置文件设置调用较早版本的 AWS 服务 API。所有 AWS CLI 命令现在可调用端点当前支持的服务 API 的最新版本。

### AWS CLI 版本 2 仅使用签名 v4 对 Amazon S3 请求进行身份验证
<a name="cliv2-migration-sigv4"></a>

AWS CLI 版本 2 不支持使用较早的签名算法对发送到 Amazon S3 端点的服务请求进行加密身份验证。这种签名会在每个 Amazon S3 请求中自动发生，但仅支持[签名版本 4 签名流程](https://docs.aws.amazon.com/AmazonS3/latest/userguide/reference_aws-signing.html)。您无法配置签名版本。现在，所有 Amazon S3 存储桶预签名 URL 都只使用 Sigv4，最长有效期为一周。

### AWS CLI 版本 2 与分页参数更一致
<a name="cliv2-migration-skeleton-paging"></a>

在 AWS CLI 版本 1 中，如果您在命令行上指定分页参数，则会按预期关闭自动分页。但是，当您使用带有 `‐‐cli-input-json` 参数的文件指定分页参数时，并不会关闭自动分页，这可能会导致意外输出。无论您如何提供参数，AWS CLI 版本 2 都会关闭自动分页。

### AWS CLI 版本 2 在所有命令间提供了更一致的返回代码
<a name="cliv2-migration-return-codes"></a>

与 AWS CLI 版本 1 相比，AWS CLI 版本 2 在所有命令间更加一致，并正确返回适当的退出代码。我们还添加了退出代码 252、253 和 254。有关退出代码的更多信息，请参阅[AWS CLI 中的命令行返回代码](cli-usage-returncodes.md)。

如果您依赖于 AWS CLI 版本 1 使用返回代码值的方式，建议检查退出代码以确保您获得了预期的值。