AWS Cloud9
ユーザーガイド

AWS Cloud9 の C++ サンプル

このサンプルを使用して AWS Cloud9 development environment でいくつかの C++ コードを実行できます。

このサンプルを作成すると、AWS アカウントに課金される場合があります。これには、Amazon EC2 や Amazon S3 などのサービスで発生する可能性がある料金も含まれます。詳細については、「Amazon EC2 料金表」および「Amazon S3 料金表」を参照してください。

前提条件

このサンプルを使用する前に、以下の前提条件を満たしていることを確認します。

  • 既存の AWS Cloud9 EC2 development environment がある。 このサンプルでは、Amazon Linux または Ubuntu Server を実行する Amazon EC2 インスタンスに接続された EC2 environment が既にあることを前提としています。別のタイプまたはオペレーティングシステムの environment がある場合、このサンプルの手順を調整して関連ツールをセットアップする必要がある場合があります。詳細については、「AWS Cloud9 で Environment を作成する」を参照してください。

  • 既存の環境に既に開いている AWS Cloud9 IDE がある。 environment を開くと、AWS Cloud9 によってその environment の IDE がウェブブラウザで開かれます。詳細については、「AWS Cloud9 で環境を開く」を参照してください。

ステップ 1: 必要なツールをインストールする

このステップでは GNU Complier Collection (GCC) をインストールして設定します。このサンプルを実行するために必要なものです。

  1. AWS Cloud9 IDE のターミナルセッションで、g++ --version コマンドを実行して GCC がインストール済みであるかどうかを確認します。(新しいターミナルセッションを開始するには、メニューバーで、[Window (ウィンドウ)]、[New Terminal (新しいターミナル)] の順に選択します。) 成功した場合、出力に GCC のバージョン番号が含まれています。それ以外の場合は、エラーメッセージが出力されます。GCC がインストール済みである場合は、ステップ 2: コードの追加 に進みます。

  2. yum update コマンドを (Amazon Linux) または apt update (Ubuntu Server) を実行して、最新のセキュリティ更新プログラムおよびバグ修正がインストールされていることを確認します。

    複数 Amazon Linux:

    sudo yum -y update

    Ubuntu Server の場合:

    sudo apt update
  3. GCC をインストールするには、 yum install (Amazon Linux)または apt install (Ubuntu Server) コマンドを実行します。

    複数 Amazon Linux:

    sudo yum -y install gcc-c++

    Ubuntu Server の場合:

    sudo apt install -y g++
  4. g++ --version コマンドを実行して、GCC が正しくインストールされていることを確認します。成功した場合、出力に GCC のバージョン番号が含まれています。

ステップ 2: コードの追加

AWS Cloud9 IDE で、以下の内容のファイルを作成し、hello.cpp という名前で保存します。(ファイルを作成するには、メニューバーで [File (ファイル)]、[New File (新規ファイル)] の順に選択します。)ファイルを保存するには、[File (ファイル)]、[Save (保存)] の順に選択します。

#include <iostream> #include <stdlib.h> int main( int argc, char *argv[] ) { std::cout << "Hello, World!\n"; std::cout << "The sum of 2 and 3 is 5.\n"; if (argc > 2) { std::cout << "The sum of " << argv[1] << " and " << argv[2] << " is " << atoi(argv[1]) + atoi(argv[2]) << ".\n"; } return 0; }

ステップ 3: コードを実行する

  1. hello.cpp ソースコードをオブジェクトモジュールにコンパイルし、オブジェクトモジュールを hello という名前のプログラムにリンクします。これを行うには、メニューバーで [Run (実行)]、[Build System (ビルドシステム)]、[G++] の順に選択し、さらに [Run (実行)]、[Build (ビルド)] の順に選択します。

    注記

    [G++] が利用できない場合は、G++ 用のカスタムビルダーを作成できます。

    1. メニューバーで、[Run (実行)]、[Build System (ビルドシステム)]、[New Build System (新しいビルドシステム)] の順に選択します。

    2. [My Builder.build] タブで、タブの内容を以下のコードに置き換えます。

      { "cmd": [ "g++", "-o", "$file_base_name", "$file_name" ], "info": "Compiling $file_name and linking to $file_base_name...", "selector": "source.cpp" }
    3. メニューバーで [File (ファイル)]、[Save As (名前を付けて保存)] の順に選択し、ファイルを G++.build として /.c9/builders フォルダに保存します。

    4. [hello.cpp] タブを選択し、アクティブにします。

    5. [Run (実行)]、[Build System (ビルドシステム)]、[G++] の順に選択し、さらに [Run (実行)]、[Build (ビルド)] の順に選択します。

  2. AWS Cloud9 IDE で、メニューバーの [Run (実行)]、[Run Configurations (実行設定)]、[New Run Configuration (新しい実行設定)] の順に選択してコードを実行します。

  3. [[New] - Idle ([新規] - アイドル)] タブで、[Runner: Auto (ランナー: 自動)] を選択し、[C++] を選択します。

    注記

    [C++] が利用できない場合は、C++ 用のカスタムランナーを作成できます。

    1. [[New] - Idle ([新規] - アイドル)] タブで、[Runner: Auto (ランナー: 自動)] を選択し、[New Runner (新しいランナー)] を選択します。

    2. [My Runner.run] タブで、タブの内容を以下のコードに置き換えます。

      { "cmd" : ["$file", "$args"], "info" : "Running $project_path$file_name...", "selector" : "source" }
    3. メニューバーで [File (ファイル)]、[Save As (名前を付けて保存)] の順に選択し、ファイルを C++.run として /.c9/runners フォルダに保存します。

    4. [[New] - Idle ([新規] - アイドル)] タブで、[Runner: Auto (ランナー: 自動)] を選択し、[C++] を選択します。

  4. [Command (コマンド)] に「hello 5 9」と入力します。コード内の 5argv[1] を、9argv[2] を表します。

  5. [Run (実行)] ボタンを選択して、出力を比較します。

    Hello, World! The sum of 2 and 3 is 5. The sum of 5 and 9 is 14.

ステップ 4: AWS SDK for C++ をインストールして設定する

このサンプルを強化して AWS SDK for C++ を使用し、Amazon S3 バケットの作成、利用可能なバケットの一覧表示、さらに作成したバケットの削除を行うことができます。

このステップでは、AWS SDK for C++ をインストールして設定します。これにより、C++ コードから Amazon S3 などの AWS のサービスを簡単に操作できます。AWS SDK for C++ をインストールする前に、いくつかの依存関係をインストールする必要があります。AWS SDK for C++ をインストールしたら、environment に認証情報管理をセットアップする必要があります。これらの認証情報は、AWS SDK for C++ が AWS のサービスとやり取りするために必要です。

注記

以下のステップでは、environment を Amazon EC2 インスタンスまたは独自のサーバー (4 GB 以上の RAM) で実行する必要があります。

AWS SDK for C++ 依存関係をインストールするには

AWS Cloud9 IDE のターミナルセッションから次のコマンドを実行して、AWS SDK for C++ が正しく動作するために必要ないくつかのパッケージをインストールします。

複数 Amazon Linux:

sudo yum -y install libcurl-devel openssl-devel libuuid-devel cmake3

Ubuntu Server の場合:

sudo apt install -y libcurl4-openssl-dev libssl-dev uuid-dev zlib1g-dev libpulse-dev cmake

AWS SDK for C++ ソースコードをダウンロードして抽出するには

  1. wget コマンドを実行します。次のように、AWS SDK for C++ ソースの場所を指定します。

    wget https://github.com/aws/aws-sdk-cpp/archive/master.zip
  2. unzip コマンドを実行します。次のように、ダウンロードした .zip ファイルの名前を指定します。

    unzip master.zip
  3. 不要になった .zip ファイルを削除するには、rm コマンドを実行します。

    rm master.zip

AWS SDK for C++ をビルドするには

注記

このステップでは、Amazon EC2 インスタンスまたは自分のサーバーで使用可能なコンピューティングリソースと、ビルドするために選択した AWS SDK for C++ の量に応じて、完了までに 1 時間以上かかることがあります。

  1. AWS SDK for C++ をビルドするためのフォルダを作成します。

    mkdir sdk_build
  2. 先ほど作成したフォルダに切り替えます。

    cd sdk_build
  3. AWS SDK for C++ をビルドするためにこのフォルダを準備します。

    複数 Amazon Linux:

    cmake3 ../aws-sdk-cpp-master

    Ubuntu Server の場合:

    cmake ../aws-sdk-cpp-master

    注記

    AWS SDK for C++ の Amazon S3 部分とその依存関係のみをビルドするには、代わりに次のコマンドを実行します。

    複数 Amazon Linux:

    cmake3 ../aws-sdk-cpp-master -DBUILD_ONLY="s3"

    Ubuntu Server の場合:

    cmake ../aws-sdk-cpp-master -DBUILD_ONLY="s3"
  4. AWS SDK for C++ をこのフォルダにビルドします。

    make
  5. AWS SDK for C++ のビルドに成功した後で、environment のルートに切り替えます。

    cd ..

environment で認証情報管理を設定するには

AWS SDK for C++ を使用して AWS のサービスを呼び出すたびに、呼び出しに一連の認証情報を指定する必要があります。これらの認証情報は AWS SDK for C++ にその呼び出しを行う適切なアクセス許可があるかどうかを判別します。認証情報に適切なアクセス権限がない場合は、呼び出しは失敗します。

このステップでは、environment 内に認証情報を保存します。これを行うには、AWS Cloud9 の環境から AWS のサービスを呼び出すの手順を実行してから、このトピックに戻ります。

詳細については、AWS SDK for C++ 開発者ガイド の「AWS 認証情報の提供」を参照してください。

ステップ 5: AWS SDK コードを追加する

このステップでは、今度は Amazon S3 を操作してバケットを作成し、利用できるバケットのリストを表示した後、作成したバケットを削除するコードをいくつか追加します。このコードは後で実行します。

  1. AWS Cloud9 IDE で、以下の内容のファイルを作成し、environment のルート (/) に s3-demo.cpp という名前で保存します。

    #include <aws/core/Aws.h> #include <aws/s3/S3Client.h> #include <aws/s3/model/Bucket.h> #include <aws/s3/model/CreateBucketConfiguration.h> #include <aws/s3/model/CreateBucketRequest.h> #include <aws/s3/model/DeleteBucketRequest.h> #include <string> bool ListMyBuckets(Aws::S3::S3Client s3_client); bool CreateMyBucket(Aws::S3::S3Client s3_client, Aws::String bucket_name, Aws::S3::Model::BucketLocationConstraint region); bool DeleteMyBucket(Aws::S3::S3Client s3_client, Aws::String bucket_name); void Cleanup(Aws::SDKOptions options); int main(int argc, char** argv) { if (argc < 3) { std::cout << "Usage: ./s3-demo <the bucket name> <the AWS Region to use>" << std::endl << "Example: ./s3-demo my-test-bucket us-west-1" << std::endl; return false; } Aws::String bucket_name = argv[1]; Aws::Client::ClientConfiguration client_configuration; Aws::S3::Model::BucketLocationConstraint region; // Set the AWS Region to use, based on the user's AWS Region input ID. if (strcmp(argv[2], "ap-northeast-1") == 0) { client_configuration.region = Aws::Region::AP_NORTHEAST_1; region = Aws::S3::Model::BucketLocationConstraint::ap_northeast_1; } else if (strcmp(argv[2], "ap-northeast-2") == 0) { client_configuration.region = Aws::Region::AP_NORTHEAST_2; region = Aws::S3::Model::BucketLocationConstraint::ap_northeast_2; } else if (strcmp(argv[2], "ap-south-1") == 0) { client_configuration.region = Aws::Region::AP_SOUTH_1; region = Aws::S3::Model::BucketLocationConstraint::ap_south_1; } else if (strcmp(argv[2], "ap-southeast-1") == 0) { client_configuration.region = Aws::Region::AP_SOUTHEAST_1; region = Aws::S3::Model::BucketLocationConstraint::ap_southeast_1; } else if (strcmp(argv[2], "ap-southeast-2") == 0) { client_configuration.region = Aws::Region::AP_SOUTHEAST_2; region = Aws::S3::Model::BucketLocationConstraint::ap_southeast_2; } else if (strcmp(argv[2], "cn-north-1") == 0) { client_configuration.region = Aws::Region::CN_NORTH_1; region = Aws::S3::Model::BucketLocationConstraint::cn_north_1; } else if (strcmp(argv[2], "eu-central-1") == 0) { client_configuration.region = Aws::Region::EU_CENTRAL_1; region = Aws::S3::Model::BucketLocationConstraint::eu_central_1; } else if (strcmp(argv[2], "eu-west-1") == 0) { client_configuration.region = Aws::Region::EU_WEST_1; region = Aws::S3::Model::BucketLocationConstraint::eu_west_1; } else if (strcmp(argv[2], "sa-east-1") == 0) { client_configuration.region = Aws::Region::SA_EAST_1; region = Aws::S3::Model::BucketLocationConstraint::sa_east_1; } else if (strcmp(argv[2], "us-west-1") == 0) { client_configuration.region = Aws::Region::US_WEST_1; region = Aws::S3::Model::BucketLocationConstraint::us_west_1; } else if (strcmp(argv[2], "us-west-2") == 0) { client_configuration.region = Aws::Region::US_WEST_2; region = Aws::S3::Model::BucketLocationConstraint::us_west_2; } else { std::cout << "Unrecognized AWS Region ID '" << argv[2] << "'" << std::endl; return false; } Aws::SDKOptions options; Aws::InitAPI(options); { Aws::S3::S3Client s3_client(client_configuration); if (!ListMyBuckets(s3_client)) { Cleanup(options); } if (!CreateMyBucket(s3_client, bucket_name, region)) { Cleanup(options); } if (!ListMyBuckets(s3_client)) { Cleanup(options); } if (!DeleteMyBucket(s3_client, bucket_name)) { Cleanup(options); } if (!ListMyBuckets(s3_client)) { Cleanup(options); } } Cleanup(options); } // List all of your available buckets. bool ListMyBuckets(Aws::S3::S3Client s3_client) { auto outcome = s3_client.ListBuckets(); if (outcome.IsSuccess()) { std::cout << "My buckets now are:" << std::endl << std::endl; Aws::Vector<Aws::S3::Model::Bucket> bucket_list = outcome.GetResult().GetBuckets(); for (auto const &bucket: bucket_list) { std::cout << bucket.GetName() << std::endl; } std::cout << std::endl; return true; } else { std::cout << "ListBuckets error: " << outcome.GetError().GetExceptionName() << std::endl << outcome.GetError().GetMessage() << std::endl; return false; } } // Create a bucket in this AWS Region. bool CreateMyBucket(Aws::S3::S3Client s3_client, Aws::String bucket_name, Aws::S3::Model::BucketLocationConstraint region) { std::cout << "Creating a new bucket named '" << bucket_name << "'..." << std::endl << std::endl; Aws::S3::Model::CreateBucketConfiguration bucket_configuration; bucket_configuration.WithLocationConstraint(region); Aws::S3::Model::CreateBucketRequest bucket_request; bucket_request.WithBucket(bucket_name).WithCreateBucketConfiguration(bucket_configuration); auto outcome = s3_client.CreateBucket(bucket_request); if (outcome.IsSuccess()) { return true; } else { std::cout << "CreateBucket error: " << outcome.GetError().GetExceptionName() << std::endl << outcome.GetError().GetMessage() << std::endl; return false; } } // Delete the bucket you just created. bool DeleteMyBucket(Aws::S3::S3Client s3_client, Aws::String bucket_name) { std::cout << "Deleting the bucket named '" << bucket_name << "'..." << std::endl << std::endl; Aws::S3::Model::DeleteBucketRequest bucket_request; bucket_request.WithBucket(bucket_name); auto outcome = s3_client.DeleteBucket(bucket_request); if (outcome.IsSuccess()) { return true; } else { std::cout << "DeleteBucket error: " << outcome.GetError().GetExceptionName() << std::endl << outcome.GetError().GetMessage() << std::endl; return false; } } void Cleanup(Aws::SDKOptions options) { Aws::ShutdownAPI(options); }
  2. 以下の内容のファイルを作成し、environment のルート (/) に CMakeLists.txt という名前で保存します。このファイルを使用すると、コードを実行可能ファイルに組み込むことができます。

    # A minimal CMakeLists.txt file for the AWS SDK for C++. # The minimum version of CMake that will work. cmake_minimum_required(VERSION 2.8) # The project name. project(s3-demo) # Locate the AWS SDK for C++ package. # Requires that you build with: # -Daws-sdk-cpp_DIR=/path/to/sdk_build # or export/set: # CMAKE_PREFIX_PATH=/path/to/sdk_build find_package(aws-sdk-cpp) # Link to the AWS SDK for C++ shared libraries. add_definitions(-DUSE_IMPORT_EXPORT) # The executable name and its source files. add_executable(s3-demo s3-demo.cpp) # The libraries used by your executable. target_link_libraries(s3-demo aws-cpp-sdk-s3)

ステップ 6: AWS SDK コードをビルドおよび実行する

  1. ターミナルで、端末で、ソースコードをビルドする準備をします。

    複数 Amazon Linux:

    cmake3 -Daws-sdk-cpp_DIR=sdk_build .

    Ubuntu Server の場合:

    cmake -Daws-sdk-cpp_DIR=sdk_build .
  2. ソースコードをビルドします。

    make
  3. メニューバーで、[Run (実行)]、[Run Configurations (実行設定)]、[New Run Configuration (新しい実行設定)] の順に選択して、コードを実行します。

  4. [[New] - Idle ([新規] - アイドル)] タブで、[Runner: Auto (ランナー: 自動)] を選択し、[C++] を選択します。

  5. [コマンド] に、「s3-demo my-test-bucket us-east-2」と入力します。ここで my-test-bucket は作成して削除するバケットの名前、us-east-2 はバケットを作成する AWS リージョンの ID です。他の ID については、アマゾン ウェブ サービス全般のリファレンス の「Amazon Simple Storage Service (Amazon S3)」を参照してください。

    注記

    Amazon S3 バケット名は AWS アカウント内で一意であるだけでなく、AWS— 全体で一意である必要があります。

  6. [Run (実行)] ボタンを選択して、出力を比較します。

    My buckets now are: Creating a new bucket named 'my-test-bucket'... My buckets now are: my-test-bucket Deleting the bucket named 'my-test-bucket'... My buckets now are:

ステップ 7: クリーンアップ

このサンプルを使用し終わった後 AWS アカウントで料金が継続的に発生するのを防ぐには、environment を削除する必要があります。手順については、「AWS Cloud9 で環境を削除する」を参照してください。