AWS LambdaでC++を動かす

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で動くのであれば用途もあるのではないでしょうか。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)