キーワードで検索

今日を知り、明日を変えるシステム運用メディア

ローカル環境でLambdaのテスト環境を構築する方法 ─オープンソースツールを利用

ローカル環境でLambdaのテスト環境を構築する方法 ─オープンソースツールを利用

システム開発において、単体テストはプログラムの品質を担保するための重要なフェーズになっています。AWS Lambdaを利用したサーバーレス構成のシステムにおいて、Lambda関数の単体テストをどのように実施していますでしょうか。

多くの方がAWS環境内で直接テストを実施されているかと思います。しかし、AWS環境内でのテストやデバッグ実施は他のサービスに予期せぬ影響を与えるリスクがあります。このような場合、ローカル環境でテストを行うことで、安全かつコストを抑えた検証が可能です。

この記事では、ローカル環境でLambdaの単体テスト環境を構築するための手順を解説します。また、Lambda以外にもローカル環境で検証可能なAWSサービス(Amazon S3, Amazon DynamoDB, Amazon SQSなど)の簡単な紹介も行います。

使用するオープンソースツールの紹介

以下のオープンソースツールを使用して、ローカル環境を構築します。

  • MinIO:Amazon S3互換のオブジェクトストレージ
  • LocalStack:AWSの主要サービスをローカル環境で再現
  • DynamoDB Local:AWS DynamoDBのローカルバージョン
  • Terraform:IaC(Infrastructure as Code)を利用した環境構築

各ツールのダウンロードとインストール手順

WSL2のインストール(Windows用)

LocalStackやMinIOを動作させるために、WSL2(Windows Subsystem for Linux)を利用します。

wsl --install
  • インストール後、UbuntuなどのLinuxディストリビューションを導入し、設定を行います。

Dockerのインストール(WSL2内)

LocalStackやMinIOを動作させるためにDockerをインストールする必要があります。

  • 公式サイト: Docker Engine on Ubuntu
  • WSL2のターミナルで以下のコマンドを実行してDockerをインストールします。
sudo apt update
sudo apt install -y docker.io
  • Dockerサービスを有効化し、起動します。
sudo systemctl enable docker
sudo systemctl start docker
  • ユーザーをDockerグループに追加して、再ログイン後に管理者権限なしでDockerを利用可能にします。
sudo usermod -aG docker $(whoami)
  • WSL2を再起動し、dockerが起動していることを確認します。(以下コマンドはPowerShellにて実行)
wsl --shutdown
  • WSL2内にて、以下コマンドでdockerの起動を確認します。(Active: active (running)であればOK)
sudo systemctl status docker

LocalStackのセットアップ

  • 公式サイト: LocalStack
  • WSL2のターミナルで以下のコマンドを実行し、Dockerを利用してLocalStackを起動します。
docker pull localstack/localstack
docker run -d -p 4566:4566 -p 4571:4571 \
  -e LAMBDA_EXECUTOR=docker \
  -v /var/run/docker.sock:/var/run/docker.sock \
  localstack/localstack
  • Dockerで起動確認をします。
docker ps

MinIOのセットアップ

  • 公式サイト: MinIO
  • WSL2のターミナルで以下のコマンドを実行して、MinIOをDockerコンテナとして起動します。
docker pull minio/minio
docker run -d -p 9000:9000 -p 9001:9001 minio/minio server /data
  • Dockerで起動確認をします。
docker ps
  • MinIO Client (mc) のインストールをします。
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/
  • インストール後の動作確認をします。
mc --version

DynamoDB Localのセットアップ

  • 公式サイト: DynamoDB Local
  • WSL2のターミナルで以下のコマンドを実行します。
docker pull amazon/dynamodb-local
docker run -d -p 8000:8000 --name dynamodb amazon/dynamodb-local
  • Dockerで起動確認をします。
docker ps

Terraformのセットアップ

  • 以下のコマンドでTerraformをインストールします。
sudo apt update
sudo apt install -y snapd
sudo snap install terraform --classic
  • インストール確認をします。
terraform -version
  • 以下のコマンドでTerraformのプロジェクトセットアップします。
mkdir -p ~/terraform_lambda
cd ~/terraform_lambda

Lambdaテスト環境のセットアップ

AWS CLIのインストール(WSL2)

  • 公式サイト: AWS CLI
  • WSL2のターミナルで以下のコマンドを実行してインストールします。
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
sudo apt install unzip
unzip awscliv2.zip
sudo ./aws/install
  • インストール後の確認をします。
aws --version

LocalStackでLambdaを模擬

  • Terraformの構成ファイル 『main.tf』 を作成します。
provider "aws" {
  region                      = "us-east-1"
  access_key                  = "test"
  secret_key                  = "test"
  skip_credentials_validation = true
  skip_metadata_api_check     = true
}

resource "aws_lambda_function" "test_lambda" {
  function_name = "TestLambda"
  role          = "arn:aws:iam::000000000000:role/execution_role"
  handler       = "index.handler"
  runtime       = "nodejs14.x"
  filename      = "lambda_function.zip"

  environment {
    variables = {
      ENV = "local"
    }
  }
}

resource "aws_api_gateway_rest_api" "api" {
  name        = "TestAPI"
  description = "API Gateway for Lambda"

  endpoint_configuration {
    types = ["REGIONAL"]
  }
}

Lambdaテストコードの作成と実行(WSL2)

Lambdaテストコードの作成

  • Lambdaのテストコード 『index.js』 を作成します。
exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify({ message: "Hello from Lambda!", input: event }),
    };
    return response;
};
  • 以下のコマンドでZIPをインストールします。
sudo apt update
sudo apt install -y zip
  • WSL2のターミナルで以下のコマンドを実行し、ZIPファイルにパッケージします。
zip lambda_function.zip index.js
  • TerraformでLambdaをデプロイします。
terraform init
terraform apply -auto-approve

Lambda関数の実行

  • 以下コマンドでLambdaを実行します。
AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:4566 lambda invoke \
    --function-name TestLambda \
    --payload file://event.json \
    --region us-east-1 \
    --cli-binary-format raw-in-base64-out \
    output.json

実行結果の確認

  • 出力結果はoutput.jsonに保存されます。

他の検証可能なAWSサービスのテスト方法(ご参考までに)

Amazon S3のローカル環境テスト(MinIO)

  • MinIOを利用してAmazon S3のローカル環境を構築し、ファイルのアップロード・ダウンロードを検証します。
touch sample.txt
mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/test-bucket
mc cp sample.txt local/test-bucket/
  • アップロードされているファイルを確認します。
mc ls local/test-bucket/

DynamoDB Localでのデータ操作

  • DynamoDB Localに対して、テーブルを作成してデータを挿入します。
AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:8000 dynamodb create-table \
  --table-name TestTable \
  --attribute-definitions AttributeName=ID,AttributeType=S \
  --key-schema AttributeName=ID,KeyType=HASH \
  --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1 \
  --region us-east-1
AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:8000 dynamodb put-item \
  --table-name TestTable \
  --item '{"ID": {"S": "123"}, "Name": {"S": "TestItem"}}' \
  --region us-east-1
  • データ挿入後の確認コマンドは以下になります。
AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:8000 dynamodb scan \
  --table-name TestTable \
  --region us-east-1

SQSキューのローカル検証

  • SQS利用の準備を行います。
AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:4566 sqs create-queue --queue-name TestQueue --region us-east-1
  • メッセージ送信と受信を行ってみます。
AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:4566 sqs send-message --queue-url http://localhost:4566/000000000000/TestQueue --message-body "Hello SQS" --region us-east-1

AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test \
aws --endpoint-url=http://localhost:4566 sqs receive-message --queue-url http://localhost:4566/000000000000/TestQueue --region us-east-1

注意点

ローカル環境でAWSサービスを模擬する際には、いくつかの注意点があります。

サービスの完全な互換性は保証されない

LocalStackやMinIO、DynamoDBはAWSの本番環境と完全に同じ動作をするわけではありません。一部のAPIや設定項目が異なるため、本番デプロイ前にAWS環境での動作確認を行うことを推奨します。

権限管理(IAM)の制約

LocalStackのIAMは実際のAWS IAMと異なり、権限管理の厳密なチェックを行わないため、ローカル環境での動作が本番環境では失敗する可能性があります。本番環境では適切なIAMロールを設定してください。

Lambdaのデバッグには制限がある

LocalStackのLambdaエミュレーションは基本的な動作をサポートしますが、外部サービスとの連携や環境変数の取り扱いに差異がある場合があります。特にVPCやカスタムネットワーク設定を使用する場合は、AWS環境でのテストが必須です。

Amazon S3の動作が異なる可能性

MinIOはAmazon S3と互換性がありますが、一部の高度なAmazon S3機能(バージョニング、レプリケーションなど)がサポートされていません。Amazon S3の特定の機能を利用する場合、本番環境での動作確認を行う必要があります。

API Gatewayの制限

LocalStackのAPI Gatewayの実装は、AWS本番環境とは異なります。特に、Lambdaとの統合や認証設定(IAM認証、Cognito統合)などが制限されている場合があるため、エンドツーエンドのテストはAWS上で行うことを推奨します。

ローカル環境のリソース制約

Dockerコンテナを大量に実行すると、ローカル環境のCPUやメモリを圧迫する可能性があります。適宜不要なコンテナを停止し、システム負荷を軽減してください。

まとめ

この記事では、WSL2環境でLambdaの単体テストを実施するための具体的な手順を解説しました。

Lambdaだけではなく、MinIOやLocalStack、DynamoDB Localの簡単な利用方法を紹介しました。これらサービスをつなげてテストを行うことが可能になりますので、この際にローカルでのテスト環境を用意してみてはいかがでしょうか。

また、テストだけではなく、デバッグ環境としても有効なので、簡単な勉強を行いたいや、テスト的に動作させてみたいなどの動機から構築を行ってみるのもよいと思います。

Sler企業にて10年間WEBアプリ開発から経験を積み、現在はフルスタックエンジニアとして現場で働いています。アプリケーションから、インフラ含めた幅広い知見をベースにノウハウをアウトプットしていきます。実は生粋のジャンカーでジャンク品を買い漁っては修理して楽しんでいますので、ハードウェアにも片足踏み込んでます。

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録

最新情報をお届けします!

最新のITトレンドやセキュリティ対策の情報を、メルマガでいち早く受け取りませんか?ぜひご登録ください

メルマガ登録