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関数を作成します。
基本的には前述のaws-lambda-cppに記載のある手順に従うことになります。
ただし、ビルドはLinux上で行う必要があるため、ここでは以下のようなDockerを用意します。
以下のようなコマンドでビルド・起動します。
ここもチュートリアルに従います。
チュートリアルに従って、AWS LambdaでC++を動かすことが出来ました。
今でこそRustのような現代的な言語に立場を奪われつつありますが、過去の資産が充実しているC++がServerlessで動くのであれば用途もあるのではないでしょうか。
この記事は「ユニークビジョン株式会社 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で動くのであれば用途もあるのではないでしょうか。
コメント
コメントを投稿