

# 排查 AWS CLI 错误
<a name="cli-chap-troubleshooting"></a>

本节介绍常见错误和解决您的问题的故障排除步骤。建议首先进行[一般故障排除](#tshoot-general)。

**Contents**
+ [首先尝试的一般故障排除](#tshoot-general)
  + [检查您的 AWS CLI 命令格式](#general-formatting)
  + [检查您的 AWS CLI 命令正在使用的 AWS 区域](#general-region)
  + [确认您运行的是 AWS CLI 的最新版本](#general-latest)
  + [使用 `--debug` 选项](#general-debug)
  + [启用并审查 AWS CLI 命令历史记录日志](#tshoot-general-history)
  + [确认已配置 AWS CLI](#tshoot-general-config)
+ [找不到命令错误](#tshoot-install-not-found)
+ [“`aws --version`”命令返回的版本与您安装的版本不同](#tshoot-install-wrong-version)
+ [卸载 AWS CLI 后，“`aws --version`”命令返回一个版本](#tshoot-uninstall-1)
+ [AWS CLI 处理了参数名称不完整的命令](#tshoot-parameter-abbrev)
+ [访问被拒绝错误](#tshoot-access-denied)
+ [凭证无效和密钥错误](#tshoot-permissions-wrongcreds)
+ [签名与错误不匹配](#tshoot-signature-does-not-match)
+ [SSL 证书错误](#tshoot-certificate-verify-failed)
+ [JSON 无效错误](#tshoot-invalid-json)
+ [其他资源](#tshoot-resources)

## 首先尝试的一般故障排除
<a name="tshoot-general"></a>

如果您使用 AWS CLI 时收到错误或遇到问题，建议使用以下一般提示以帮助您进行故障排除。

[回到顶部](#cli-chap-troubleshooting-top)

### 检查您的 AWS CLI 命令格式
<a name="general-formatting"></a>

如果您收到一个错误，表明某个命令不存在，或者它无法识别文档指明可用的参数 (`Parameter validation failed`)，则您的命令可能格式不正确。我们建议您检查以下内容：
+ 检查命令是否存在拼写和格式错误。
+ 确认您的命令中[适用于您的终端的所有引号和转义](cli-usage-parameters-quoting-strings.md)都是正确的。
+ 生成 [AWS CLI 骨架](cli-usage-skeleton.md)以确认命令结构。
+ 对于 JSON，请参阅 [JSON 值的其他问题排查](#tshoot-invalid-json)。如果您在终端处理 JSON 格式时遇到问题，我们建议通过使用 [Blob 将 JSON 数据直接传递给 AWS CLI](cli-usage-parameters-types.md#parameter-type-blob)，以跳过终端的引号规则。

有关应该如何构造特定命令的更多信息，请参阅[《AWS CLI 版本 2 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)。

[回到顶部](#cli-chap-troubleshooting-top)

### 检查您的 AWS CLI 命令正在使用的 AWS 区域
<a name="general-region"></a>

**注意**  
使用 AWS CLI 时，必须明确指定或通过设置默认区域来指定 AWS 区域。有关您可以指定的所有 AWS 区域的列表，请参阅《Amazon Web Services 一般参考》**中的[AWS 区域和端点](https://docs.aws.amazon.com/general/latest/gr/rande.html)。AWS CLI 使用的 AWS 区域指示符与您在 AWS 管理控制台 URL 和服务端点中看到的名称相同。

如果 AWS 服务对您指定的 AWS 区域不可用，或者您的资源位于其他 AWS 区域，则可能会出现错误或意外结果。AWS 区域设置的优先顺序如下：
+ `--region` 命令行选项。
+ 与 SDK 兼容的 `AWS\$1REGION` 环境变量。
+ `AWS\$1DEFAULT\$1REGION` 环境变量。
+ [`region`](cli-configure-files.md#cli-config-region) 配置文件设置。

确认对您的资源使用了正确的 AWS 区域。

[回到顶部](#cli-chap-troubleshooting-top)

### 确认您运行的是 AWS CLI 的最新版本
<a name="general-latest"></a>

如果您收到一个错误，表明某个命令不存在，或者它无法识别[《AWS CLI 版本 2 参考指南》](https://docs.aws.amazon.com/cli/latest/reference/index.html)中指明可用的参数，请首先确认您的命令格式是否正确。如果格式正确，我们建议您升级到 AWS CLI 的最新版本。几乎每个工作日都发布 AWS CLI 的更新版本。这些新版本的 AWS 中引入了新的 AWS CLI 服务、功能和参数。获取这些新服务、功能或参数的唯一方式是升级到首次引入该元素后发布的版本。

如何更新您的 AWS CLI 版本取决于您最初安装它的方式，如[安装或更新最新版本的 AWS CLI](getting-started-install.md)中所述。

如果您使用了某个捆绑安装程序，则可能需要先删除现有安装，然后为您的操作系统下载并安装最新版本。

[回到顶部](#cli-chap-troubleshooting-top)

### 使用 `--debug` 选项
<a name="general-debug"></a>

如果 AWS CLI 报告一个您不能立即理解的错误，或者产生您不期望的结果，您可以通过使用 `--debug` 选项再次运行此命令，以获得有关该错误的更多详细信息。使用此选项，AWS CLI 会输出有关它处理命令所执行的每一步的详细信息。输出中的详细信息可以帮助您确定错误发生的时间，并提供错误从何处开始的线索。

您可以将输出发送到文本文件以供日后查看，或者按要求发送给 AWS 支持。

当您包含 `--debug` 选项时，一些详细信息包括：
+ 查找凭证
+ 解析提供的参数
+ 构建发送到 AWS 服务器的请求
+ 发送到的请求的内容AWS
+ 原始响应的内容
+ 带格式的输出

以下是使用和不使用 `--debug` 选项运行命令的示例。

```
$ aws iam list-groups --profile MyTestProfile
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "MyTestGroup",
            "GroupId": "AGPA0123456789EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:group/MyTestGroup",
            "CreateDate": "2019-08-12T19:34:04Z"
        }
    ]
}
```

```
$ aws iam list-groups --profile MyTestProfile --debug
2019-08-12 12:36:18,305 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.16.215 Python/3.7.3 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.12.205
2019-08-12 12:36:18,305 - MainThread - awscli.clidriver - DEBUG - Arguments entered to CLI: ['iam', 'list-groups', '--debug']
2019-08-12 12:36:18,305 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function add_scalar_parsers at 0x7fdf173161e0>
2019-08-12 12:36:18,305 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function register_uri_param_handler at 0x7fdf17dec400>
2019-08-12 12:36:18,305 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function inject_assume_role_provider_cache at 0x7fdf17da9378>
2019-08-12 12:36:18,307 - MainThread - botocore.credentials - DEBUG - Skipping environment variable credential check because profile name was explicitly set.
2019-08-12 12:36:18,307 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function attach_history_handler at 0x7fdf173ed9d8>
2019-08-12 12:36:18,308 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/iam/2010-05-08/service-2.json
2019-08-12 12:36:18,317 - MainThread - botocore.hooks - DEBUG - Event building-command-table.iam: calling handler <function add_waiters at 0x7fdf1731a840>
2019-08-12 12:36:18,320 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/iam/2010-05-08/waiters-2.json
2019-08-12 12:36:18,321 - MainThread - awscli.clidriver - DEBUG - OrderedDict([('path-prefix', <awscli.arguments.CLIArgument object at 0x7fdf171ac780>), ('marker', <awscli.arguments.CLIArgument object at 0x7fdf171b09e8>), ('max-items', <awscli.arguments.CLIArgument object at 0x7fdf171b09b0>)])
2019-08-12 12:36:18,322 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function add_streaming_output_arg at 0x7fdf17316510>
2019-08-12 12:36:18,322 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function add_cli_input_json at 0x7fdf17da9d90>
2019-08-12 12:36:18,322 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function unify_paging_params at 0x7fdf17328048>
2019-08-12 12:36:18,326 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/iam/2010-05-08/paginators-1.json
2019-08-12 12:36:18,326 - MainThread - awscli.customizations.paginate - DEBUG - Modifying paging parameters for operation: ListGroups
2019-08-12 12:36:18,326 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function add_generate_skeleton at 0x7fdf1737eae8>
2019-08-12 12:36:18,326 - MainThread - botocore.hooks - DEBUG - Event before-building-argument-table-parser.iam.list-groups: calling handler <bound method OverrideRequiredArgsArgument.override_required_args of <awscli.customizations.cliinputjson.CliInputJSONArgument object at 0x7fdf171b0a58>>
2019-08-12 12:36:18,327 - MainThread - botocore.hooks - DEBUG - Event before-building-argument-table-parser.iam.list-groups: calling handler <bound method GenerateCliSkeletonArgument.override_required_args of <awscli.customizations.generatecliskeleton.GenerateCliSkeletonArgument object at 0x7fdf171c5978>>
2019-08-12 12:36:18,327 - MainThread - botocore.hooks - DEBUG - Event operation-args-parsed.iam.list-groups: calling handler functools.partial(<function check_should_enable_pagination at 0x7fdf17328158>, ['marker', 'max-items'], {'max-items': <awscli.arguments.CLIArgument object at 0x7fdf171b09b0>}, OrderedDict([('path-prefix', <awscli.arguments.CLIArgument object at 0x7fdf171ac780>), ('marker', <awscli.arguments.CLIArgument object at 0x7fdf171b09e8>), ('max-items', <awscli.customizations.paginate.PageArgument object at 0x7fdf171c58d0>), ('cli-input-json', <awscli.customizations.cliinputjson.CliInputJSONArgument object at 0x7fdf171b0a58>), ('starting-token', <awscli.customizations.paginate.PageArgument object at 0x7fdf171b0a20>), ('page-size', <awscli.customizations.paginate.PageArgument object at 0x7fdf171c5828>), ('generate-cli-skeleton', <awscli.customizations.generatecliskeleton.GenerateCliSkeletonArgument object at 0x7fdf171c5978>)]))
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.path-prefix: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.marker: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.max-items: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.cli-input-json: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.starting-token: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.page-size: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.generate-cli-skeleton: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,329 - MainThread - botocore.hooks - DEBUG - Event calling-command.iam.list-groups: calling handler <bound method CliInputJSONArgument.add_to_call_parameters of <awscli.customizations.cliinputjson.CliInputJSONArgument object at 0x7fdf171b0a58>>
2019-08-12 12:36:18,329 - MainThread - botocore.hooks - DEBUG - Event calling-command.iam.list-groups: calling handler <bound method GenerateCliSkeletonArgument.generate_json_skeleton of <awscli.customizations.generatecliskeleton.GenerateCliSkeletonArgument object at 0x7fdf171c5978>>
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role-with-web-identity
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: shared-credentials-file
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials
2019-08-12 12:36:18,330 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/endpoints.json
2019-08-12 12:36:18,334 - MainThread - botocore.hooks - DEBUG - Event choose-service-name: calling handler <function handle_service_name_alias at 0x7fdf1898eb70>
2019-08-12 12:36:18,337 - MainThread - botocore.hooks - DEBUG - Event creating-client-class.iam: calling handler <function add_generate_presigned_url at 0x7fdf18a028c8>
2019-08-12 12:36:18,337 - MainThread - botocore.regions - DEBUG - Using partition endpoint for iam, us-west-2: aws-global
2019-08-12 12:36:18,337 - MainThread - botocore.args - DEBUG - The s3 config key is not a dictionary type, ignoring its value of: None
2019-08-12 12:36:18,340 - MainThread - botocore.endpoint - DEBUG - Setting iam timeout as (60, 60)
2019-08-12 12:36:18,341 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/_retry.json
2019-08-12 12:36:18,341 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: iam
2019-08-12 12:36:18,342 - MainThread - botocore.hooks - DEBUG - Event before-parameter-build.iam.ListGroups: calling handler <function generate_idempotent_uuid at 0x7fdf189b10d0>
2019-08-12 12:36:18,342 - MainThread - botocore.hooks - DEBUG - Event before-call.iam.ListGroups: calling handler <function inject_api_version_header_if_needed at 0x7fdf189b2a60>
2019-08-12 12:36:18,343 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=ListGroups) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.16.215 Python/3.7.3 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.12.205'}, 'body': {'Action': 'ListGroups', 'Version': '2010-05-08'}, 'url': 'https://iam.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7fdf16e9a4a8>, 'has_streaming_input': False, 'auth_type': None}}
2019-08-12 12:36:18,343 - MainThread - botocore.hooks - DEBUG - Event request-created.iam.ListGroups: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x7fdf16e9a470>>
2019-08-12 12:36:18,343 - MainThread - botocore.hooks - DEBUG - Event choose-signer.iam.ListGroups: calling handler <function set_operation_specific_signer at 0x7fdf18996f28>
2019-08-12 12:36:18,343 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth.
2019-08-12 12:36:18,343 - MainThread - botocore.auth - DEBUG - CanonicalRequest:
POST
/

content-type:application/x-www-form-urlencoded; charset=utf-8
host:iam.amazonaws.com
x-amz-date:20190812T193618Z

content-type;host;x-amz-date
5f776d91EXAMPLE9b8cb5eb5d6d4a787a33ae41c8cd6eEXAMPLEca69080e1e1f
2019-08-12 12:36:18,344 - MainThread - botocore.auth - DEBUG - StringToSign:
AWS4-HMAC-SHA256
20190812T193618Z
20190812/us-east-1/iam/aws4_request
ab7e367eEXAMPLE2769f178ea509978cf8bfa054874b3EXAMPLE8d043fab6cc9
2019-08-12 12:36:18,344 - MainThread - botocore.auth - DEBUG - Signature:
d85a0EXAMPLEb40164f2f539cdc76d4f294fe822EXAMPLE18ad1ddf58a1a3ce7
2019-08-12 12:36:18,344 - MainThread - botocore.endpoint - DEBUG - Sending http request: <AWSPreparedRequest stream_output=False, method=POST, url=https://iam.amazonaws.com/, headers={'Content-Type': b'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': b'aws-cli/1.16.215 Python/3.7.3 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.12.205', 'X-Amz-Date': b'20190812T193618Z', 'Authorization': b'AWS4-HMAC-SHA256 Credential=AKIA01234567890EXAMPLE-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=d85a07692aceb401EXAMPLEa1b18ad1ddf58a1a3ce7EXAMPLE', 'Content-Length': '36'}>
2019-08-12 12:36:18,344 - MainThread - urllib3.util.retry - DEBUG - Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)
2019-08-12 12:36:18,344 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): iam.amazonaws.com:443
2019-08-12 12:36:18,664 - MainThread - urllib3.connectionpool - DEBUG - https://iam.amazonaws.com:443 "POST / HTTP/1.1" 200 570
2019-08-12 12:36:18,664 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amzn-RequestId': '74c11606-bd38-11e9-9c82-559da0adb349', 'Content-Type': 'text/xml', 'Content-Length': '570', 'Date': 'Mon, 12 Aug 2019 19:36:18 GMT'}
2019-08-12 12:36:18,664 - MainThread - botocore.parsers - DEBUG - Response body:
b'<ListGroupsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">\n  <ListGroupsResult>\n    <IsTruncated>false</IsTruncated>\n    <Groups>\n      <member>\n        <Path>/</Path>\n        <GroupName>MyTestGroup</GroupName>\n        <Arn>arn:aws:iam::123456789012:group/MyTestGroup</Arn>\n        <GroupId>AGPA1234567890EXAMPLE</GroupId>\n        <CreateDate>2019-08-12T19:34:04Z</CreateDate>\n      </member>\n    </Groups>\n  </ListGroupsResult>\n  <ResponseMetadata>\n    <RequestId>74c11606-bd38-11e9-9c82-559da0adb349</RequestId>\n  </ResponseMetadata>\n</ListGroupsResponse>\n'
2019-08-12 12:36:18,665 - MainThread - botocore.hooks - DEBUG - Event needs-retry.iam.ListGroups: calling handler <botocore.retryhandler.RetryHandler object at 0x7fdf16e9a780>
2019-08-12 12:36:18,665 - MainThread - botocore.retryhandler - DEBUG - No retry needed.
2019-08-12 12:36:18,665 - MainThread - botocore.hooks - DEBUG - Event after-call.iam.ListGroups: calling handler <function json_decode_policies at 0x7fdf189b1d90>
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "MyTestGroup",
            "GroupId": "AGPA123456789012EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:group/MyTestGroup",
            "CreateDate": "2019-08-12T19:34:04Z"
        }
    ]
}
```

[回到顶部](#cli-chap-troubleshooting-top)

### 启用并审查 AWS CLI 命令历史记录日志
<a name="tshoot-general-history"></a>

您可以使用 AWS CLI 文件设置启用 `cli\$1history` 命令历史记录日志。启用此设置后，AWS CLI 记录 `aws` 命令的历史记录。

您可以使用 `aws history list` 命令列出您的历史记录，然后使用 `aws history show` 命令中生成的 command\$1id 获取详细信息。有关更多信息，请参阅《AWS CLI 参考指南》**中的 [https://docs.aws.amazon.com/cli/latest/reference/history/index.html](https://docs.aws.amazon.com/cli/latest/reference/history/index.html)。

当您包含 `--debug` 选项时，一些详细信息包括：
+ 针对 botocore 的 API 调用
+ 状态代码
+ HTTP 响应
+ 标头
+ 返回代码

您可以使用此信息来确认参数数据和 API 调用是否按预期方式运行，然后可以推断出您的命令在哪个步骤失败。

[回到顶部](#cli-chap-troubleshooting-top)

### 确认已配置 AWS CLI
<a name="tshoot-general-config"></a>

如果您的 `config` 和 `credentials` 文件或您的 IAM 用户或角色未得以正确配置，可能发生各种错误。有关解决 `config` 和 `credentials` 文件或您的 IAM 用户或角色的错误的更多信息，请参阅[访问被拒绝错误](#tshoot-access-denied)和[凭证无效和密钥错误](#tshoot-permissions-wrongcreds)。

[回到顶部](#cli-chap-troubleshooting-top)

## 找不到命令错误
<a name="tshoot-install-not-found"></a>

此错误意味着操作系统找不到 AWS CLI 命令。安装可能不完整或需要更新。

**可能的原因：您正在尝试使用的 AWS CLI 功能比您安装的版本更高，或者格式不正确**  
*错误示例文本：*  

```
$ aws s3 copy
aws: [ERROR]: argument operation: Found invalid choice 'copy'

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

  aws help
  aws <command> help
  aws <command> <subcommand> help
```
如果命令格式不正确，或者您使用的是发布此功能之前的早期版本，可能会发生各种错误。有关解决围绕这两个问题的错误的更多信息，请参阅[检查您的 AWS CLI 命令格式](#general-formatting)和[确认您运行的是 AWS CLI 的最新版本](#general-latest)。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：安装后需要重新启动终端**  
*错误示例文本：*  

```
$ aws --version
command not found: aws
```
如果第一次安装或更新 AWS CLI 后找不到 `aws` 命令，您可能需要重新启动终端以便它识别任何 `PATH` 更新。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：AWS CLI 未完全安装**  
*错误示例文本：*  

```
$ aws --version
command not found: aws
```
如果第一次安装或更新 AWS CLI 后找不到 `aws` 命令，它可能尚未完全安装。按照 [安装或更新最新版本的 AWS CLI](getting-started-install.md) 中适用于您的平台的步骤尝试重新安装。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：AWS CLI 没有权限 (Linux)**  
如果第一次在 Linux 安装或更新 `aws` 后找不到 AWS CLI 命令，可能是没有安装文件夹的 `execute` 权限。使用 `PATH` 对您的 AWS CLI 安装运行以下命令，以将 `[chmod](https://en.wikipedia.org/wiki/Chmod)` 权限提供给 AWS CLI：  

```
$ sudo chmod -R 755 /usr/local/aws-cli/
```
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：安装期间未更新操作系统 `PATH`。**  
*错误示例文本：*  

```
$ aws --version
command not found: aws
```
您可能需要将 `aws` 可执行文件添加到操作系统的 `PATH` 环境变量中。要将 AWS CLI 添加到 `PATH`，请按照适用于您的操作系统的以下说明操作。  

1. 在您的用户目录中查找 Shell 的配置文件脚本。如果您不能确定所使用的 Shell，请运行 `echo $SHELL`。

   ```
   $ ls -a ~
   .  ..  .bash_logout  .bash_profile  .bashrc  Desktop  Documents  Downloads
   ```
   + **Bash**：`.bash_profile`、`.profile` 或 `.bash_login`
   + **Zsh** – `.zshrc`
   + **Tcsh**：`.tcshrc`、`.cshrc` 或 `.login`

1. 向配置文件脚本中添加导出命令。以下命令将您的本地 bin 添加到当前 `PATH` 变量。

   ```
   export PATH=/usr/local/bin:$PATH
   ```

1. 将更新的配置文件重新加载到当前会话中。

   ```
   $ source ~/.bash_profile
   ```

1. 在 Windows 命令提示符下，使用带 `/R path` 参数的 `where` 命令来查找 `aws` 文件位置。结果将返回所有包含 `aws` 的文件夹。

   ```
   C:\> where /R c:\ aws
   c:\Program Files\Amazon\AWSCLIV2\aws.exe
   ...
   ```

   默认情况下，AWS CLI 版本 2 位于：

   ```
   c:\Program Files\Amazon\AWSCLIV2\aws.exe
   ```

1. 按 Windows 键并输入 **environment variables**。

1. 从建议列表中，选择 **Edit environment variables for your account**（编辑您账户的环境变量）。

1. 选择 **PATH**，然后选择 **Edit**（编辑）。

1. 将在第一步中找到的路径添加到 **Variable value**（变量值）字段中，例如 ***C:\$1Program Files\$1Amazon\$1AWSCLIV2\$1aws.exe***。

1. 选择 **OK**（确定）两次以应用新设置。

1. 关闭任何运行的命令提示符并重新打开命令提示符窗口。

[回到顶部](#cli-chap-troubleshooting-top)

## “`aws --version`”命令返回的版本与您安装的版本不同
<a name="tshoot-install-wrong-version"></a>

您的终端可能为 AWS CLI 返回的 `PATH` 与您预期的不同。

**可能的原因：安装后需要重新启动终端**  
如果 `aws` 命令显示错误的版本，您可能需要重新启动终端以便它识别任何 `PATH` 更新。需要关闭所有打开的终端，而不仅仅是活动的终端。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：安装后需要重新启动系统**  
如果 `aws` 命令显示了错误的版本，并且重新启动终端不起作用，您可能需要重新启动系统，系统才能识别您的 `PATH` 更新。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您有多个 AWS CLI 版本**  
如果您更新了 AWS CLI 并且使用了与预先存在的安装不同的安装方法，可能会导致安装多个版本。例如，如果您在 Linux 或 macOS 上使用 `pip` 进行了当前安装，但试图使用 `.pkg` 安装文件进行更新，这可能会导致一些冲突，尤其是当 `PATH` 指向旧版本时。  
要解决这个问题，[请卸载 AWS CLI 的所有版本](#tshoot-uninstall-multiple-version)，然后执行净安装。  
卸载所有版本后，请按照适用于您的操作系统的说明安装所需版本：[AWS CLI 版本 1](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) 或 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。  
如果您在预安装了 AWS CLI 版本 1 的情况下安装了 AWS CLI 版本 2 之后发生这种情况，请遵循中的迁移说明进行操作[从 AWS CLI 版本 1 安装 AWS CLI 版本 2](cliv2-migration-instructions.md)。
[回到顶部](#cli-chap-troubleshooting-top)

## 卸载 AWS CLI 后，“`aws --version`”命令返回一个版本
<a name="tshoot-uninstall-1"></a>

当系统中的某个位置仍安装了 AWS CLI 时，通常会发生这种情况。

**可能的原因：卸载后需要重新启动终端**  
如果 `aws --version` 命令仍然有效，您可能需要重新启动终端以便它识别任何终端更新。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：系统上有多个 AWS CLI 版本，或者您没有使用与最初安装 AWS CLI 所用的相同卸载方法**  
如果使用与安装 AWS CLI 所用的不同方法卸载它，或者您安装了多个版本，则可能无法正确卸载 AWS CLI。例如，如果您使用 `pip` 执行了当前安装，则必须使用 `pip` 卸载它。要解决此问题，请使用与安装 AWS CLI 所用的相同方法执行卸载。  

1. 按照适用于您的操作系统的说明和原始安装方法卸载 [AWS CLI 版本 1](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) 和 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/uninstall.html)。

1. 关闭所有打开的终端。

1. 打开首选终端，输入以下命令并确认没有返回任何版本。

   ```
   $ aws --version
   command not found: aws
   ```

   如果输出中仍列出一个版本，很可能 AWS CLI 是使用不同的方法安装的，或者有多个版本。如果您不知道安装 AWS CLI 时采用的是哪种方法，请按照适用于您的操作系统的 [AWS CLI 版本 1](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) 和 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/uninstall.html) 的每种卸载方法的说明进行操作，直至不会收到任何版本输出。
**注意**  
如果您是使用软件包管理器（`pip`、`apt`、`brew` 等）安装 AWS CLI 的，则必须使用同一个软件包管理器来卸载它。请务必按照软件包管理器提供的有关如何卸载软件包的所有版本的说明进行操作。
[回到顶部](#cli-chap-troubleshooting-top)

## AWS CLI 处理了参数名称不完整的命令
<a name="tshoot-parameter-abbrev"></a>

**可能的原因：您使用了普遍接受的 AWS CLI 参数缩写**  
由于 AWS CLI 是使用 Python 构建的，因此 AWS CLI 使用 Python `argparse` 库，包括 [https://docs.python.org/3/library/argparse.html#allow-abbrev](https://docs.python.org/3/library/argparse.html#allow-abbrev) 参数。AWS CLI 可识别并处理参数的缩写。  
以下 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) 命令示例更改 CloudFormation 堆栈名称。参数 `--change-set-n` 被识别为 `--change-set-name` 的缩写，然后 AWS CLI 处理命令。  

```
$ aws cloudformation create-change-set --stack-name my-stack --change-set-n my-change-set
```
当您的缩写可能代表多个命令时，参数将不会被识别为缩写。  
以下 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) 命令示例更改 CloudFormation 堆栈名称。参数 `--change-set-` **无法**识别为缩写，因为它可以是多个参数（例如 `--change-set-name` 和 `--change-set-type`）的缩写。因此，AWS CLI **不会**处理该命令。  

```
$ aws cloudformation create-change-set --stack-name my-stack --change-set- my-change-set
```
**不要**刻意使用参数缩写。缩写不可靠且不向后兼容。如果在命令中添加了任何会使缩写产生混淆的新参数，则会中断您的命令。  
此外，如果参数是单值参数，则会导致命令出现意外行为。如果传递了单值参数的多个实例，则只有最后一个实例会运行。在以下示例中，参数 `--filters` 是单值参数。指定了参数 `--filters` 和 `--filter`。`--filter` 参数是 `--filters` 的缩写。这会导致应用 `--filters` 的两个实例，只有最后一个 `--filter` 参数会应用。  

```
$ aws ec2 describe-vpc-peering-connections \
    --filters Name=tag:TagName,Values=VpcPeeringConnection \
    --filter Name=status-code,Values=active
```
在运行命令之前，请确认您使用的是有效参数，以防止出现意外行为。
[回到顶部](#cli-chap-troubleshooting-top)

## 访问被拒绝错误
<a name="tshoot-access-denied"></a>

**可能的原因：AWS CLI 程序文件没有“运行”权限**  
在 Linux 或 macOS 上，确保 `aws` 程序具有发出调用的用户的运行权限。通常，权限设置为 `755`。  
要添加用户的运行权限，请运行以下命令，并将 *\$1/.local/bin/aws* 替换为您计算机上指向此程序的路径。  

```
$ chmod +x ~/.local/bin/aws
```
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您的 IAM 身份没有执行此操作的权限**  
*错误示例文本：*  

```
$ aws s3 ls
An error occurred (AcessDenied) when calling the ListBuckets operation: Access denied.
```
当您运行 AWS CLI 命令时，使用将您与 IAM 账户或角色关联的凭证代表您执行 AWS 操作。附加的策略必须向您授予权限，才能调用与通过 AWS CLI 运行的命令相对应的 API 操作。  
大多数命令会通过一个与命令名称匹配的名称来调用单个操作。但是，像 `aws s3 sync` 这样的自定义命令会调用多个 API。您可以查看命令通过使用 `--debug` 选项调用哪些 API。  
如果您确定用户或角色具有策略所分配的适当权限，确保您的 AWS CLI 命令使用的是您预期的凭证。请参阅[下一节中有关凭证的内容](#tshoot-permissions-wrongcreds)以验证 AWS CLI 使用的是您预期的凭证。  
有关分配 IAM 权限的信息，请参阅《IAM 用户指南》**中的[访问管理概述：权限和策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_access-management.html)。  
[回到顶部](#cli-chap-troubleshooting-top)

## 凭证无效和密钥错误
<a name="tshoot-permissions-wrongcreds"></a>

*错误示例文本：*

```
$ aws s3 ls
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id 
you provided does not exist in our records.
```

```
$ aws s3 ls
An error occurred (InvalidClientTokenId) when calling the ListBuckets operation: The security token 
included in the request is invalid.
```

**可能的原因：AWS CLI 从意外位置读取了不正确的凭证**  
AWS CLI 读取凭证的位置可能与您的预期不同，或者密钥对信息不正确。您可以运行 `aws configure list` 以确认使用哪些凭证。  
以下示例说明如何检查用于默认配置文件的凭证。  

```
$ aws configure list
NAME       : VALUE                : TYPE                    : LOCATION
profile    : <not set>            : None                    : None
access_key : ****************ABCD : shared-credentials-file : 
secret_key : ****************ABCD : shared-credentials-file : 
region     : us-west-2            : env                     : AWS_DEFAULT_REGION
```
以下示例说明如何检查命名配置文件的凭证。  

```
$ aws configure list --profile dev01
NAME       : VALUE                : TYPE                    : LOCATION
profile    : dev01                : None                    : --profile
access_key : ****************ABCD : shared-credentials-file : 
secret_key : ****************ABCD : shared-credentials-file : 
region     : us-west-2            : config-file             : ~/.aws/config
```
要确认密钥对详细信息，请检查 `config` 和 `credentials` 文件。有关 `config` 和 `credentials` 文件的更多信息，请参阅[AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。有关凭证和身份验证（包括凭证优先顺序）的更多信息，请参阅[AWS CLI 身份验证和访问凭证](cli-chap-authentication.md)。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您计算机的时钟不同步**  
如果您使用的凭证是有效的，则可能是您的时钟不同步。在 Linux 或 macOS 上，运行 `date` 以检查时间。  

```
$ date
```
如果您的系统时钟在几分钟内不正确，则使用 `ntpd` 进行同步。  

```
$ sudo service ntpd stop
$ sudo ntpdate time.nist.gov
$ sudo service ntpd start
$ ntpstat
```
在 Windows 上，使用控制面板中的日期和时间选项来配置系统时钟。  
[回到顶部](#cli-chap-troubleshooting-top)

## 签名与错误不匹配
<a name="tshoot-signature-does-not-match"></a>

*错误示例文本：*

```
$ aws s3 ls
An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation: The request signature we 
calculated does not match the signature you provided. Check your key and signing method.
```

当 AWS CLI 运行命令时，它会向 AWS 服务器发送加密请求以执行适当的 AWS 服务操作。您的凭证（访问密钥和私有密钥）参与了加密过程，使 AWS 能够对发出请求的人员进行身份验证。有多种因素可能会干扰此过程的正常执行，如下所示。

**可能的原因：您的时钟与 AWS 服务器不同步**  
为了帮助防范[重播攻击](https://wikipedia.org/wiki/Replay_attack)，在加密/解密过程中可能会使用当前时间。如果客户端和服务器的时间不一致超出允许的时间量，该过程可能会失败，并且请求会被拒绝。当您在其时钟与主机时钟不同步的虚拟机中运行命令时，也可能发生此错误。一个可能的原因是，当虚拟机休眠时，唤醒后需要一些时间才能将时钟与主机同步。  
在 Linux 或 macOS 上，运行 `date` 以检查时间。  

```
$ date
```
如果您的系统时钟在几分钟内不正确，则使用 `ntpd` 进行同步。  

```
$ sudo service ntpd stop
$ sudo ntpdate time.nist.gov
$ sudo service ntpd start
$ ntpstat
```
在 Windows 上，使用控制面板中的日期和时间选项来配置系统时钟。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：操作系统错误地处理了包含某些特殊字符的 AWS 密钥**  
如果 AWS 密钥包含某些特殊字符（例如 `-`、`+`、`/` 或 `%`），则某些操作系统变体会不正确地处理该字符串，并导致对该密钥字符串的解释不正确。  
如果使用其他工具或脚本（例如，在创建新实例期间在其上构建凭证文件的工具）处理密钥，则这些工具和脚本可能有自己对特殊字符的处理，这会导致将这些字符转换为 AWS 不再识别的内容。  
我们建议重新生成私有密钥，以使获得的私有密钥不包含会导致问题的特殊字符。  
[回到顶部](#cli-chap-troubleshooting-top)

## SSL 证书错误
<a name="tshoot-certificate-verify-failed"></a>

**可能的原因：AWS CLI 不信任您的代理的证书**  
*错误示例文本：*  

```
$ aws s3 ls
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
```
当您使用 AWS CLI 命令时，您收到 `[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed` 错误消息。这是因为 AWS CLI 不信任代理的证书，原因包括代理的证书是自签名的，而您的公司却设置为证书颁发机构 (CA)。这会致使 AWS CLI 无法在本地 CA 注册机构中找到您的公司 CA 根证书。  
要解决这个问题，请指示 AWS CLI 使用 `ca\$1bundle` 配置文件设置、**[--ca-bundle](cli-configure-options.md#cli-configure-options-ca-bundle)** 命令行选项或 `AWS\$1CA\$1BUNDLE` 环境变量在何处查找公司 `.pem` 文件。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您的配置未指向正确的 CA 根证书位置**  
*错误示例文本：*  

```
$ aws s3 ls
SSL validation failed for regionname [Errno 2] No such file or directory
```
这是由于您的证书颁发机构 (CA)捆绑包文件位置在 AWS CLI 中配置不正确所致。要解决此问题，请确认您的公司 `.pem` 文件所在的位置，并使用 `ca\$1bundle` 配置文件设置、**[--ca-bundle](cli-configure-options.md#cli-configure-options-ca-bundle)** 命令行选项或 `AWS\$1CA\$1BUNDLE` 环境变量更新 AWS CLI 配置。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您的配置使用了错误的 AWS 区域**  
*错误文本示例：*  

```
$ aws s3 ls
[SSL: CERTIFICATE_ VERIFY_FAILED] certificate verify failed
```
如果 AWS 服务对您指定的 AWS 区域不可用，或者您的资源位于其他 AWS 区域，则可能会出现错误或意外结果。有关问题排查步骤，请参阅[检查您的 AWS CLI 命令正在使用的 AWS 区域](#general-region)。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您的 TLS 版本需要更新 **  
*错误文本示例*：  

```
$ aws s3 ls
[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled
```
AWS 服务使用的 TLS 版本与您设备的 TLS 版本不兼容。要解决此问题，请更新到受支持的 TLS 版本。有关更多信息，请参阅 [强制在 AWS CLI 中实施最低 TLS 版本](cli-security-enforcing-tls.md)。  
[回到顶部](#cli-chap-troubleshooting-top)

## JSON 无效错误
<a name="tshoot-invalid-json"></a>

*错误文本示例：*

```
$ aws dynamodb update-table \
    --provisioned-throughput '{"ReadCapacityUnits":15,WriteCapacityUnits":10}' \
    --table-name MyDDBTable
Error parsing parameter '--provisioned-throughput': Invalid JSON: Expecting property name enclosed in 
double quotes: line 1 column 25 (char 24)
JSON received: {"ReadCapacityUnits":15,WriteCapacityUnits":10}
```

当您使用 AWS CLI 命令时，您收到“`Invalid JSON`”错误消息。这通常是在您输入具有预期 JSON 格式的命令而 AWS CLI 无法正确读取您的 JSON 时出现的错误。

**可能的原因：您没有输入有效的 JSON 供 AWS CLI 使用**  
确认您为命令输入了有效的 JSON。我们建议您对格式设置遇到问题的 JSON 使用 JSON 验证器。  
要在命令行中使用更高级的 JSON，请考虑使用 `jq` 等命令行 JSON 处理器来创建 JSON 字符串。有关 `jq` 的更多信息，请参阅 *GitHub* 上的 [jq 存储库](http://stedolan.github.io/jq/)。  
[回到顶部](#cli-chap-troubleshooting-top)

**可能的原因：您的终端的引号规则阻止将有效的 JSON 发送到 AWS CLI**  
在 AWS CLI 从命令接收任何内容之前，终端使用它自己的引号和转义规则来处理该命令。由于终端的格式设置规则，您的某些 JSON 内容可能会在命令传递给 AWS CLI 之前剥离掉。在构建命令时，请务必使用[终端的引号规则](cli-usage-parameters-quoting-strings.md)。  
要进行故障排除，请使用 `echo` 命令来查看 Shell 如何处理您的参数：  

```
$ echo {"ReadCapacityUnits":15,"WriteCapacityUnits":10}
ReadCapacityUnits:15 WriteCapacityUnits:10
```

```
$ echo '{"ReadCapacityUnits":15,"WriteCapacityUnits":10}'
{"ReadCapacityUnits":15,"WriteCapacityUnits":10}
```
修改您的命令，直到返回有效的 JSON。  
要进行更深入的故障排除，请使用 `--debug` 参数来查看调试日志，因为它们将确切地显示传递给 AWS CLI 的内容：  

```
$ aws dynamodb update-table \
    --provisioned-throughput '{"ReadCapacityUnits":15,WriteCapacityUnits":10}' \
    --table-name MyDDBTable \
    --debug
2022-07-19 22:25:07,741 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.18.147 
Python/2.7.18 Linux/5.4.196-119.356.amzn2int.x86_64 botocore/1.18.6
2022-07-19 22:25:07,741 - MainThread - awscli.clidriver - DEBUG - Arguments entered to CLI: 
['dynamodb', 'update-table', '--provisioned-throughput', '{"ReadCapacityUnits":15,WriteCapacityUnits":10}',
 '--table-name', 'MyDDBTable', '--debug']
```
使用终端的引号规则来修复 JSON 输入在发送到 AWS CLI 时出现的任何问题。有关引号规则的更多信息，请参阅[在 AWS CLI 中将引号和文本与字符串结合使用](cli-usage-parameters-quoting-strings.md)。  
如果您在将有效的 JSON 发送到 AWS CLI 时遇到问题，我们建议您使用 BLOB 将 JSON 数据直接发送到 AWS CLI，从而绕过终端对 JSON 数据输入的引号规则。有关 Blob 的更多信息，请参阅[Blob](cli-usage-parameters-types.md#parameter-type-blob)。
[回到顶部](#cli-chap-troubleshooting-top)

## 其他资源
<a name="tshoot-resources"></a>

有关 AWS CLI 问题的其他帮助，请访问 *GitHub* 上的 [AWS CLI 社区](https://github.com/aws/aws-cli/issues)，或者访问 [AWS re:Post 社区](https://repost.aws/)。

[回到顶部](#cli-chap-troubleshooting-top)