Lambda で各種言語を試す

Lambda にて Ruby 2.5 がサポートされたのに加え、Bring Your Own Language Runtime という形でお好きな言語のランタイムの導入がサポートされました。各種言語での Hello, World を試しておきます。

Ruby 2.5

ランタイムとして Ruby 2.5 が選択できるようになっているので、その状態で Lambda 関数を作成します。

def lambda_handler(event:, context:)
    'Hello, World!'
end

Runtime API を使う

新機能 – AWS Lambda :あらゆるプログラム言語への対応と一般的なコンポーネントの共有
に記載があるように Lambda Layers と Lambda Runtime API が追加されました。それぞれどういうものであるか、引用します。

  • Lambda Layers, 複数の関数で共用されるコードやデータをセンタライズし管理するものです
  • Lambda Runtime API, あなたが開発する、どんなプログラム言語や特定のバージョンでも簡単に利用できるようになるものです

このうち Lambda Runtime API を利用して、様々なプログラム言語で Lambda 関数を作ってみたいと思います。

Bash

$ aws lambda create-function \
    --function-name BashHelloWorld \
    --role arn:aws:iam::472311553902:role/lambda-admin \
    --runtime provided \
    --timeout 15 \
    --memory-size 128 \
    --handler package \
    --zip-file fileb://package.zip
$ aws lambda invoke --function-name CppHelloWorld --invocation-type RequestResponse /tmp/output
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
$ cat /tmp/output
Hello, World!

C/C++

C/C++ に関しては Introducing the C++ Lambda Runtime
を参考にしつつ進めました。

まずは Linux ベースの環境を用意します。推奨されているのは Amazon Linux なので EC2 インスタンスをたてます。そして必要そうなものを入れます。

# on EC2 Instance (AMI: Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type ami-063fa8762cdc9a5a6)
$ sudo yum update -y
$ sudo yum install gcc64-c++ libcurl-devel
$ export CC=gcc64
$ export CXX=g++64
$ sudo yum install git
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-amazon-linux/6.4.1/lto-wrapper
Target: x86_64-amazon-linux
Configured with: ../configure --enable-bootstrap --enable-languages=c,c++,fortran,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-default-libstdcxx-abi=gcc4-compatible --with-isl --enable-libmpx --enable-libsanitizer --enable-libcilkrts --enable-libatomic --enable-libquadmath --enable-libitm --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-amazon-linux
Thread model: posix
gcc version 6.4.1 20170727 (Red Hat 6.4.1-1) (GCC)

続いて、ランタイムをビルドして ~/out に静的ライブラリとして配置するために次のように進めます

$ git clone https://github.com/awslabs/aws-lambda-cpp.git
$ cd aws-lambda-cpp
$ mkdir build
$ cd build
$ cmake3 .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF \
    -DCMAKE_INSTALL_PREFIX=~/out
$ make && make install

そして、Lambda 関数を作成します

$ mkdir hello-world-cpp
$ cd hello-world-cpp
$ vi main.cpp
$ cat main.cpp
// main.cpp
#include <aws/lambda-runtime/runtime.h>

using namespace aws::lambda_runtime;

invocation_response my_handler(invocation_request const& request)
{
   return invocation_response::success("Hello, World!", "application/json");
}

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

$ vi CMakeList.txt
$ cat CMakeList.txt
cmake_minimum_required(VERSION 3.5)
set(CMAKE_CXX_STANDARD 11)
project(hello LANGUAGES CXX)

find_package(aws-lambda-runtime REQUIRED)
add_executable(${PROJECT_NAME} "main.cpp")
target_link_libraries(${PROJECT_NAME} PUBLIC AWS::aws-lambda-runtime)
aws_lambda_package_target(${PROJECT_NAME})

$ mkdir build
$ cd build
$ cmake3 .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=~/out
$ make
$ make aws-lambda-package-hello

最後にデプロイを行います

$ aws lambda create-function \
    --function-name CppHelloWorld \
    --role arn:aws:iam::😇 \
    --runtime provided \
    --timeout 15 \
    --memory-size 128 \
    --handler hello \
    --zip-file fileb://hello.zip
$ aws lambda invoke --function-name CppHelloWorld --invocation-type RequestResponse /tmp/output
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
$ cat /tmp/output
Hello, World!

Bash

公式ドキュメント: Tutorial – Publishing a Custom Runtime に沿って簡単に作れます。ネイティブに依存するバイナリコードが含まれないので手元マシンから作成しても大丈夫かと思いますが、Windows の場合、パーミッションに気をつける必要がありそうです。

ひとまず bootstrap ファイルを作成します。これはドキュメントより引用です。

#!/bin/sh

set -euo pipefail

# Initialization - load function handler
source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh"

# Processing
while true
do
  HEADERS="$(mktemp)"
  # Get an event
  EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
  REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

  # Execute the handler function from the script
  RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")

  # Send the response
  curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "$RESPONSE"
done

つづいて、関数の実体となるファイルを作成します。

function handler () {
    echo 'Hello, Wolrd!'
}

最後にデプロイを行います

$ aws lambda create-function \
    --function-name BashHelloWorld \
    --role arn:aws:iam::😇 \
    --runtime provided \
    --timeout 15 \
    --memory-size 128 \
    --handler function.handler \
    --zip-file fileb://function.zip
$ aws lambda invoke --function-name BashHelloWorld --invocation-type RequestResponse /tmp/output
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
$ cat /tmp/output
Hello, World!

COBOL

TODO

D

TODO

Erlang

TODO

Elixir

FORTRAN

TODO

Haskell

TODO

PHP

TODO

Rust

TODO

Swift

TODO

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください