Edited at

AWS LambdaでC++を動かす

この記事は「ユニークビジョン株式会社 Advent Calendar 2018」の1日目記事です。

カレンダーのURLはこちら

https://qiita.com/advent-calendar/2018/uniquevision


はじめに

re:Invent 2018にてAWS Lambdaの新機能、Custom Runtimeが発表されました。

この機能は、Custom Runtimeを用意することで任意の言語でLambdaを使用できるようにするものです。

Custom Runtimeは自前で実装しても良いですし、AWSによって提供されているものもあります。

以下は2018/11/30 18:00時点で公開されているCustom Runtimeです。

- https://github.com/awslabs/aws-lambda-cpp

- https://github.com/awslabs/aws-lambda-rust-runtime

この記事では、公開されているC++のCustom Runtimeを用いてC++で実装されたLambda関数を作成します。


Runtimeの作成

基本的には前述のaws-lambda-cppに記載のある手順に従うことになります。

ただし、ビルドはLinux上で行う必要があるため、ここでは以下のようなDockerを用意します。


Dockerfile

FROM alpine:latest

RUN apk update && apk add cmake make git g++ bash curl-dev zlib-dev zip

WORKDIR /usr
RUN git clone https://github.com/awslabs/aws-lambda-cpp-runtime.git && \
cd aws-lambda-cpp-runtime && \
mkdir build && \
cd build && \
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=~/lambda-install && \
make && make install

WORKDIR /home


以下のようなコマンドでビルド・起動します。

$ docker build -t aws_lambda_cpp .

$ docker run --rm -it -v `pwd`:/home aws_lambda_cpp:latest /bin/bash


Lambda関数を作成

ここもチュートリアルに従います。


  • 以下の2ファイルを用意します


CMakeLists.txt

cmake_minimum_required(VERSION 3.5)

set(CMAKE_CXX_STANDARD 11)
project(demo LANGUAGES CXX)
find_package(aws-lambda-runtime)
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} PRIVATE AWS::aws-lambda-runtime)
target_compile_features(${PROJECT_NAME} PRIVATE "cxx_std_11")
target_compile_options(${PROJECT_NAME} PRIVATE "-Wall" "-Wextra")

# this line creates a target that packages your binary and zips it up
aws_lambda_package_target(${PROJECT_NAME})



main.cpp

#include <aws/lambda-runtime/runtime.h>


using namespace aws::lambda_runtime;

static invocation_response my_handler(invocation_request const& req)
{
if (req.payload.length() > 42) {
return invocation_response::failure("error message here"/*error_message*/,
"error type here" /*error_type*/);
}

return invocation_response::success("json payload here" /*payload*/,
"application/json" /*MIME type*/);
}

int main()
{
run_handler(my_handler);
return 0;
}



  • Dockerコンテナ内で以下の通りに実行します

$ mkdir build

$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=~/lambda-install
$ make
$ make aws-lambda-package-demo


  • デプロイします。Roleは適切に設定してください。

$ aws lambda create-function --function-name demo \

--role <specify role arn from previous step here> \
--runtime provided --timeout 15 --memory-size 128 \
--handler demo --zip-file fileb://demo.zip


  • デプロイが成功したら、Lambda関数を実行します。

$ aws lambda invoke --function-name demo --payload '{"answer":42}' output.txt


  • 正常に動いていたら以下のように表示されるかと思います。


標準出力

{

"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}


output.txt

json payload here



まとめ

チュートリアルに従って、AWS LambdaでC++を動かすことが出来ました。

今でこそRustのような現代的な言語に立場を奪われつつありますが、過去の資産が充実しているC++がServerlessで動くのであれば用途もあるのではないでしょうか。