Avance.Lab

実験

WSL2でLocalStackを使ってLambda を実行してみる~実行編~

公開日:2023.01.13 更新日:2023.01.13

tag: クラウド

こんにちは、motoKNです。前回 の続きとなります。

それではローカル環境にLocalStack、DockerをインストールしLambdaを実行したいと思います。

構成図

LocalStackとは

LocalStackとは、ローカル環境にAWSの模擬環境を提供するフレームワークです。

LocalStackを使うと複数のAWSサービスをローカル環境で使用することできます。詳しくは 公式 より。

Lambdaとは

Lambdaとは、あらかじめ登録しておいた関数を必要に応じて実行してくれるAWSサービスの1つです。関数を実行するためのサーバー環境を自分で用意する必要がないため、「サーバーレス」とも呼ばれています。実行環境はAWSによって用意されるためOSなどの保守・運用の手間を省くことができます。

Dockerとは

Dockerとは、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。

コンテナはアプリケーションに必要な環境(本体、設定ファイルなど)を、OSレベルでパッケージ化してまとめた空間(箱)のことです。
Dockerについては多くのサイトで紹介されていますので、興味があれば調べてみてください。

Dockerのインストール

それでは、Ubuntuの環境にDockerをインストールしていきます。

[スタートメニュー]ー[Ubuntu 20.04 on Windows]を選択し、Ubuntuの環境を立ち上げます。Ubuntuをインストールしていない方は 前回 の記事をご確認ください。

Dockerをインストールします。Docker 公式サイト 参照

パッケージをインストールします。

$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release

GPG鍵を追加します。

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

リポジトリをセットアップします。

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Dockerエンジンをインストールします。

$ sudo apt update
$ sudo apt -y install docker-ce docker-ce-cli containerd.io

Dockerコンポーズをインストールし、実行権限を付与します。

$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

正しくインストールできたか確認します。

$ docker-compose --version
Docker Compose version v2.10.2

LocalStackのインストールと起動

続いて、Ubuntuの環境にLocalStackをインストールしていきます。

AWS CLIをインストールします。

$ pip3 install awscli-local
aws-cli/2.7.30 Python/3.9.11 Linux/5.10.16.3-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off

LocalStack接続用のダミー設定を作成します。

$ aws configure --profile=localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-east-1
Default output format [None]: json

LocalStack用のディレクトリを任意の場所に作成します。

$ mkdir localstack

上で作成したディレクトリに移動して、GitHubからLocalStackのリポジトリをコピーします。

$ git clone https://github.com/localstack/localstack.git

docker-compose.ymlのあるディレクトリに移動しLocalStackを起動します。

$ sudo service docker start
[sudo] password for {ユーザー名}:{パスワード入力}
 * Starting Docker: docker  [OK]
$ docker-compose up -d
[+] Running 1/1
 ⠿ Container localstack_main  Started

Lambdaプログラム作成と実行

Lambdaプログラムは、引数なしと引数ありのものを用意したいと思います。

まずは、引数なしのLambdaプログラムを格納するディレクトリを任意の場所に作成します。

$ mkdir lambda-test
$ cd lambda-test

引数なしのLambdaプログラムを作成します。(ファイル名はmyfunction1.py)

def lambda_handler(event, context):
    print(event)
    return 'Lambda Response OK'

作成したLambdaプログラム(myfunction1.py)をzipで固めます。

$ zip myfunction1.zip myfunction1.py
  adding: myfunction1.py (deflated 13%)

Lambda関数を作成します。

$ aws lambda create-function --function-name="test-function" --runtime=python3.8 --role="test001" --handler=myfunction1.lambda_handler --zip-file fileb://myfunction1.zip --endpoint-url=http://localhost:4566 --profile=localstack
{
    "FunctionName": "test-function",
    "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:test-function",
    "Runtime": "python3.8",
    "Role": "test001",
    "Handler": "myfunction1.lambda_handler",
    "CodeSize": 252,
    "Description": "",
    "Timeout": 3,
    "LastModified": "2022-11-25T06:48:18.251+0000",
    "CodeSha256": "S1zCF0pyKHZX2/AGQqkJ3QPLI/5qTFatCI4aBLKmPs4=",
    "Version": "$LATEST",
    "VpcConfig": {},
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "34b07cc0-74af-4371-a67b-1baa2cd4fe41",
    "State": "Active",
    "LastUpdateStatus": "Successful",
    "PackageType": "Zip",
    "Architectures": [
        "x86_64"
    ]
}

Lambdaを実行します。実行が成功した場合 StatusCode:200 が出力されます。

$ aws lambda invoke --function-name test-function output.log --endpoint-url=http://localhost:4566 --profile=localstack
{
    "StatusCode": 200,
    "LogResult": "",
    "ExecutedVersion": "$LATEST"
}

Lambdaプログラムの戻り値をログで確認します。

$ cat output.log
"Lambda Response OK"

続いて、引数ありのLambdaプログラムを格納するディレクトリを任意の場所に作成します。

$ mkdir lambda-arg-test
$ cd lambda-arg-test

引数ありのLambdaプログラムを作成します。(ファイル名はmyfunction2.py)

import json
def lambda_handler(event, context):
    x = int(event["x"])
    y = int(event["y"])
    print("x = " + str(x))
    print("y = " + str(y))
    ans = {"result" : x * y}
    return ans

作成したLambdaプログラム(myfunction2.py)をzipで固めます。

$ zip myfunction2.zip myfunction2.py
  adding: myfunction2.py (deflated 37%)

Lambda関数を作成します。

$ aws lambda create-function --function-name="test-function2" --runtime=python3.8 --role="test001" --handler=myfunction2.lambda_handler --zip-file fileb://myfunction2.zip --endpo
int-url=http://localhost:4566 --profile=localstack
{
    "FunctionName": "test-function2",
    "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:test-function2",
    "Runtime": "python3.8",
    "Role": "test001",
    "Handler": "myfunction2.lambda_handler",
    "CodeSize": 305,
    "Description": "",
    "Timeout": 3,
    "LastModified": "2022-11-25T07:12:14.449+0000",
    "CodeSha256": "FOt6VVOPLBGzAXHjmQS3/Gh8z3cU1z1WSZhBxuROoMg=",
    "Version": "$LATEST",
    "VpcConfig": {},
    "TracingConfig": {
        "Mode": "PassThrough"
    },
    "RevisionId": "82fe5851-faee-409f-b598-ac79aea0b9bb",
    "State": "Active",
    "LastUpdateStatus": "Successful",
    "PackageType": "Zip",
    "Architectures": [
        "x86_64"
    ]
}

Lambdaを実行します。引数に ‘{“x”: 2,”y”: 5}’ を指定しています。

aws lambda invoke --cli-binary-format raw-in-base64-out --function-name test-function2 --payload '{"x": 2,"y": 5}' output.log --endpoint-url=http://localhost:4566 --profile=localstack
{
    "StatusCode": 200,
    "LogResult": "",
    "ExecutedVersion": "$LATEST"
}

AWS CLIv1を使用していると、上記コマンドで失敗してしまいます。()

失敗した場合は、–cli-binary-format raw-in-base64-out を削除してみてください。

Lambdaプログラムの戻り値をログで確認します。

$ cat output.log
{"result":10}

LocalStackを使用してLambda関数の戻り値をログで確認することができました。

今回は使用していませんが、API Gatewayを使用するとHTTPメソッド(GET、POST)でLambda関数に値を渡したり受け取ったりことができます。私自身はこれまで AWSサービスを使う機会は少なかったですが、LocalStackで AWSサービス(エミュレート)に触れるよい機会だったと思います。

私のように AWSサービスに触れる機会が少ない方はローカル環境で手軽にAWSサービスを体感ができるLocalStackを触ってみるのはいかがでしょうか。

motoKN

ヘッドスパと自転車で子供と出掛けるのが大好き。
疲れない体が欲しい40代。

関連記事