本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
开始排查适用于 C++ 的 AWS SDK 中的运行时错误
在您学习使用适用于 C++ 的 AWS SDK 开发应用程序时,熟练使用 AWS 管理控制台和 AWS CLI 也很有用。遇到运行时错误时,这些工具可互换用于各种疑难解答和诊断场景。
以下教程将为您展示这些疑难解答和诊断任务的示例。它聚焦于 Access denied 错误,此错误可能因多种不同原因而发生。本教程通过示例说明如何确定该错误的实际原因,并重点介绍了两种可能的原因:当前用户的权限不正确以及当前用户无法访问某个资源。
获取项目源代码和可执行文件
-
从 GitHub 上的 AWS 代码示例存储库
中下载 Amazon S3 代码示例文件夹。 -
打开
delete_bucket.cpp,注意里面有两种方法:main()和DeleteBucket()。DeleteBucket()使用 SDK 删除存储桶。 -
使用适用于 C++ 的 AWS SDK 入门使用中介绍的相同构建步骤构建 Amazon S3 示例。构建过程会为每个源文件生成一个可执行文件。
-
打开命令提示符,进入构建系统生成可执行文件的文件夹。运行可执行文件
run_create_bucket(实际可执行文件名会因操作系统而异)。这会在您的账户中创建一个存储桶(这样您就有了一个可以删除的存储桶)。 -
在命令提示符下,运行可执行文件
run_delete_bucket。此示例需要一个参数,即,你想要删除的存储桶的名称。提供一个不正确的存储桶名称;现在故意在这个存储桶名称中制造一个拼写错误,这样我们就可以探索故障排除方法。 -
确认收到
Access Denied错误消息。收到Access Denied错误消息让您怀疑自己是否创建了一个对 Amazon S3 拥有完全权限的用户,接下来您需要验证这一点。
要安装 AWS CLI 并找到正在调用 AWS 的用户名
-
要在开发计算机上安装最新 AWS CLI,请参阅《AWS Command Line Interface 用户指南》中的安装 AWS CLI。
-
要验证 AWS CLI 是否正在运行,请打开命令提示符并运行命令
aws -\-version$aws -\-versionaws-cli/2.1.29 Python/3.8.8 Windows/10 exe/AMD64 prompt/off -
要获取实际调用 AWS 的用户名,请运行 AWS CLI 命令
aws sts get-caller-identity。在以下示例输出中,该用户名为 userX$aws sts get-caller-identity{ "UserId": "A12BCD34E5FGHI6JKLM", "Account": "1234567890987", "Arn": "arn:aws:iam::1234567890987:user/userX" }有很多方法可以指定凭证,但是如果您遵循AWS 使用 AWS 适用于 C++ 的 SDK 进行身份验证中的方法,则此用户名将来自您的 AWS 共享凭证文件。在此过程中,您向您的用户授予了 AmazonS3FullAccess 权限。
注意
通常,大多数 AWS CLI 命令都遵循以下语法结构:
$aws <command> <subcommand> [options and parameters]其中
command是服务,subcommand是在该服务上调用的方法。有关更多详细信息,请参阅《AWS Command Line Interface 用户指南》中的 AWS CLI 中的命令结构。
验证用户是否有权删除存储桶
-
打开 AWS 管理控制台
并登录。有关更多详细信息,请参阅 AWS 管理控制台入门。 -
在主导航栏中,对于搜索服务...,输入
IAM并从结果中选择 IAM 服务。 -
在控制面板侧栏或 IAM 资源下,选择用户。
-
从您的账户的可用用户表中,选择在上述过程中获得的用户名。
-
选择摘要页面的权限选项卡,在策略名称表下,选择 AmazonS3FullAccess。
-
查看策略摘要和 JSON 数据。验证此用户是否拥有使用 Amazon S3 服务的完整权限。
"Effect": "Allow", "Action": "s3:*", "Resource": "*"
这种排除法在排查问题可能的发生位置时十分常用。在本例中,您已验证用户确实具有正确的权限,因此问题一定出在其他方面。也就是说,由于您拥有访问存储桶的正确权限,因此 Access Denied 错误可能意味着您正在尝试访问不属于您的存储桶。在进行故障排除时,您接下来要查看提供给程序的存储桶名称,并注意到您的账户中不存在具有该名称的存储桶,因此您无法“访问”它。
更新代码示例,使其成功运行
-
回到
delete_bucket.cpp的main()函数中,使用枚举将区域更改为您的账户所在的区域。要找到您的账户所在区域,请登录到AWS 管理控制台,然后在右上角找到该区域。同样在main()中,将存储桶名称更改为您的账户中确实存在的存储桶。可通过多种方式查找当前存储桶名称:-
您可以使用同样存在于本代码示例文件夹中的
run_list_buckets可执行文件,通过编程方式获取您的存储桶名称。 -
或者,您也可以使用以下 AWS CLI 命令列出您的 Amazon S3 存储桶。
$aws s3 ls2022-01-05 14:27:48amzn-s3-demo-bucket -
或者,您也可以使用 AWS 管理控制台
。在主导航栏中,在搜索服务中...,输入 S3。“存储桶”页面列出了您账户的存储桶。
-
-
重新生成代码并运行更新的可执行文件
run_delete_bucket。 -
使用 AWS 管理控制台或 AWS CLI,验证您之前创建的 Amazon S3 存储桶是否已被删除。