こんにちは、motoKNです。前回 の続きとなります。
それではローカル環境にLocalStack、DockerをインストールしLambdaを実行したいと思います。
LocalStackとは、ローカル環境にAWSの模擬環境を提供するフレームワークです。
LocalStackを使うと複数のAWSサービスをローカル環境で使用することできます。詳しくは 公式 より。
Lambdaとは、あらかじめ登録しておいた関数を必要に応じて実行してくれるAWSサービスの1つです。関数を実行するためのサーバー環境を自分で用意する必要がないため、「サーバーレス」とも呼ばれています。実行環境はAWSによって用意されるためOSなどの保守・運用の手間を省くことができます。
Dockerとは、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームです。
コンテナはアプリケーションに必要な環境(本体、設定ファイルなど)を、OSレベルでパッケージ化してまとめた空間(箱)のことです。
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
続いて、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プログラムを格納するディレクトリを任意の場所に作成します。
$ 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を触ってみるのはいかがでしょうか。
関連記事
-
こんにちは、アバンセシステムのTIGERです。今回は、3Dスキャン技術を使って3Dオブジェク...
公開日:2023.04.14 更新日:2023.04.14
-
はじめまして、アバンセシステムのTIGERです。よろしくお願いします。 今回はRaspber...
公開日:2022.09.09 更新日:2022.09.09
tag : IoT Raspberry Pi
-
ラズパイ実験室 〜いろんなmicroSDで性能を測ってみた〜
こんにちは! IoT時代到来の真っ只中ということで、弊社でも数多くのセンシングデバイスを取り...
公開日:2021.04.30 更新日:2021.06.29
tag : Raspberry Pi
-
WSL2でLocalStackを使ってLambda を実行してみる~実行編~
こんにちは、motoKNです。前回 の続きとなります。 それではローカル環境にLocalSt...
公開日:2023.01.13 更新日:2023.01.13
tag : クラウド
-
WSL2でLocalStackを使ってLambda を実行してみる~構築編~
こんにちは。ラボ記事投稿2回目のmotoKNです。 私自身、今のところ業務でクラウド環境を使...
公開日:2022.09.23 更新日:2022.12.08
tag : クラウド
-
第1回 ルネサスRX64MでBLE通信をしてみよう! ~開発環境準備編
こんにちは!Matsuです。 組み込み機器の世界もいろいろと進化してきました。IoTやスマー...
公開日:2022.06.10 更新日:2022.06.10