C/C++

C++ 的 AWS SDK 開發套件使用教學與範例

介紹如何安裝與使用 C++ 的 AWS 開發套件,開發 AWS 服務相關的 C++ 應用程式。

C++ 的 AWS 開發套件(SDK)可讓開發者在 C++ 語言中使用 AWS 的各種服務,開發整合式的 C++ 應用程式。本篇測試環境為 Ubuntu Linux 18.04。

安裝 AWS SDK for C++

安裝一些編譯所需的必要套件:

# 安裝必要套件
sudo apt-get install libssl-dev zlib1g-dev libcurl4-openssl-dev

AWS SDK for C++ 的 GitHub 網站下載原始碼:

# 下載 AWS SDK for C++
git clone https://github.com/aws/aws-sdk-cpp.git

以 CMake 編譯 AWS SDK for C++:

# 編譯 AWS SDK for C++
mkdir build
cd build
cmake ../aws-sdk-cpp/ -DCMAKE_BUILD_TYPE=Debug
make -j48

編譯完成後,安裝 AWS SDK for C++:

# 安裝 AWS SDK for C++
sudo make install

開發與編譯 AWS SDK for C++ 應用程式

以下是一個 AWS S3 檔案上傳與下載的簡單範例:

#include <aws/s3/S3Client.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/core/Aws.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <iostream>

int main() {
  Aws::SDKOptions options;
  Aws::InitAPI(options);
  {
    // 自訂 S3 End Point
    const Aws::String endPoint = "YOUR.END.POINT";

    // S3 Bucket 名稱
    const Aws::String bucketName = "YOUR_BUCKET";

    // 檔案名稱與內容
    const Aws::String objectName = "hello.txt";
    const std::string objectContent = "Hello, world.";

    // 認證資訊
    const Aws::String accessKey = "ASFHDGN345JGS436FG53";
    const Aws::String secretKey = "45G54d4cbGDF56bnFsfdgh489dfGHDdfgDFGHs4e";

    // 建立 S3 Client
    Aws::Client::ClientConfiguration config;
    config.verifySSL = false;
    Aws::S3::S3Client s3Client(Aws::Auth::AWSCredentials(accessKey, secretKey), config);

    // 設定 S3 End Point
    s3Client.OverrideEndpoint(endPoint);

    // 建立上傳 Object 至 S3 的請求
    Aws::S3::Model::PutObjectRequest putObjectRequest;
    putObjectRequest.SetBucket(bucketName);
    putObjectRequest.SetKey(objectName);

    // 建立資料輸入串流,可為任何串流,例如 fstream、stringstream 等
    const std::shared_ptr<Aws::IOStream> inputStream = Aws::MakeShared<Aws::StringStream>("");
    *inputStream << objectContent.c_str();

    // 設定上傳至 S3 的資料輸入串流
    putObjectRequest.SetBody(inputStream);

    // 將 Object 上傳至 S3
    Aws::S3::Model::PutObjectOutcome putObjectOutcome = s3Client.PutObject(putObjectRequest);

    if(putObjectOutcome.IsSuccess()) {
      std::cout << "上傳成功" << std::endl;
    } else {
      std::cout << "上傳失敗:" << putObjectOutcome.GetError().GetExceptionName()
                << " " << putObjectOutcome.GetError().GetMessage() << std::endl;
    }

    // 建立從 S3 下載 Object 的請求
    Aws::S3::Model::GetObjectRequest getObjectRequest;
    getObjectRequest.SetBucket(bucketName);
    getObjectRequest.SetKey(objectName);

    // 從 S3 下載 Object
    Aws::S3::Model::GetObjectOutcome getObjectOutcome = s3Client.GetObject(getObjectRequest);

    if(getObjectOutcome.IsSuccess()) {
      std::cout << "下載成功,資料內容:" << std::endl;
      std::cout << getObjectOutcome.GetResult().GetBody().rdbuf() << std::endl;
    } else {
      std::cout << "下載失敗:" << getObjectOutcome.GetError().GetExceptionName() << " "
                << getObjectOutcome.GetError().GetMessage() << std::endl;
    }
  }
  Aws::ShutdownAPI(options);
  return 0;
}

編譯時需要搭配以下這一個 CMakeLists.txt 設定檔:

cmake_minimum_required(VERSION 3.8)

# 使用 Shared 的 AWS C++ SDK 函式庫(預設狀況)
option(BUILD_SHARED_LIBS "Build shared libraries" ON)

# 設定專案名稱
project(Hello)

# 尋找並引入 AWS SDK for C++ 函式庫 S3 套件
find_package(AWSSDK REQUIRED COMPONENTS s3)

# 增加一個執行檔
add_executable(hello hello.cpp)

# 以 C++11 標準編譯
target_compile_features(hello PUBLIC cxx_std_11)

# 定義執行檔連結方式
target_link_libraries(hello ${AWSSDK_LINK_LIBRARIES})

關於 AWS SDK for C++ 的其他範例可參考 AWS SDK for C++ Code Examples 的網頁。

參考資料:AWS Developer BlogAWS SDK for C++ Developer GuideAWS SDK for C++ Developer Guide

Share
Published by
Office Guide
Tags: Amazon S3

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

9 個月 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

9 個月 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

9 個月 ago

Windows 使用 TPM 虛擬智慧卡保護 SSH 金鑰教學與範例

本篇介紹如何在 Windows...

10 個月 ago

Linux 以 Shamir’s Secret Sharing 分割保存金鑰教學與範例

介紹如何在 Linux 中使用...

11 個月 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

11 個月 ago