如何在 Python 中的 Lambda 函数调用的用 C++ 实现的 AWS Lambda 层中使用 AWS 开发工具包 C++ XRay?

How to use AWS SDK C++ XRay in a AWS Lambda Layer implemented in C++ called by a Lambda function in Python?

提问人:Henrique Arantes Ferreira 提问时间:2/27/2020 最后编辑:NicPWNsHenrique Arantes Ferreira 更新时间:5/18/2023 访问量:703

问:

我的团队使用 C++ 在 Tensorflow 和 Keras 中实现了计算机视觉 (OpenCV) 和 DNN 的管道。此管道是用 Python 实现的 AWS Lambda 函数使用的 AWS 层,此层通过 Boost 库调用。

根据需要,它还创建了一个 Docker 容器,其中包含所有要求(OpenCV、Boost、Python 3.7、Serverless 等)来构建管道代码(使用 CMake)和部署。一切正常,管道和 Lambda 函数已成功构建和部署。

现在,我的挑战是:为了提高流水线的性能,我想测量这个流水线的几个步骤的持续时间,我试图使用 .aws-sdk-cpp-xray

在我开始编码之前,我在用于构建和部署管道(作为层)和 Lambda 函数的同一 Docker 容器中添加并构建了 Docker(下面是我在 Dockerfile 中添加的部分):aws-sdk-cpp

# Build AWS SDK with BUILD_ONLY XRay
RUN mkdir /tmp/${AWS_SDK_CPP}/build
WORKDIR /tmp/${AWS_SDK_CPP}/build

RUN cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D BUILD_ONLY="xray" \
        -D TARGET_ARCH=LINUX \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D ENABLE_TESTING=OFF \
        -D SIMPLE_INSTALL=OFF \
        -D BUILD_SHARED_LIBS=ON \
        -D BUILD_DEPS=ON \
        ..


RUN make -j $(nproc) && make install

然后,我将 的引用放在我的 C++ 项目(管道)中,如下所示:aws-sdk-cpp-xrayCMakeList.txt

cmake_minimum_required(VERSION 3.4.1)
set( CMAKE_CXX_STANDARD 11 )

find_package(AWSSDK REQUIRED COMPONENTS xray)
add_definitions(-DUSE_IMPORT_EXPORT)

SET(GCC_COVERAGE_COMPILE_FLAGS "-rdynamic -O3 -ffunction-sections -fdata-sections")
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})

find_package(OpenCV REQUIRED)

set( LIB_FOLDER /lib/src )
link_libraries(lib ${OpenCV_LIBS} ${AWSSDK_LINK_LIBRARIES})
target_link_libraries(lib ${OpenCV_LIBS})

include_directories(${LIB_FOLDER}/include)

file(GLOB lib_src
    "${LIB_FOLDER}/**/**.cpp"
)
include_directories(${CMAKE_INSTALL_PREFIX})

file(GLOB aws_sdk_src
    "${CMAKE_INSTALL_PREFIX}/**/**/**.*"
)
add_library(lib SHARED ${lib_src} ${aws_sdk_src})

最后,我使用管道项目内部编写了几段代码,但在编码(由于缺少样本)甚至执行 Lambda 层(测试 X-Ray 代码时)都没有成功。aws-sdk-cpp-xray

现在,当我执行使用此层(管道)的 Lambda 函数时,出现以下错误:

Runtime.ImportModuleError: Unable to import module 'functions/myfunction': /opt/lib/lib.so: undefined symbol: _ZTVN3Aws35AmazonSerializableWebServiceRequestE

  • myfunction是 Python 中的 Lambda 函数。
  • lib.so是 C++ 中的层(管道)。

所以。。。看起来执行问题是由在 Dockerfile 中安装引起的。或者可能是由管道项目文件中的条目引起的......甚至,缺少将一些 或文件添加到 Layer 包中。但是,由于缺乏文档/手册,并且没有发现有关上述错误的任何内容,因此我正在寻求一些有关使用 C++ 使用 AWS X-Ray 的示例的帮助,甚至是实现此测量的替代方案。aws-sdk-cppCMakeList.txt*.so*.a*.so*

Ps.:我也已经在 GitHub AWS SDK 主页中询问了示例。至少,你能在那里投票吗?

谢谢!

C++ 亚马逊网络服务 CMake AWS-Xray AWS- 开发工具包 CPP

评论

2赞 svebert 7/28/2022
看起来像一个可怕的建筑......建议:1) 将您的 dynmaic 库重命名为有意义的名称,以便确保 lib.so 包含您的 aws 层内容,而不是来自其他构建的内容(如 aws-sdk-cpp-xray 构建)。2) 你的 lib.so 包含“name mangled”函数,因此它是一个 C++,而不是 C .so。这使得从 .so 导入函数变得复杂。使用 nm -gD lib.so 检查您的函数是否在

答: 暂无答案