开始排查适用于 C++ 的 AWS SDK 中的运行时错误 - 适用于 C++ 的 AWS SDK

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

开始排查适用于 C++ 的 AWS SDK 中的运行时错误

在您学习使用适用于 C++ 的 AWS SDK 开发应用程序时,熟练使用 AWS 管理控制台和 AWS CLI 也很有用。遇到运行时错误时,这些工具可互换用于各种疑难解答和诊断场景。

以下教程将为您展示这些疑难解答和诊断任务的示例。它聚焦于 Access denied 错误,此错误可能因多种不同原因而发生。本教程通过示例说明如何确定该错误的实际原因,并重点介绍了两种可能的原因:当前用户的权限不正确以及当前用户无法访问某个资源。

获取项目源代码和可执行文件
  1. 从 GitHub 上的 AWS 代码示例存储库中下载 Amazon S3 代码示例文件夹。

  2. 打开 delete_bucket.cpp,注意里面有两种方法:main()DeleteBucket()DeleteBucket() 使用 SDK 删除存储桶。

  3. 使用适用于 C++ 的 AWS SDK 入门使用中介绍的相同构建步骤构建 Amazon S3 示例。构建过程会为每个源文件生成一个可执行文件。

  4. 打开命令提示符,进入构建系统生成可执行文件的文件夹。运行可执行文件 run_create_bucket(实际可执行文件名会因操作系统而异)。这会在您的账户中创建一个存储桶(这样您就有了一个可以删除的存储桶)。

  5. 在命令提示符下,运行可执行文件 run_delete_bucket。此示例需要一个参数,即,你想要删除的存储桶的名称。提供一个不正确的存储桶名称;现在故意在这个存储桶名称中制造一个拼写错误,这样我们就可以探索故障排除方法。

  6. 确认收到 Access Denied 错误消息。收到 Access Denied 错误消息让您怀疑自己是否创建了一个对 Amazon S3 拥有完全权限的用户,接下来您需要验证这一点。

要安装 AWS CLI 并找到正在调用 AWS 的用户名
  1. 要在开发计算机上安装最新 AWS CLI,请参阅《AWS Command Line Interface 用户指南》中的安装 AWS CLI

  2. 要验证 AWS CLI 是否正在运行,请打开命令提示符并运行命令 aws -\-version

    $ aws -\-version aws-cli/2.1.29 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
  3. 要获取实际调用 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 中的命令结构

验证用户是否有权删除存储桶
  1. 打开 AWS 管理控制台 并登录。有关更多详细信息,请参阅 AWS 管理控制台入门

  2. 在主导航栏中,对于搜索服务...,输入 IAM 并从结果中选择 IAM 服务。

  3. 控制面板侧栏或 IAM 资源下,选择用户

  4. 从您的账户的可用用户表中,选择在上述过程中获得的用户名。

  5. 选择摘要页面的权限选项卡,在策略名称表下,选择 AmazonS3FullAccess

  6. 查看策略摘要和 JSON 数据。验证此用户是否拥有使用 Amazon S3 服务的完整权限。

    "Effect": "Allow", "Action": "s3:*", "Resource": "*"

这种排除法在排查问题可能的发生位置时十分常用。在本例中,您已验证用户确实具有正确的权限,因此问题一定出在其他方面。也就是说,由于您拥有访问存储桶的正确权限,因此 Access Denied 错误可能意味着您正在尝试访问不属于您的存储桶。在进行故障排除时,您接下来要查看提供给程序的存储桶名称,并注意到您的账户中不存在具有该名称的存储桶,因此您无法“访问”它。

更新代码示例,使其成功运行
  1. 回到 delete_bucket.cppmain() 函数中,使用枚举将区域更改为您的账户所在的区域。要找到您的账户所在区域,请登录到AWS 管理控制台,然后在右上角找到该区域。同样在 main() 中,将存储桶名称更改为您的账户中确实存在的存储桶。可通过多种方式查找当前存储桶名称:

    • 您可以使用同样存在于本代码示例文件夹中的 run_list_buckets 可执行文件,通过编程方式获取您的存储桶名称。

    • 或者,您也可以使用以下 AWS CLI 命令列出您的 Amazon S3 存储桶。

      $ aws s3 ls 2022-01-05 14:27:48 amzn-s3-demo-bucket
    • 或者,您也可以使用 AWS 管理控制台。在主导航栏中,在搜索服务中...,输入 S3。“存储桶”页面列出了您账户的存储桶。

  2. 重新生成代码并运行更新的可执行文件 run_delete_bucket

  3. 使用 AWS 管理控制台或 AWS CLI,验证您之前创建的 Amazon S3 存储桶是否已被删除。