AWS SDK для C++
AWS SDK для C++
Подготовка к работе
- Создайте сервисный аккаунт.
- Назначьте сервисному аккаунту роли, необходимые для вашего проекта. Подробнее о ролях см. в документации Identity and Access Management.
- Создайте статический ключ доступа.
Примечание
Сервисный аккаунт может просматривать список бакетов только в том каталоге, в котором он был создан.
Сервисный аккаунт может выполнять действия с объектами в бакетах, которые созданы в каталогах, отличных от каталога сервисного аккаунта. Для этого назначьте сервисному аккаунту роли на нужный каталог или бакет в нем.
Установка
Для установки AWS SDK для C++ воспользуйтесь инструкцией
Настройка
-
Перейдите в директорию
~/.aws/
(для macOS и Linux) илиC:\Users\<имя_пользователя>\.aws\
(для Windows). -
Создайте файл
credentials
с аутентификационными данными для Object Storage и скопируйте в него следующую информацию:[default] aws_access_key_id = <идентификатор_статического_ключа> aws_secret_access_key = <секретный_ключ>
-
Создайте файл
config
с параметрами региона по умолчанию и скопируйте в него следующую информацию:[default] region=ru-central1
Примечание
Некоторые приложения, предназначенные для работы с Amazon S3, не позволяют указывать регион, поэтому Object Storage принимает также значение
us-east-1
.
Для доступа к Object Storage используйте эндпоинт https://storage.yandexcloud.net
.
Примеры кода
Смотри примеры кода C++
Ниже представлен пример простой программы, иллюстрирующий отличие в настройках для Yandex Object Storage.
CmakeLists
cmake_minimum_required(VERSION 3.8)
project("s3-examples")
set(CMAKE_CXX_STANDARD 20)
if(NOT BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS ON)
endif()
find_package(AWSSDK REQUIRED COMPONENTS s3 sts)
add_executable(EXAMPLE EXAMPLE_FILE_S3.cpp)
target_link_libraries(EXAMPLE ${AWSSDK_LINK_LIBRARIES}
${AWSSDK_PLATFORM_DEPS})
Файл EXAMPLE_FILE_S3.cpp
#include <aws/core/Aws.h>
#include <aws/core/auth/AWSCredentialsProvider.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 <aws/s3/model/ListObjectsRequest.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <sys/stat.h>
#include <fstream>
#include <iostream>
// Находит бакет и выводит его содержимое в консоль
bool FindTheBucket(const Aws::S3::S3Client& s3Client, const Aws::String& bucketName)
{
Aws::S3::Model::ListBucketsOutcome outcome = s3Client.ListBuckets();
Aws::S3::Model::ListObjectsRequest request;
if (outcome.IsSuccess()) {
std::cout << "Looking for a bucket named '" << bucketName << "'..." << std::endl;
Aws::Vector<Aws::S3::Model::Bucket> bucket_list = outcome.GetResult().GetBuckets();
for (Aws::S3::Model::Bucket const& bucket : bucket_list) {
if (bucket.GetName() == bucketName) {
request.WithBucket(bucketName);
std::cout << "Found the bucket." << std::endl << std::endl;
auto outcome_obj = s3Client.ListObjects(request);
std::cout << "Objects in bucket '" << bucketName << "':" << std::endl;
Aws::Vector<Aws::S3::Model::Object> objects = outcome_obj.GetResult().GetContents();
for (Aws::S3::Model::Object& object : objects) {
std::cout << object.GetKey() << std::endl;
}
return true;
}
}
std::cout << "Could not find the bucket." << std::endl << std::endl;
return true;
} else {
std::cout << "ListBuckets error: " << outcome.GetError().GetMessage() << std::endl;
}
return false;
}
int main(int argc, char* argv[])
{
Aws::SDKOptions options;
Aws::InitAPI(options);
{
// Секция настроек для использования AWS SDK с Object Storage
Aws::Client::ClientConfiguration config;
config.region = Aws::String("ru-central1");
config.endpointOverride = Aws::String("storage.yandexcloud.net");
Aws::String bucket_name = "bucket_name";
// Инициализация подключения
Aws::S3::S3Client s3_client(config);
FindTheBucket(s3_client, bucket_name);
}
Aws::ShutdownAPI(options);
return 0;
}