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/