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