Apache Ozone上にあるデータにC++でアクセスしてみます。Ozoneの準備は、「Ozoneを試す」を参照ください。
ライブラリのビルド
https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/setup-linux.htmlを参考にビルドしていきます。 まず、ダウンロードします。
$ git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp.gitこの日の時点では、1.4GBありました。大きいですね。 ビルドにはUbuntuでは libcurl4-openssl-dev, libssl-dev, uuid-dev, zlib1g-dev をインストールしておく必要があるようです。 ビルドします。
$ cd aws-sdk-cpp $ mkdir sdk_build $ cd sdk_build $ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../sdk -DBUILD_ONLY="s3" .. $ make $ make install
Ozoneにアクセス
https://docs.aws.amazon.com/sdk-for-cpp/v1/developer-guide/build-cmake.htmlなどを参考に、ビルドしたライブラリを使ってOzoneにアクセスしてみます。 すべてのBucketのすべてのObjectを読み込んで標準出力に出力するソースコードmain.cppは次の通りです。 なお、テキストデータの表示のためヌル終端していますが、単に読み込むだけであれば不要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <aws/core/Aws.h>
#include <aws/core/utils/logging/LogLevel.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/ListObjectsRequest.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <iostream>
class Initializer{
public:
Initializer(){
options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug;
Aws::InitAPI(options);
}
~Initializer(){
Aws::ShutdownAPI(options);
}
private:
Aws::SDKOptions options;
};
int main(void){
Initializer initializer;
Aws::Client::ClientConfiguration config;
config.endpointOverride = "http://localhost:9878";
// client cannot access objects if useVirtualAddressing is true
Aws::S3::S3Client client(config, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false/*useVirtualAddressing*/);
Aws::S3::Model::ListBucketsOutcome buckets = client.ListBuckets();
if(!buckets.IsSuccess()){
std::cout << "Fail to get buckets" << std::endl;
return 1;
}
Aws::S3::Model::ListBucketsResult listBucketsResult = buckets.GetResult();
for(const Aws::S3::Model::Bucket &bucket : listBucketsResult.GetBuckets()){
std::cout << "Bucket name: " << bucket.GetName() << std::endl;
// Get objects
Aws::S3::Model::ListObjectsRequest request;
request.WithBucket(bucket.GetName());
Aws::S3::Model::ListObjectsOutcome listObjectsOutcome = client.ListObjects(request);
if(!listObjectsOutcome.IsSuccess()){
std::cout << "Fail to get objects" << std::endl;
continue;
}
Aws::S3::Model::ListObjectsResult listObjectsResult = listObjectsOutcome.GetResult();
std::cout << "Bucket name: " << listObjectsResult.GetName() << std::endl;
std::cout << "Max keys: " << listObjectsResult.GetMaxKeys() << std::endl;
const Aws::Vector<Aws::S3::Model::Object> &objects = listObjectsResult.GetContents();
std::cout << "# of objects: " << objects.size() << std::endl;
for(const Aws::S3::Model::Object& object : objects){
// Get the attributes of the object
std::cout << "Object key: " << object.GetKey() << std::endl;
long long size = object.GetSize();
std::cout << "Object value size: " << size << std::endl;
// Get the value of the object
Aws::S3::Model::GetObjectRequest objectRequest;
objectRequest.SetBucket(listObjectsResult.GetName());
objectRequest.SetKey(object.GetKey());
Aws::S3::Model::GetObjectOutcome getObjectOutcome = client.GetObject(objectRequest);
if(!getObjectOutcome.IsSuccess()){
std::cout << "Fail to get content" << std::endl;
continue;
}
Aws::S3::Model::GetObjectResult getObjectResult = getObjectOutcome.GetResultWithOwnership();
long long contentLength = getObjectResult.GetContentLength();
std::cout << "Object value size: " << contentLength << std::endl;
Aws::IOStream& stream = getObjectResult.GetBody();
std::vector<char> buff(contentLength+1); // +1 for null terminator
stream.read(&buff[0], buff.size());
std::replace(buff.begin(), buff.end(), '\n', '!');
std::cout << "Object value: " << &buff[0] << std::endl;
}
}
return 0;
}
|
cmake_minimum_required(VERSION 3.3) set(CMAKE_CXX_STANDARD 11) project(s3) add_executable(s3 main.cpp) target_include_directories(s3 PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../aws-sdk-cpp/sdk/include) target_link_libraries(s3 ${CMAKE_CURRENT_SOURCE_DIR}/../aws-sdk-cpp/sdk/lib/libaws-cpp-sdk-s3.so ${CMAKE_CURRENT_SOURCE_DIR}/../aws-sdk-cpp/sdk/lib/libaws-cpp-sdk-core.so)最初に準備したaws-sdk-cppが、このファイルのあるディレクトリの親ディレクトリ内にあることを前提としています。
┬ aws-sdk-cpp └ example ├CMakeLists.txt └main.cpp今、exampleディレクトリにいるとして、
$ mkdir build $ cd build $ cmake .. $ makeでビルドし、作成されるs3コマンドを実行すると、
$ ./s3 Bucket name: bucket1 Bucket name: bucket1 Max keys: 1000 # of objects: 1 Object key: test.txt Object value size: 10 Object value size: 10 Object value: test test!と表示されます。正しく読み込めました。
参考
https://qiita.com/kai_kou/items/095e409539fbe77f0d59
0 件のコメント :
コメントを投稿