AWS SDK for C++ でのランタイムエラーのトラブルシューティングの開始方法 - AWS SDK for C++

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS SDK for C++ でのランタイムエラーのトラブルシューティングの開始方法

AWS SDK for C++ を使用してアプリケーションを開発していく中で、AWS マネジメントコンソール と AWS CLI の両方を使いこなせるようになっておくことも重要です。これらのツールは、ランタイムエラー発生時のさまざまなトラブルシューティングや診断に互換的に使用できます。

次のチュートリアルでは、こうしたトラブルシューティングおよび診断作業の一例を示します。ここでは、いくつかの異なる理由で発生する可能性がある Access denied エラーに焦点を当てます。このチュートリアルは、エラーの実際の原因をどのように特定するかの例を示します。ここでは、主に次の 2 つの原因に注目します。現在のユーザーに対してアクセス許可が正しくないこと、リソースが利用できないことです。

プロジェクトのソースと実行可能ファイルを取得するには
  1. GitHub の AWS コードサンプルリポジトリから Amazon S3 のコード例フォルダをダウンロードします。

  2. delete_bucket.cpp を開き、main()DeleteBucket() の 2 つのメソッドがあることを確認します。DeleteBucket() は SDK を使用してバケットを削除します。

  3. AWS SDK for C++ の開始方法」で説明しているのと同じビルド手順を使用して、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 SDK for C++ AWS を使用した での認証 の手順に従っている場合、このユーザー名は AWS の共有認証情報ファイルから取得されます。その手順の中で、ユーザーに AmazonS3FullAccess アクセス許可を付与しました。

    注記

    一般的に、ほとんどの AWS CLI コマンドは次の構文構造に従います。

    $ aws <command> <subcommand> [options and parameters]

    ここで、command はサービス、subcommand はそのサービスで呼び出されるメソッドです。詳細については、「AWS Command Line Interface ユーザーガイド」の「AWS CLI のコマンド構造」を参照してください。

ユーザーにバケットを削除するためのアクセス許可があるかを確認するには
  1. AWS マネジメントコンソール を開き、ログインします。詳細については、「AWS マネジメントコンソール の開始方法」を参照してください。

  2. メインナビゲーションバーの [Search for services...] (サービスを検索...) に「IAM」と入力し、表示された結果から IAM サービスを選択します。

  3. ダッシュボードのサイドバーまたは [IAM Resources] (IAM リソース) で、[Users] (ユーザー) を選択します。

  4. アカウントで使用可能なユーザーの一覧から、前の手順で取得したユーザー名を選択します。

  5. [Summary] (概要) ページの [Permissions] (アクセス許可) タブを選択し、ポリシー名の一覧から [AmazonS3FullAccess] を選択します。

  6. [Policy summary] (ポリシーの概要) と JSON データを確認します。このユーザーが Amazon S3 サービスに対して完全な権限を持っていることを確認します。

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

このような除外による確認手順は、問題の原因を特定する上でよく使用されます。今回の場合、ユーザーに正しいアクセス許可があることが確認されたため、問題は他にあると考えられます。つまり、バケットにアクセスするための正しいアクセス許可があるにもかかわらず Access Denied エラーが発生する場合は、自分のものでないバケットにアクセスしようとしている可能性があります。トラブルシューティングの次の手順として、プログラムに指定されたバケット名を確認すると、その名前のバケットがアカウントに存在しないこと、つまりそのバケットに「アクセス」できないことがわかります。

コード例を正常に動作するように更新するには
  1. delete_bucket.cppmain() 関数に戻り、enum を使用してリージョンを自分のアカウントのリージョンに変更します。自分のアカウントのリージョンを見つけるには、AWS マネジメントコンソール にログインし、右上隅にあるリージョンを確認します。また main() 内で、バケット名を自分のアカウントに存在するバケットに変更します。現在のバケット名を見つける方法はいくつかあります。

    • このコード例のフォルダ内にある run_list_buckets 実行可能ファイルを使用して、バケットの名前をプログラムで取得できます。

    • あるいは、次の AWS CLI コマンドを使用して Amazon S3 バケットを一覧表示することもできます。

      $ aws s3 ls 2022-01-05 14:27:48 amzn-s3-demo-bucket
    • あるいは、AWS マネジメントコンソール エイリアスを使用することもできます。メインナビゲーションバーの [Search for services...] (サービスの検索) で、「S3」と入力します。バケットのページに、アカウントのバケットが一覧表示されます。

  2. コードを再ビルドし、更新された実行可能ファイル run_delete_bucket を実行します。

  3. AWS マネジメントコンソール または AWS CLI のいずれかを使用して、先ほど作成した Amazon S3 バケットが削除されたことを確認します。