
2026年3月23日から LocalStack のプラン変更があって,以下のような選択肢を検討しているチームが多いと思う.
- LocalStack Base プラン以上を契約して使う
- LocalStack の過去バージョンに固定して無料で使う
- LocalStack 以外のエミュレーターに移行する
- Vibe Coding でチームで必要なエミュレーターのみを独自実装する
- エミュレーター依存をやめる
LocalStack 以外のエミュレーター (LocalStack alternatives) として多くのツールも登場していて,今後覇権争いになるようなフェーズに入るような気がしている🤔
その中でも特に最近注目されている(あくまで僕の個人的な観測範囲だけど)Floci を試してみようと思う💪現時点では Floci 1.5.2 が最新になる.
github.com
今回は以前に公開した「LocalStack 実践入門 | AWS アプリケーション開発ワークショップ」の内容を参考にする.
zenn.dev
セットアップ
Floci の GitHub リポジトリにある README.md と docker-compose.yml を参考に compose.yml を作った.AWS Lambda 関数を動かすために Docker ソケット /var/run/docker.sock をマウントする必要がある.デフォルトのポートは 4566 になっていて,LocalStack から移行しやすくなっていると思う👌
services:
floci:
image: hectorvent/floci:latest
ports:
- 4566:4566
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/app/data
environment:
FLOCI_SERVICES_DOCKER_NETWORK: floci_default
networks:
floci_default:
aliases:
- localhost.floci.cloud
networks:
floci_default:
name: floci_default
そして Floci を Docker Compose で起動する.
$ docker compose up -d
✔ Network floci_default Created
✔ Container sandbox-floci-floci-1 Started
あとは README.md を参考に環境変数を設定する.アクセスキーはダミー値で OK👌
$ export AWS_ENDPOINT_URL=http://localhost:4566
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ export AWS_ACCESS_KEY_ID=DUMMY
$ export AWS_SECRET_ACCESS_KEY=DUMMY
1. Amazon SQS + Amazon S3 + Python (boto3)
以下のように Python (boto3) スクリプトで Amazon SQS キューから取得したメッセージを使って Amazon S3 バケットにオブジェクトを作るアーキテクチャを Floci で試す.

まずは AWS CLI で Floci に Amazon SQS キューと Amazon S3 バケットを作成する.
$ aws sqs create-queue --queue-name sandbox-queue
{
"QueueUrl": "http://localhost:4566/000000000000/sandbox-queue"
}
$ aws s3api create-bucket --bucket sandbox-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1
{
"Location": "/sandbox-bucket"
}
そして Amazon SQS キューにメッセージを2つ送信する.
$ aws sqs send-message \
--queue-url http://localhost:4566/000000000000/sandbox-queue \
--message-body '{ "id": "id0001", "body": "This is message 0001." }'
{
"MD5OfMessageBody": "724a181067bbde5b905d391a475a82ec",
"MessageId": "1e8b2701-cba0-4bf8-b24f-6098213fa0ff"
}
$ aws sqs send-message \
--queue-url http://localhost:4566/000000000000/sandbox-queue \
--message-body '{ "id": "id0002", "body": "This is message 0002." }'
{
"MD5OfMessageBody": "b796b47a6c737f200e34c2676dc40a2a",
"MessageId": "1b717759-578a-4405-b436-2dfd3dca6565"
}
今回実行する app.py はこんな感じ❗️
import json
import boto3
sqs = boto3.client("sqs", endpoint_url="http://localhost:4566")
queue_url = "http://localhost:4566/000000000000/sandbox-queue"
response = sqs.receive_message(
QueueUrl=queue_url,
MaxNumberOfMessages=10,
)
s3 = boto3.client("s3", endpoint_url="http://localhost:4566")
for message in response.get("Messages", []):
body = json.loads(message["Body"])
s3.put_object(
Bucket="sandbox-bucket",
Key=f"{body['id']}.json",
Body=message["Body"],
)
sqs.delete_message(
QueueUrl=queue_url,
ReceiptHandle=message["ReceiptHandle"],
)
最後に app.py を実行すると,期待通りに Amazon S3 バケットにオブジェクトが作られていた👌
$ uv run app.py
$ aws s3api list-objects --bucket sandbox-bucket
{
"Contents": [
{
"Key": "id0001.json",
"LastModified": "2026-04-11T08:30:24+00:00",
"ETag": "\"724a181067bbde5b905d391a475a82ec\"",
"Size": 51,
"StorageClass": "STANDARD"
},
{
"Key": "id0002.json",
"LastModified": "2026-04-11T08:30:24+00:00",
"ETag": "\"b796b47a6c737f200e34c2676dc40a2a\"",
"Size": 51,
"StorageClass": "STANDARD"
}
],
"RequestCharged": null,
"Prefix": ""
}
Floci は AWS CloudFormation もサポートしている.次は AWS CloudFormation で Amazon SQS キューと Amazon S3 バケットをデプロイする.

template.yaml は以下のような感じ.
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Queue:
Type: AWS::SQS::Queue
Properties:
QueueName: sandbox-cfn-queue
ReceiveMessageWaitTimeSeconds: 20
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: sandbox-cfn-bucket
まず aws cloudformation deploy コマンドを実行するとエラーになってしまった.aws cloudformation deploy コマンドは内部的に Chage Set を使っていて,Floci のドキュメントを読むと AWS CloudFormation の Change Set をサポートしていると記載されているけど,完全にサポートできていない可能性がありそう🙅♂️
$ aws cloudformation deploy \
--stack-name 02-cfn \
--template-file template.yaml
Waiting for changeset to be created..
aws: [ERROR]: 'Status'
代わりに aws cloudformation create-stack コマンドを実行すると問題なくデプロイできた.
$ aws cloudformation create-stack \
--stack-name 02-cfn \
--template-body file://template.yaml
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:000000000000:stack/02-cfn/19d6508f-e771-4d0c-95ea-9805d70a738e"
}
aws cloudformation describe-stacks コマンドを実行すると AWS CloudFormation スタックを確認できた.
$ aws cloudformation describe-stacks --stack-name 02-cfn
{
"Stacks": [
{
"StackId": "arn:aws:cloudformation:ap-northeast-1:000000000000:stack/02-cfn/19d6508f-e771-4d0c-95ea-9805d70a738e",
"StackName": "02-cfn",
"CreationTime": "2026-04-11T08:31:26.265839+00:00",
"LastUpdatedTime": "2026-04-11T08:33:06.673563+00:00",
"StackStatus": "CREATE_COMPLETE",
"Capabilities": [],
"Outputs": [],
"Tags": []
}
]
}
Amazon SQS キューと Amazon S3 バケットも期待通りにデプロイされていた👌
$ aws sqs get-queue-url --queue-name sandbox-cfn-queue
{
"QueueUrl": "http://localhost:4566/000000000000/sandbox-cfn-queue"
}
$ aws s3api head-bucket --bucket sandbox-cfn-bucket
{
"BucketRegion": "ap-northeast-1"
}
3. AWS SAM
AWS CloudFormation がサポートされているなら AWS SAM も使えるかも!? と思って試してみた.AWS SAM で Amazon SQS キュー・AWS Lambda 関数・Amazon S3 バケットを連携するアーキテクチャを試す.

template.yaml は以下のような感じ.
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
Queue:
Type: AWS::SQS::Queue
Properties:
QueueName: sandbox-sam-queue
ReceiveMessageWaitTimeSeconds: 20
Function:
Type: AWS::Serverless::Function
Properties:
FunctionName: sandbox-sam-function
CodeUri: ./src
Handler: app.lambda_handler
Runtime: python3.13
Architectures:
- x86_64
Events:
SqsEvent:
Type: SQS
Properties:
Queue: !GetAtt Queue.Arn
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: sandbox-sam-bucket
AWS SAM CLI でデプロイしようと思ったけど ChangeSetNotFoundException というエラーが出てしまった🚨あくまで推測だけど,先ほどと同じく AWS CloudFormation の Change Set まわりのサポートが不足している可能性がありそう.
$ sam build
$ sam deploy --guided
(中略)
Error: Waiter ChangeSetCreateComplete failed: An error occurred (ChangeSetNotFoundException): ChangeSet [arn:aws:cloudformation:ap-northeast-1:000000000000:changeSet/samcli-deploy1775896655/037e073d-7741-4b12-bc47-255ca867a82f] does not exist
4. AWS Lambda
AWS SAM は使えなかったため,最後は AWS Lambda 関数を単体でデプロイする.

まずは以下のようなシンプルな app.py を実装する.
import json
def lambda_handler(event, context):
for record in event['Records']:
print(record)
body = json.loads(record['body'])
print(f"id: {body['id']}, body: {body['body']}")
return {"statusCode": 200}
そして aws lambda create-function コマンドで ZIP ファイルをアップロードして AWS Lambda 関数をデプロイする.
$ zip function.zip app.py
$ aws lambda create-function \
--function-name sandbox-lambda-function \
--runtime python3.13 \
--handler app.lambda_handler \
--role arn:aws:iam::000000000000:role/dummy \
--timeout 30 \
--zip-file fileb://function.zip
{
"FunctionName": "sandbox-lambda-function",
"FunctionArn": "arn:aws:lambda:ap-northeast-1:000000000000:function:sandbox-lambda-function",
"Runtime": "python3.13",
"Role": "arn:aws:iam::000000000000:role/dummy",
"Handler": "app.lambda_handler",
"CodeSize": 320,
"Timeout": 30,
"MemorySize": 128,
"LastModified": "1775897052317",
"Version": "$LATEST",
"RevisionId": "ce9c7f4f-7650-4378-ad75-89481bbc7af3",
"State": "Active",
"PackageType": "Zip"
}
aws lambda invoke コマンドで AWS Lambda 関数を実行すると成功した❗️
$ aws lambda invoke \
--function-name sandbox-lambda-function \
--cli-binary-format raw-in-base64-out \
--payload '{ "Records": [{ "body": "{ \"id\": \"id0003\", \"body\": \"This is message 0003.\" }" }] }' \
/dev/stdout
{
"StatusCode": 200,
"ExecutedVersion": "$LATEST"
}
aws logs filter-log-events コマンドで Amazon CloudWatch Logs を確認するとちゃんとログが出力されていた👌
$ aws logs filter-log-events --log-group-name /aws/lambda/sandbox-lambda-function
{
"events": [
{
"timestamp": 1775897074549,
"message": "{'body': '{ \"id\": \"id0003\", \"body\": \"This is message 0003.\" }'}",
"ingestionTime": 1775897074549,
"eventId": "bdd2d9bc-22c1-4b44-b9a4-51d5c045235e"
},
{
"timestamp": 1775897074549,
"message": "id: id0003, body: This is message 0003.",
"ingestionTime": 1775897074549,
"eventId": "c18ae150-26d8-4ce5-a556-fff9b43b01c7"
}
]
}
まとめ
LocalStack 以外のエミュレーター (LocalStack alternatives) として最近よく聞く Floci を試してみた.まだまだ発展途上でリリース頻度も高いけど,現時点の Floci 1.5.2 でも十分 LocalStack の代替として選択肢に入ると思う.特に LocalStack では無料で使えなかった Amazon Cognito や Amazon ECS が Floci ではサポートされているし,free forever というポリシーに惹かれる人も多いと思う.さらに起動時間が速いのも実体験として嬉しいポイントだと感じた👌
今後も Floci のアップデートを追いかけていこうと思う❗️