使用Aws-cpp-sdk API

一、对sdk的编译前准备

1、软件需求

此文档针对于在Linux系统上使用源码进行编译开发

操作系统使用原生的contos7Linux。

机器配置建议 内存8G以上,CPU 4个 以上

软件需求:

  • GCC 4.9.0 及以上版本
  • Cmake 3.12以上 3.21以下
  • libcurl-devel openssl-devel libuuid-devel pulseaudio-libs-devel

2、安装gcc

先下载相关依赖,依次安装即可。

3、cmake安装

下载对应的安装包,然后解压,进入文件夹执行 ./configure即可

下载连接:https://cmake.org/download/

4、安装其他

安装libcurl-devel

Yum install libcurl-devel

安装openssl

yum install –y openssl-devel

二、aws-cpp-sdk

1、下载源码包

github源码地址 https://github.com/aws/aws-sdk-cpp

使用git的clone命令从github上进行克隆

git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp

这里因为源码包含子模块,需要进行迭代下载,使用–recurse-submodules拉取子模块

下载后需要检查是否下载完全,主要是crt文件夹下的各文件。

ps:如果在Linux上使用git 无法克隆下来(网络原因很容易失败),可以在windows上安装git,然后挂上vpn进行clone 最后检查是否成功clone完全,如果还要部分缺少,可手动下载补全。

2、构建源码

在下载完sdk代码后 在sdk源目录之外创建一个文件夹来构建文件

mkdir sdk_build
cd sdk_build

运行cmake构造文件,这里再进行构建时,指定的安装目录为 /usr/local 可以指定构建Debug还是Release版本,在构建时可以选择构建全部还是构建特定的服务,这里建议仅构建自己需要的服务。

cmake ../aws-sdk-cpp -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/usr/local/ -DCMAKE_INSTALL_PREFIX=/usr/local/ -DBUILD_SHARED_LIBS=on -DBUILD_ONLY="s3" -DENABLE_TESTING=OFF

这里需要指定在编译完成后不运行测试代码,因为如果运行实例代码有没有通过的,就会影响源码的安装,造成无法成功安装源码

make
make install

Q:

在make时如果需要一下问题此问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EjwDNc2G-1658300042218)(image\image-20220720145050813.png)]

是因为这里用的还是原来的gcc文件,将新的libstdc++进行链接即可

find / -name "libstdc++.so*"

查找编译生成的最新动态库

找到最新的动态库路径,然后使用cp命令将其复制到/usr/lib64目录下,切换到/usr/lib64 删除原来的软连接rm -rf libstdc++.so.6 然后将默认库的软连接指向最新库 ln -s libstdc++.so.6.0.25 libstdc++.so.6

在make执行完后,执行make install 进行安装

查看/usr/local/lib64 可以看到生产的库文件

三、测试

编写测试代码进行测试

1、S3测试

新建一个文件夹用于代码测试

mkdir test_code 
cd test_code 
touch main.cpp CMakeLists.txt

编写main.cpp内容

#include <aws/core/Aws.h>
#include <aws/core/utils/logging/LogLevel.h>
#include <aws/s3/S3Client.h>
#include <aws/core/auth/AWSCredentialsProviderChain.h>
#include <iostream>
int main()
{
    Aws::SDKOptions options;
    options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Debug;
    Aws::InitAPI(options);
    {
        Aws::Client::ClientConfiguration clientConfig;
        clientConfig.region = "cn-north-1";//aws region
        clientConfig.verifySSL = false;
        clientConfig.scheme = Aws::Http::Scheme::HTTP;
		clientConfig.endpointOverride="s3.cn-north-1.amazonaws.com.cn";//server endpoint
        Aws::Auth::AWSCredentials cred;
        cred.SetAWSAccessKeyId("xxxxxx");//your accesskey
        cred.SetAWSSecretKey("xxxxxx");//your secrekey
        Aws::S3::S3Client _client(cred, clientConfig, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false);
		auto outcome = _client.ListBuckets();
        if (outcome.IsSuccess()) {
            std::cout << "Found " << outcome.GetResult().GetBuckets().size() << " buckets\n";
            for (auto&& b : outcome.GetResult().GetBuckets()) {
                std::cout << b.GetName() << std::endl;
            }
        }
        else {
            std::cout << "Failed with error: " << outcome.GetError() << std::endl;
        }
    }
    Aws::ShutdownAPI(options);
    return 0;
}

编写CMakeLists.txt内容

cmake_minimum_required(VERSION 3.3)
set(CMAKE_CXX_STANDARD 11)
project(test LANGUAGES CXX)

message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
set(BUILD_SHARED_LIBS ON CACHE STRING "Link to shared libraries by default.")

#Load required services/packages: This basic example uses S3.
find_package(AWSSDK REQUIRED COMPONENTS s3)
add_executable(${PROJECT_NAME} "main.cpp") 

set_compiler_flags(${PROJECT_NAME})
set_compiler_warnings(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} ${AWSSDK_LINK_LIBRARIES})

然后创建一个文件夹build,再此文件夹中使用cmake进行构建

mkdir build
cd build 
cmake ../
make

Q:

在cmake时遇到此错误

这是因为Amazon Linux 2 是一个基于 yum 的发行版,它有一个用于 OpenSSL 加密静态库的专用包,称为openssl-static(未包含在开发包中)。

使用sudo yum install openssl-static 安装 ,然后再次cmake

在make生成可执行文件后,执行程序时出现如下错误:

这里是没有找到共享库,于是使用export来配置一下环境变量,使得程序可以正确找到库。

使用export是暂时修改,仅限本次的当前终端有效。可以通过修改CMakeLists文件或者修改系统环境变量等方法来让程序能够顺利找到库即可。

执行结果如下:

2、EC2测试

因为前面只安装了S3的源码,这里先进入sdk_build文件夹编译安装EC2的源码

cmake ../aws-sdk-cpp -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=/usr/local/ -DCMAKE_INSTALL_PREFIX=/usr/local/ -DBUILD_SHARED_LIBS=on -DBUILD_ONLY="ec2" -DENABLE_TESTING=OFF

因为EC2的源码包很大,在进行make编译动态库的时候,会花费较长的时间,所以建议将机器性能设置的高一些。

编写代码使用sdk的api为aws中的ec2实例的卷创建一个快照

main.cpp

#include <aws/core/Aws.h>
#include <aws/ec2/EC2Client.h>
#include <aws/ec2/model/CreateSnapshotRequest.h>
#include <aws/ec2/model/CreateSnapshotResponse.h>
#include <aws/core/auth/AWSCredentialsProviderChain.h>
#include <iostream>

int main()
{
  Aws::SDKOptions options;
  Aws::InitAPI(options);
  {
	  Aws::Client::ClientConfiguration clientConfig;
        clientConfig.region = "cn-north-1";
      	//don't known why when i add endpointOverride info ,the program output Couldn't connect to server
        //clientConfig.verifySSL = false;
        //clientConfig.scheme = Aws::Http::Scheme::HTTP;
		//clientConfig.endpointOverride="ec2messages.cn-north-1.amazonaws.com.cn";
        Aws::Auth::AWSCredentials cred;
        cred.SetAWSAccessKeyId("xxxx");
        cred.SetAWSSecretKey("xxxx");
    Aws::EC2::EC2Client ec2(cred,clientConfig);
    Aws::EC2::Model::CreateSnapshotRequest cr_sr;
	cr_sr.SetVolumeId("your volume Id");
    auto cs_out = ec2.CreateSnapshot(cr_sr);

    if (cs_out.IsSuccess())
    {
      std::cout << "Successfully create snapshop from volumes as:";
      std::cout << " " << cs_out.GetResult().GetVolumeId()<<"  size :"<<cs_out.GetResult().GetVolumeSize();
      std::cout << std::endl;
    }
    else
    {
      std::cout << "Error describing volumes" << cs_out.GetError().GetMessage()
        << std::endl;
    }
  }
  Aws::ShutdownAPI(options);
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.3)
set(CMAKE_CXX_STANDARD 11)
project(test LANGUAGES CXX)

message(STATUS "CMAKE_PREFIX_PATH: ${CMAKE_PREFIX_PATH}")
set(BUILD_SHARED_LIBS ON CACHE STRING "Link to shared libraries by default.")
# Locate the aws sdk for c++ package.
find_package(AWSSDK REQUIRED COMPONENTS elasticbeanstalk ec2)

add_executable(${PROJECT_NAME} "main.cpp") 

set_compiler_flags(${PROJECT_NAME})
set_compiler_warnings(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} ${AWSSDK_LINK_LIBRARIES})

ps:这里可以看到除了需要ec2这个包,还需要elasticbeanstalk这个包,于是也需要在源码里对这个包进行安装。

执行代码

创建了一个新的快照

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2HQGjL0-1658300042219)(image\image-20220720144258709.png)]

Logo

亚马逊云科技开发者 Build On 是由亚马逊团队策划、开发者社区联合打造的动手实操系列活动。

更多推荐