LoginSignup
9
6

More than 5 years have passed since last update.

この記事は「ユニークビジョン株式会社 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で動くのであれば用途もあるのではないでしょうか。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6