aws-sdk-cpp相关(aws dynamodb/s3/sqs c++用法)

1、安装aws-sdk-cpp

git clone https://github.com/aws/aws-sdk-cpp.git
cd aws-sdk-cpp/
mkdir build
cd build/
cmake .. # cmake -DBUILD_ONLY="s3;dynamodb" ..只编译s3,dynampdb
make # make -j8
sudo make install # 头文件位于/usr/local/include,动态库文件位于/usr/local/lib

2、dynamodb使用

官方例子:https://docs.amazonaws.cn/sdk-for-cpp/v1/developer-guide/examples-dynamodb.html

dynamodb保留的关键字:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html

dynamodb.cc: 

#include <iostream>
#include "aws/core/Aws.h"
#include "aws/core/auth/AWSCredentialsProvider.h"
#include "aws/core/utils/Outcome.h"
#include "aws/dynamodb/DynamoDBClient.h"
#include "aws/dynamodb/model/AttributeValue.h"
#include "aws/dynamodb/model/AttributeValueUpdate.h"
#include "aws/dynamodb/model/DescribeTableRequest.h"
#include "aws/dynamodb/model/PutItemRequest.h"
#include "aws/dynamodb/model/GetItemRequest.h"
#include "aws/dynamodb/model/UpdateItemRequest.h"
#include "aws/dynamodb/model/QueryRequest.h"
#include "aws/dynamodb/model/ScanRequest.h"
#include "aws/dynamodb/model/DeleteItemRequest.h"
#include "aws/dynamodb/model/BatchWriteItemRequest.h"
#include "aws/dynamodb/model/BatchGetItemRequest.h"

using AttributeValue = Aws::DynamoDB::Model::AttributeValue;
using AttributeValueUpdate = Aws::DynamoDB::Model::AttributeValueUpdate;

std::string table = "alan_test";

auto NumberToAttribute = [](auto num) {
    AttributeValue av;
    av.SetN(std::to_string(num).c_str());
    return av;
};

AttributeValue StringToAttribute(const std::string &str) {
  AttributeValue av;
  av.SetS(Aws::String(str.c_str(), str.size()));
  return av;
}

AttributeValueUpdate AttributeToUpdate(AttributeValue av) {
  AttributeValueUpdate avu;
  avu.SetValue(av);
  return avu;
};

void PrintItem(const Aws::Map<Aws::String, AttributeValue>& item) {
  // id
  int id_ = 0;
  if (item.count("id")) {
    id_ = atoi(item.find("id")->second.GetN().c_str());
    // id_ = atoi(item.at("id").GetN().c_str());
  }
  // class
  int class_ = 0;
  if (item.count("class")) {
    class_ = atoi(item.find("class")->second.GetN().c_str());
  }
  // name
  std::string name_ = "";
  if (item.count("name"))
    name_ = item.find("name")->second.GetS().c_str();

  std::cout << "id: " << id_ << ", class: " << class_ << ", name: " << name_ << std::endl;
}

int main(int argc, char* argv[])
{
  Aws::SDKOptions options;
  // options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace;
  Aws::InitAPI(options);

  Aws::Auth::AWSCredentials credentials("access key", "secret key");
  Aws::Client::ClientConfiguration client_config;
  client_config.region = "cn-northwest-1";
  // client_config.requestTimeoutMs = 300000;
  // client_config.endpointOverride = "localhost:8000";
  // client_config.endpointOverride = "10.202.91.2:88";  // dynamodb服务器地址和端口
  // client_config.scheme = Aws::Http::Scheme::HTTPS;
  Aws::DynamoDB::DynamoDBClient dynamodb_client(credentials, client_config);
  std::cout << "success initial !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // check if the table exists
    Aws::DynamoDB::Model::DescribeTableRequest request;
    request.SetTableName(table.c_str());
    auto result = dynamodb_client.DescribeTable(request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to open table " << table.c_str() << ": "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
  }
  std::cout << "success check table !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // put item
    Aws::DynamoDB::Model::PutItemRequest request;
    request.SetTableName(table.c_str());
    request.AddItem("id", NumberToAttribute(1));
    request.AddItem("class", NumberToAttribute(4));
    request.AddItem("name", StringToAttribute("alan"));
    // Aws::Map<Aws::String, Aws::DynamoDB::Model::AttributeValue> item;
    // // id.
    // item.insert(std::make_pair("id", AttributeValue("test.bag")));
    // // timestamp
    // AttributeValue timestamp_av;
    // timestamp_av.SetN("10010");
    // item.insert(std::make_pair("timestamp", timestamp_av));

    // // status
    // item.insert(std::make_pair("status", AttributeValue("unknow")));
    // request.SetItem(item);
    auto result = dynamodb_client.PutItem(request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to put item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str() << std::endl;
    }
  }
  std::cout << "success put item !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // get item(指定主键和排序键,item唯一)(get 1 item)
    // Aws::DynamoDB::Model::AttributeValue attribute_value;
    // attribute_value.SetS("test.bag");
    // get_request.SetKey({{"id", attribute_value}});
    Aws::DynamoDB::Model::GetItemRequest request;
    request.SetConsistentRead(true);
    request.SetTableName(table.c_str());
    request.SetExpressionAttributeNames({{"#name", "name"},
                                         {"#class", "class"}});

    Aws::StringStream stream;
    stream << "id" << ", " << "#name" << ", " << "#class";
    request.SetProjectionExpression(stream.str());

    request.AddKey("id", NumberToAttribute(1));
    request.AddKey("class", NumberToAttribute(4));

    auto result = dynamodb_client.GetItem(request); // Aws::DynamoDB::Model::GetItemOutcome result
    if (!result.IsSuccess() || result.GetResult().GetItem().size() == 0) {
      std::cout << "Fail to get item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
    auto item = result.GetResult().GetItem();
    PrintItem(item);
  }
  std::cout << "success get item !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // update item(不能更新主键和排序键)
    Aws::DynamoDB::Model::UpdateItemRequest request;
    request.SetTableName(table.c_str());

    request.AddKey("id", NumberToAttribute(1));
    request.AddKey("class", NumberToAttribute(4));
    // update_item_req.AddKey("id", AttributeValue("test.bag"));
    // update_item_req.AddKey("name", AttributeValue("alan"));
    request.AddAttributeUpdates("name", AttributeToUpdate(StringToAttribute("Alan")));

    // // id
    // AttributeValue id_av("good");
    // AttributeValueUpdate id_avu;
    // id_avu.SetValue(id_av);
    // update_item_req.AddAttributeUpdates("status", id_avu);
    // // time_start
    // AttributeValue time_start_av;
    // time_start_av.SetN("12345678.90");
    // AttributeValueUpdate time_start_avu;
    // time_start_avu.SetValue(time_start_av);
    // update_item_req.AddAttributeUpdates("time_start", time_start_avu);

    auto result = dynamodb_client.UpdateItem(request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to update item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
  }
  std::cout << "success update item !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // query item (get 1+ item)
    Aws::DynamoDB::Model::QueryRequest request;
    request.SetConsistentRead(true);
    request.SetTableName(table.c_str());

    // query_req.AddExpressionAttributeNames("#status", "status");
    request.SetExpressionAttributeNames({{"#name", "name"},
                                         {"#class", "class"}});
    Aws::StringStream stream;
    stream << "id" << ", " << "#class" << ", " << "#name";
    request.SetProjectionExpression(stream.str());
    // query_req.SetProjectionExpression("id, #status, start_time");  // must assign key schema element

    request.SetKeyConditionExpression("id = :id"); // 必须指定主键相等条件
    request.SetFilterExpression("#name < :name");
    Aws::DynamoDB::Model::AttributeValue id_av, name_av;
    id_av.SetN("1");
    name_av.SetS("a");
    Aws::Map<Aws::String, AttributeValue> values = {{":id", id_av},
                                                    {":name", name_av}};
    // Aws::Map<Aws::String, AttributeValue> values;
    // values[Aws::String(":id")] = id_av;
    // values[Aws::String(":name")] = name_av;
    request.SetExpressionAttributeValues(values);

    request.SetScanIndexForward(false);  // 从大到小

    auto result = dynamodb_client.Query(request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to query item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
    auto items = result.GetResult().GetItems();
    for (const auto &item : items) {
      PrintItem(item);
    }
  }
  std::cout << "success query item !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // scan table
    Aws::DynamoDB::Model::ScanRequest request;
    request.SetTableName(table.c_str());
    request.SetExpressionAttributeNames({{"#name", "name"},
                                         {"#class", "class"}});
    // scan_req.AddExpressionAttributeNames("#status", "status");
    // scan_req.AddExpressionAttributeNames("#timestamp", "timestamp");
    request.SetProjectionExpression("id, #name");
    request.SetFilterExpression("#class = :class"
                                " AND id = :id");
    Aws::DynamoDB::Model::AttributeValue id_av, class_av;
    id_av.SetN("2");
    class_av.SetN("4");
    Aws::Map<Aws::String, AttributeValue> values = {{":id", id_av},
                                                    {":class", class_av}};
    request.SetExpressionAttributeValues(values);

    Aws::Map<Aws::String, AttributeValue> last_key;
    // Aws::Vector<Aws::Map<Aws::String, AttributeValue>> all_items;
    do {
      if (last_key.size()) {
        request.SetExclusiveStartKey(last_key);
      }
      auto result = dynamodb_client.Scan(request);
      if (!result.IsSuccess()) {
        std::cout << "Scan error: " << result.GetError().GetMessage();
      }
        std::cout << "scan " << result.GetResult().GetScannedCount() << " items" << std::endl;
        std::cout << "match " << result.GetResult().GetCount() << " items" << std::endl;
      auto items = result.GetResult().GetItems();
      // all_items.insert(all_items.end(), items.begin(), items.end());
      for (const auto &item : items) {
        PrintItem(item);
      }
      last_key = result.GetResult().GetLastEvaluatedKey();
    } while (last_key.size());
  }
  std::cout << "success scan item !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // delete item
    Aws::DynamoDB::Model::DeleteItemRequest request;
    request.SetTableName(table.c_str());

    request.AddKey("id", NumberToAttribute(1));
    request.AddKey("class", NumberToAttribute(1));
    // delete_item_req.SetKey({{"id", AttributeValue("test.bag")}});

    auto result = dynamodb_client.DeleteItem(request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to delete item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
  }
  std::cout << "success delete item !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // batch write items
    Aws::Map<Aws::String, AttributeValue> item1;
    item1.insert(std::make_pair("id", NumberToAttribute(5)));
    item1.insert(std::make_pair("class", NumberToAttribute(5)));
    item1.insert(std::make_pair("name", StringToAttribute("5555")));
    Aws::DynamoDB::Model::PutRequest put_request1;
    put_request1.SetItem(item1);

    Aws::Map<Aws::String, AttributeValue> item2;
    item2.insert(std::make_pair("id", NumberToAttribute(6)));
    item2.insert(std::make_pair("class", NumberToAttribute(6)));
    item2.insert(std::make_pair("name", StringToAttribute("6666")));
    Aws::DynamoDB::Model::PutRequest put_request2;
    put_request2.SetItem(item2);

    Aws::Vector<Aws::DynamoDB::Model::WriteRequest> write_requests;
    write_requests.push_back(Aws::DynamoDB::Model::WriteRequest());
    write_requests.back().SetPutRequest(put_request1);
    write_requests.push_back(Aws::DynamoDB::Model::WriteRequest());
    write_requests.back().SetPutRequest(put_request2);

    // Aws::DynamoDB::Model::WriteRequest write_req;
    // write_req.SetPutRequest(put_req);
    // write_reqs.push_back(write_req);
    // Aws::DynamoDB::Model::WriteRequest write_req2;
    // write_req2.SetPutRequest(put_req2);
    // write_reqs.push_back(write_req2);

    Aws::DynamoDB::Model::BatchWriteItemRequest batch_request;
    batch_request.AddRequestItems(table.c_str(), write_requests);
    auto result = dynamodb_client.BatchWriteItem(batch_request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to batch write item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }

    // Continue process throttled items.
    while (result.GetResult().GetUnprocessedItems().size() > 0) {
      batch_request.SetRequestItems(result.GetResult().GetUnprocessedItems());
      result = dynamodb_client.BatchWriteItem(batch_request);
      if (!result.IsSuccess()) {
        std::cout << "Fail to batch write item: "
                  << result.GetError().GetExceptionName().c_str() << "\n"
                  << result.GetError().GetMessage().c_str();
      }
    }
  }

/*
    auto iter = write_reqs.begin();
    size_t batch_size = 10;
    while (iter != write_reqs.end()) {
      Aws::Vector<Aws::DynamoDB::Model::WriteRequest> tmp_reqs;
      for (size_t i = 0; i < batch_size && iter != write_reqs.end(); i++, ++iter) {
        tmp_reqs.push_back(*iter);
      }

      Aws::DynamoDB::Model::BatchWriteItemRequest batch_req;
      batch_req.AddRequestItems(table_name.c_str(), tmp_reqs);
      auto result = dynamodb_client.BatchWriteItem(batch_req);
      if (!result.IsSuccess()) {
        std::cerr << result.GetError().GetMessage() << std::endl;
      }

      // Process throttled items.
      while (result.GetResult().GetUnprocessedItems().size() > 0) {
        batch_req.SetRequestItems(result.GetResult().GetUnprocessedItems());
        result = dynamodb_client.BatchWriteItem(batch_req);
        if (!result.IsSuccess()) {
          std::cerr << result.GetError().GetMessage() << std::endl;
        }
      }
    }
*/
  std::cout << "success batch write items !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // batch get items
     Aws::Map<Aws::String, AttributeValue> item1;
    item1.insert(std::make_pair("id", NumberToAttribute(5)));
    item1.insert(std::make_pair("class", NumberToAttribute(5)));

    Aws::Map<Aws::String, AttributeValue> item2;
    item2.insert(std::make_pair("id", NumberToAttribute(6)));
    item2.insert(std::make_pair("class", NumberToAttribute(6)));

    Aws::DynamoDB::Model::KeysAndAttributes key_attr;
    key_attr.SetExpressionAttributeNames({{"#name", "name"},
                                          {"#class", "class"}});
    key_attr.AddKeys(item1);
    key_attr.AddKeys(item2);

    Aws::StringStream stream;
    stream << "id" << ", " << "#class" << ", " << "#name";
    key_attr.SetProjectionExpression(stream.str());

    Aws::DynamoDB::Model::BatchGetItemRequest batch_request;
    batch_request.AddRequestItems(table.c_str(), key_attr);
    auto result = dynamodb_client.BatchGetItem(batch_request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to batch write item: "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
    for (auto response : result.GetResult().GetResponses()) {
      for (auto item : response.second) {
        PrintItem(item);
      }
    }

    // Continue processing throttled items
    while (result.GetResult().GetUnprocessedKeys().size() > 0) {
      batch_request.SetRequestItems(result.GetResult().GetUnprocessedKeys());
      result = dynamodb_client.BatchGetItem(batch_request);
      if (!result.IsSuccess()) {
        std::cout << "Fail to batch write item: "
                  << result.GetError().GetExceptionName().c_str() << "\n"
                  << result.GetError().GetMessage().c_str();
      }
      for (auto response : result.GetResult().GetResponses()) {
        for (auto item : response.second) {
          PrintItem(item);
        }
      }
    }
  }
  std::cout << "success batch get items !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
    // batch delete
    std::vector<Aws::DynamoDB::Model::WriteRequest> write_reqs;
    Aws::DynamoDB::Model::DeleteRequest delete_req;
    delete_req.SetKey({{"bag_name", AttributeValue("test1.bag")}});
    Aws::DynamoDB::Model::WriteRequest write_req;
    write_req.SetDeleteRequest(delete_req);
    write_reqs.push_back(write_req);

    Aws::DynamoDB::Model::DeleteRequest delete_req2;
    delete_req2.SetKey({{"bag_name", AttributeValue("test2.bag")}});
    Aws::DynamoDB::Model::WriteRequest write_req2;
    write_req2.SetDeleteRequest(delete_req2);
    write_reqs.push_back(write_req2);

    // write
    auto iter = write_reqs.begin();
    size_t batch_size = 10;
    while (iter != write_reqs.end()) {
      Aws::Vector<Aws::DynamoDB::Model::WriteRequest> tmp_reqs;
      for (size_t i = 0; i < batch_size && iter != write_reqs.end(); i++, ++iter) {
        tmp_reqs.push_back(*iter);
      }

      Aws::DynamoDB::Model::BatchWriteItemRequest batch_req;
      batch_req.AddRequestItems(table_name.c_str(), tmp_reqs);
      auto result = dynamodb_client.BatchWriteItem(batch_req);
      if (!result.IsSuccess()) {
        std::cerr << result.GetError().GetMessage() << std::endl;
      }

      // Process throttled items.
      while (result.GetResult().GetUnprocessedItems().size() > 0) {
        batch_req.SetRequestItems(result.GetResult().GetUnprocessedItems());
        result = dynamodb_client.BatchWriteItem(batch_req);
        if (!result.IsSuccess()) {
          std::cerr << result.GetError().GetMessage() << std::endl;
        }
      }
    }
  //----------------------------------------------------------------------------
  Aws::ShutdownAPI(options);
  return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(aws_dynamodb_test)

set(CMAKE_CXX_STANDARD 14)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

find_package(AWSSDK REQUIRED)
#include_directories(${AWSSDK_INCLUDE_DIRS})
LINK_DIRECTORIES(/usr/local/lib/)
add_executable(aws_dynamodb_test dynamodb.cc)
target_link_libraries(aws_dynamodb_test
        libaws-cpp-sdk-core.so
        libaws-cpp-sdk-dynamodb.so)

3、s3使用

官方例子:https://docs.amazonaws.cn/sdk-for-cpp/v1/developer-guide/examples-s3.html

s3.cc:

#include <fstream>
#include "aws/core/Aws.h"
#include "aws/core/auth/AWSCredentialsProvider.h"
#include "aws/s3/S3Client.h"
#include "aws/s3/model/HeadBucketRequest.h"
#include "aws/s3/model/ListObjectsRequest.h"
#include "aws/s3/model/HeadObjectRequest.h"
#include "aws/s3/model/DeleteObjectRequest.h"
#include "aws/s3/model/CopyObjectRequest.h"
#include "aws/s3/model/GetObjectRequest.h"
#include "aws/s3/model/PutObjectRequest.h"

std::string bucket = "bucket_name";
std::string directory = "alan_test";
std::string key = "alan_test/1.pcd";
std::string dst_key = "alan_test/3.pcd";

int main() {
  Aws::SDKOptions options;
  // options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace;
  Aws::InitAPI(options);

  Aws::Auth::AWSCredentials credentials("access key", "secret key");
  Aws::Client::ClientConfiguration client_config;
  client_config.region = "cn-northwest-1";
  client_config.requestTimeoutMs = 300000;
  //  client_config.endpointOverride = "localhost:8000";
  //  client_config.scheme = Aws::Http::Scheme::HTTP;
  //  client_config.endpointOverride = "10.202.91.2:88";  // s3服务器地址和端口
  //  client_config.verifySSL = false;
  Aws::S3::S3Client s3_client(credentials, client_config);
  std::cout << "success initial !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // list buckets
    auto result = s3_client.ListBuckets();
    if (!result.IsSuccess()) {
      std::cout << "Fail to list buckets "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
    auto buckets = result.GetResult().GetBuckets();
    for (auto bucket : buckets) {
      std::cout << "bucket: " << bucket.GetName() << "\t"
                << bucket.GetCreationDate().ToLocalTimeString(Aws::Utils::DateFormat::ISO_8601) << std::endl;
    }
  }
  std::cout << "success list buckets !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // check bucket exist
    Aws::S3::Model::HeadBucketRequest request;
    request.WithBucket(bucket.c_str());
    auto result = s3_client.HeadBucket(request);
    if (result.IsSuccess()) {
      std::cout << "bucket: " << bucket << " exist !" << std::endl;
    } else {
      std::cout << "Fail to open bucket: " << bucket.c_str() << ": "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
//    Aws::Http::HttpMethod method = Aws::Http::HttpMethod::HTTP_GET; // Aws::Http::HttpMethod::HTTP_HEAD
//    auto url = s3_client.GeneratePresignedUrl(Aws::String(bucket.c_str()),
//                                              Aws::String(key.c_str()), method,
//                                              expiration_in_seconds_);
  }
  std::cout << "success check bucket exist !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // list object
    Aws::S3::Model::ListObjectsRequest request;
    request.WithBucket(bucket.c_str()).WithPrefix(directory.c_str());
    auto result = s3_client.ListObjects(request);
    if (!result.IsSuccess()) {
      std::cout << "Fail to list bucket direct "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
    for (auto object : result.GetResult().GetContents()) {
      std::cout << "key: " << object.GetKey().c_str() << std::endl;
    }
  }
  std::cout << "success list object !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // check key exists
    Aws::S3::Model::HeadObjectRequest request;
    request.WithBucket(bucket.c_str()).WithKey(key.c_str());
    auto result = s3_client.HeadObject(request);
    if (result.IsSuccess()) {
      std::cout << "key: " << key << " exist !" << std::endl;
    } else if (result.GetError().GetErrorType() == Aws::S3::S3Errors::RESOURCE_NOT_FOUND) {
      std::cout << "key: " << key << " no exist !" << std::endl;
    } else {
      std::cout << "Error checking existence !\n"
                << "key: " << key << "\n"
                << "error: " << result.GetError().GetMessage().c_str();
    }
  }
  std::cout << "success check key exist !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // delete object
    Aws::S3::Model::DeleteObjectRequest request;
    request.WithBucket(bucket.c_str()).WithKey(dst_key.c_str());
    auto result = s3_client.DeleteObject(request);
    if (result.IsSuccess()) {
      std::cout << "success delete object: " << dst_key << std::endl;
    } else {
      std::cout << "fail to delete object: " << dst_key << std::endl;
    }
  }
  std::cout << "success delete object !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // copy object
    Aws::S3::Model::CopyObjectRequest request;
    request.WithBucket(bucket.c_str())
           .WithKey((dst_key).c_str())
           .WithCopySource((bucket + "/" + key).c_str());
    auto result = s3_client.CopyObject(request);
    if (result.IsSuccess()) {
      std::cout << "success copy object: " << key << " --> " << dst_key << std::endl;
    } else {
      std::cout << "fail to copy object: " << key << " --> " << dst_key << std::endl;
    }
  }
  std::cout << "success copy object !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // get object
    std::string aws_key = "alan_test/1.pcd";
    std::string local_path = "/tmp/local.pcd";
    Aws::S3::Model::GetObjectRequest request;
    request.WithBucket(bucket.c_str()).WithKey(aws_key.c_str());
    // request.SetBucket(bucket.c_str());
    // request.SetKey(aws_key.c_str());

int retry = 3;
for (size_t i = 0; i < retry; ++i) {
    auto result = s3_client.GetObject(request); // Aws::S3::Model::GetObjectOutcome
    if (result.IsSuccess()) {
      std::cout << "success get object: "
                << bucket + "/" + aws_key << " --> " << local_path << std::endl;
      std::ofstream fout(local_path.c_str());
      fout.exceptions(std::ifstream::failbit | std::ifstream::badbit);
      fout << result.GetResult().GetBody().rdbuf();
      fout.close();
      // std::stringstream ss;
      // Aws::IOStream& string_file = result.GetResultWithOwnership().GetBody();
      // ss << string_file.rdbuf();
      break;
    } else {
      std::cout << "Fail to get object "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
}

  }
  std::cout << "success get object !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  {
    // put object
    std::string local_path = "/tmp/local.pcd";
    std::string aws_key = "alan_test/4.pcd";
    Aws::S3::Model::PutObjectRequest request;
    request.WithBucket(bucket.c_str()).WithKey(aws_key.c_str());
    auto input_string = Aws::MakeShared<Aws::FStream>(
            "PutObjectInputStream", local_path.c_str());
    request.SetBody(input_string);
    auto result = s3_client.PutObject(request);
    if (result.IsSuccess()) {
      std::cout << "success put object: "
                << local_path << " --> " << bucket + "/" + aws_key << std::endl;
    } else {
      std::cout << "Fail to put object "
                << result.GetError().GetExceptionName().c_str() << "\n"
                << result.GetError().GetMessage().c_str();
    }
  }
  std::cout << "success put object !" << std::endl;
  getchar();
  //----------------------------------------------------------------------------
  Aws::ShutdownAPI(options);
  return 0;
}

CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(aws_s3_test)

set(CMAKE_CXX_STANDARD 14)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

find_package(AWSSDK REQUIRED)
#include_directories(${AWSSDK_INCLUDE_DIRS})
LINK_DIRECTORIES(/usr/local/lib/)
add_executable(aws_s3_test s3.cc)
target_link_libraries(aws_s3_test
        libaws-cpp-sdk-core.so
        libaws-cpp-sdk-s3.so)

4、sqs使用

官方例子:https://docs.amazonaws.cn/sdk-for-cpp/v1/developer-guide/examples-sqs.html

sqs.cc:

#include <iostream>
#include "aws/core/Aws.h"
#include "aws/core/auth/AWSCredentialsProvider.h"
#include "aws/core/utils/Outcome.h"
#include "aws/sqs/SQSClient.h"
#include <aws/sqs/model/ListQueuesRequest.h>
#include <aws/sqs/model/ListQueuesResult.h>
#include <aws/sqs/model/CreateQueueRequest.h>
#include <aws/sqs/model/CreateQueueResult.h>
#include <aws/sqs/model/GetQueueUrlRequest.h>
#include <aws/sqs/model/GetQueueUrlResult.h>
#include <aws/sqs/model/SendMessageRequest.h>
#include <aws/sqs/model/SendMessageResult.h>
#include <aws/sqs/model/ReceiveMessageRequest.h>
#include <aws/sqs/model/ReceiveMessageResult.h>
#include <aws/sqs/model/DeleteMessageRequest.h>
#include <aws/sqs/model/DeleteQueueRequest.h>

std::string queue_name = "alan_test";
std::string queue_url;

int main() {
  Aws::SDKOptions options;
  // options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace;
  Aws::InitAPI(options);

  Aws::Auth::AWSCredentials credentials("access key", "secret key");
  Aws::Client::ClientConfiguration client_config;
  client_config.region = "cn-northwest-1";
  client_config.requestTimeoutMs = 300000;
  //  client_config.endpointOverride = "localhost:8000";
  //  client_config.scheme = Aws::Http::Scheme::HTTP;
  //  client_config.endpointOverride = "10.202.91.2:88";  // sqs服务器地址和端口
  //  client_config.verifySSL = false;
  Aws::SQS::SQSClient sqs_client(credentials, client_config);
  std::cout << "success initial !" << std::endl;
  getchar();
  //-----------------------------------------------------------------------------
  {
    // list queue
    Aws::SQS::Model::ListQueuesRequest lq_req;
    auto lq_out = sqs_client.ListQueues(lq_req);
    if (lq_out.IsSuccess()) {
      std::cout << "Queue Urls:" << std::endl;
      const auto &queue_urls = lq_out.GetResult().GetQueueUrls();
      for (const auto &iter : queue_urls) {
        std::cout << " " << iter << std::endl;
      }
    } else {
      std::cout << "Error listing queues: " << lq_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  {
    // create queue
    Aws::SQS::Model::CreateQueueRequest cq_req;
    cq_req.SetQueueName(queue_name.c_str());
    auto cq_out = sqs_client.CreateQueue(cq_req);
    if (cq_out.IsSuccess()) {
      std::cout << "Successfully created queue " << queue_name << std::endl;
    } else {
      std::cout << "Error creating queue " << queue_name << ": "
                << cq_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  {
    // // get queue url
    Aws::SQS::Model::GetQueueUrlRequest gqu_req;
    gqu_req.SetQueueName(queue_name.c_str());
    auto gqu_out = sqs_client.GetQueueUrl(gqu_req);
    if (gqu_out.IsSuccess()) {
      queue_url = gqu_out.GetResult().GetQueueUrl().c_str();
      std::cout << "Queue " << queue_name << " has url " << queue_url << std::endl;
    } else {
      std::cout << "Error getting url for queue " << queue_name << ": "
                << gqu_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  {
    // send message
    std::string msg_body = "hello, world !";
    Aws::SQS::Model::SendMessageRequest sm_req;
    sm_req.SetQueueUrl(queue_url.c_str());
    sm_req.SetMessageBody(msg_body.c_str());
    auto sm_out = sqs_client.SendMessage(sm_req);
    if (sm_out.IsSuccess()) {
      std::cout << "Successfully sent message to " << queue_url << std::endl;
    } else {
      std::cout << "Error sending message to " << queue_url << ": "
                << sm_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  Aws::SQS::Model::Message message;
  {
    // receive message
    Aws::SQS::Model::ReceiveMessageRequest rm_req;
    rm_req.SetQueueUrl(queue_url.c_str());
    rm_req.SetMaxNumberOfMessages(1);
    auto rm_out = sqs_client.ReceiveMessage(rm_req);
    if (rm_out.IsSuccess()) {
      const auto& messages = rm_out.GetResult().GetMessages();
      if (messages.size() == 0) {
        std::cout << "No messages received from queue " << queue_url << std::endl;
      } else {
        message = messages[0];
        std::cout << "Received message:" << std::endl;
        std::cout << "  MessageId: " << message.GetMessageId() << std::endl;
        std::cout << "  ReceiptHandle: " << message.GetReceiptHandle() << std::endl;
        std::cout << "  Body: " << message.GetBody() << std::endl << std::endl;
      }
    } else {
      std::cout << "Error receiving message from queue " << queue_url << ": "
                << rm_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  {
    // delete message
    Aws::SQS::Model::DeleteMessageRequest dm_req;
    dm_req.SetQueueUrl(queue_url.c_str());
    dm_req.SetReceiptHandle(message.GetReceiptHandle());
    auto dm_out = sqs_client.DeleteMessage(dm_req);
    if (dm_out.IsSuccess()) {
      std::cout << "Successfully deleted message " << message.GetMessageId()
                << " from queue " << queue_url << std::endl;
    } else {
      std::cout << "Error deleting message " << message.GetMessageId() << " from queue " << queue_url
                << ": " << dm_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  {
    // delete queue
    Aws::SQS::Model::DeleteQueueRequest dq_req;
    dq_req.SetQueueUrl(queue_url.c_str());
    auto dq_out = sqs_client.DeleteQueue(dq_req);
    if (dq_out.IsSuccess()) {
      std::cout << "Successfully deleted queue with url " << queue_url << std::endl;
    } else {
      std::cout << "Error deleting queue " << queue_url << ": "
                << dq_out.GetError().GetMessage() << std::endl;
    }
  }
  getchar();
  //----------------------------------------------------------------------------
  Aws::ShutdownAPI(options);
  return 0;
}

 CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(aws_sqs_test)

set(CMAKE_CXX_STANDARD 14)
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

find_package(AWSSDK REQUIRED)
#include_directories(${AWSSDK_INCLUDE_DIRS})
LINK_DIRECTORIES(/usr/local/lib/)
add_executable(aws_sqs_test sqs.cc)
target_link_libraries(aws_sqs_test
        libaws-cpp-sdk-core.so
        libaws-cpp-sdk-sqs.so)

参考:

https://docs.aws.amazon.com/ko_kr/sdk-for-cpp/v1/developer-guide/build-cmake.html

https://aws.amazon.com/blogs/developer/using-cmake-exports-with-the-aws-sdk-for-c/

https://aws.amazon.com/blogs/developer/developer-experience-of-the-aws-sdk-for-c-now-simplified-by-cmake/

https://docs.aws.amazon.com/

Amazon DynamoDB 入门

开发人员指南

API Reference

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值