この記事ではDevOps・自動化に特化して解説します。AI自動化・DevOps全般は AI自動化ツール完全ガイド2026|ノーコードからコードまで徹底比較 をご覧ください。
Floci は LocalStack 代替として注目されるGo製のAWSローカルエミュレータだ。2026年3月にLocalStack Community Editionが認証トークン必須化・セキュリティ更新の凍結へ舵を切ったことで、無料で使える軽量な選択肢を探すチームが一気に増えた。本記事では、Flociで何ができるのか、何を解決するのか、そしてLocalStackを本当に代替できるのかを、実コード付きで整理する。
・Floci は認証トークン不要・MITライセンスのGo製AWSエミュレータで、LocalStack 代替の最有力候補
・起動24ms・アイドルメモリ13MiB・イメージ約90MBと軽量で、CI/CDのジョブ起動を大幅短縮できる
・S3・DynamoDB・Lambda・ECS・EC2など29サービスに対応し、SDKの
endpoint_urlを1箇所変えるだけで既存コードが動く
Floci とは|LocalStack 代替として選ばれるGo製AWSエミュレータ
FlociはGitHub Stars 3,300超(2026年4月時点)を獲得した、Go製のオープンソースAWSローカルエミュレータ。一言で表すなら「LocalStackの無料・軽量な代替」。MITライセンスで制限なく、起動24ms、アイドル時メモリ13MiB、Dockerイメージサイズ約90MBという軽さが最大の武器だ。
Flociの主要スペック(2026年4月時点)
- GitHub Stars: 3,369 / Forks: 189
- 対応サービス数: 29(ECS・EC2・ECR・SES・OpenSearch含む)
- 互換性テスト: 1,873件(Java/Node/Python/Go/Rust/Terraform/CDK)
- 起動時間: 約24ms、アイドルメモリ: 約13MiB、Dockerイメージ: 約90MB
Flociが解決するのは「AWSを使うアプリの開発・テストで、いちいち本物のAWSに繋ぎたくない」という課題だ。本物のAWSに繋げば課金が発生し、ネットワーク遅延も避けられず、権限設定の手間もかかる。ローカルで完結すれば、これらがまとめて消える。AWSインフラのコスト管理にはInfracostによるデプロイ前可視化が有効だが、そもそもローカルで検証できればクラウド料金は1円も発生しない。その役割を担うのがFlociである。
Floci開発の直接的な背景には、2026年3月のLocalStack Community Editionの方針転換がある。これまで無料で気軽に使えたLocalStackが認証トークンを必須化し、無料版のセキュリティ更新を凍結する方向へ動いたことで、「トークン管理なしで、そのままdocker runできる軽量な選択肢」を求める声が一気に高まった。Flociはまさにこの空白に応えるツールで、認証トークン不要・MITライセンス・単一バイナリという設計は、旧来のLocalStackの手軽さを取り戻そうとする姿勢の表れだ。
Floci の読み方と表記ゆれ(フローシ/フロチ/フロキ)
Floci の公式リポジトリでは発音について明示されていないため、英語の音素則に従って読まれることが多い。日本語コミュニティでは表記ゆれがあり、検索クエリにも「floci 読み方」が継続的に発生している。
| 表記 | 想定発音 | 備考 |
|---|---|---|
| フローシ | /ˈfloʊʃi/ | 日本語のXやZennで散見される表記 |
| フロチ | /ˈflɒtʃi/ | “ci” を「チ」と読む英語圏寄りの読み方 |
| フロキ | /ˈflɒki/ | “ci” を「キ」と読む解釈(少数派) |
公式が定義していないため、ローマ字表記「Floci」のまま使うのが最も無難だ。日本語記事内で読み仮名を振るなら「フローシ」が最も普及している。発音問題でつまずく前に、29サービス対応・起動24msの実用性を体感する方が早い。なお、AWS互換ローカル開発環境としての位置付けやLocalStack 代替としての判断基準は、この後のセクションで詳説する。
Floci が対応する29サービスとアーキテクチャ|何ができるのか
対応サービスは29。コンテナ管理ツールと組み合わせた開発スタックを組む場合はPodman TUIも参照。以下はリクエスト処理の全体像を示す。
Python / Node.js / Java / Go / Rust"] --> B["Floci (port 4566)
HTTP Router"] B --> C["Stateless Services
SSM · SQS · SNS · IAM · STS · KMS
Cognito · Kinesis · EventBridge
CloudWatch · Step Functions
CloudFormation · EC2 · SES · ECR
OpenSearch · AppConfig · ACM"] B --> D["Stateful Services
S3 · DynamoDB · DynamoDB Streams"] B --> E["Container Services
Lambda · ElastiCache · RDS · ECS"] D --> F["StorageBackend
(memory / hybrid /
persistent / wal)"] E --> G["Docker Engine"]
主要サービスの対応状況(公式READMEより)。
| サービス | 動作方式 | 注目機能 |
|---|---|---|
| S3 | In-process | バージョニング、マルチパート、Object Lock、署名付きURL、イベント通知 |
| DynamoDB | In-process | GSI/LSI、トランザクション、TTL、Streams連携 |
| DynamoDB Streams | In-process | シャードイテレータ、Lambda ESMトリガー |
| Lambda | Dockerコンテナ | Warm Pool、エイリアス、Function URL、SQS/Kinesis/DDB Streams ESM |
| IAM | In-process | ユーザー、ロール、グループ、ポリシー、アクセスキー |
| API Gateway REST | In-process | リソース、メソッド、ステージ、Lambda proxy、MOCK/AWS統合 |
| API Gateway v2 (HTTP) | In-process | ルート、JWT認証、ステージ管理 |
| Cognito | In-process | ユーザープール、JWKS/OpenIDエンドポイント |
| ElastiCache | Dockerコンテナ | Redis/Valkey、IAM認証、SigV4検証 |
| RDS | Dockerコンテナ | PostgreSQL/MySQL、IAM認証、JDBC互換 |
| ECS | Dockerコンテナ | クラスター、タスク定義、サービス、キャパシティプロバイダー |
| EC2 | In-process | VPC、サブネット、セキュリティグループ、インスタンス、Elastic IP |
| ECR | In-process + OCI Registry | リポジトリ、docker push/pull、Lambdaイメージ |
| SES | In-process | 送信、本文検証、DKIM属性 |
| OpenSearch | In-process | ドメインCRUD、バージョン、タグ |
| AppConfig | In-process | アプリ、環境、プロファイル、ホスト設定バージョン |
| SQS | In-process | Standard/FIFO、DLQ、バッチ処理 |
| SNS | In-process | SQS/Lambda/HTTP配信 |
| Step Functions | In-process | ASL実行、タスクトークン |
| CloudFormation | In-process | スタック、チェンジセット |
LocalStack無料版で「Partial」とされていたDynamoDB Streams・IAM・STS・Kinesis・KMSは、Flociで完全対応。さらにLocalStack無料版が未対応のAPI Gateway v2・Cognito・ElastiCache・RDS・ECSも実装済みだ。
「何を代替できるのか」を一言でまとめると、Flociは開発・テスト段階における本物のAWSアカウントへの接続を代替する。S3にファイルを置く、DynamoDBに読み書きする、SQSでジョブをやり取りする、Lambdaを叩く——こうした一連のAWS依存処理を、課金もネットワークも介さずローカルで再現できる。特にサーバーレス構成(API Gateway + Lambda + DynamoDB + SQS)の統合テストを、1つのプロセスで完結させられるのが実務上の強みだ。
3層アーキテクチャ(Stateless / Stateful / Container)
アーキテクチャは3層構造。全サービスがポート4566で統一されているため、AWS SDKのendpoint_urlを1箇所変更するだけで既存コードがそのまま動作する。
Statelessサービス層 — SSM・SQS・SNS・IAM・STS・KMS・Secrets Manager・Cognito・Kinesis・EventBridge・CloudWatch・Step Functions・CloudFormation・EC2・SES・ACM・API Gatewayなど。HTTPリクエストを受け取り、StorageBackendに状態を委譲する。プロセス内で完結するため軽量かつ高速だ。
Statefulサービス層 — S3とDynamoDB(Streams含む)。StorageBackendは4種類:memory(揮発性・最速)、hybrid(頻出データをメモリ保持)、persistent(ディスク永続化)、wal(Write-Ahead Log方式)。
Containerサービス層 — Lambda・ElastiCache・RDS・ECS。実際のDockerコンテナを起動してエミュレーションする。Lambda/ElastiCache/RDS/ECSはIAM認証とSigV4リクエスト署名に対応。ECRはOCIレジストリを共有コンテナとして起動し、通常のdocker push/pullで利用できる。この層だけはDocker Engineが前提になる点を覚えておきたい。
Floci のインストールと基本的な使い方
| 方法 | コマンド / 手順 | 前提条件 |
|---|---|---|
| Docker Compose | docker compose up | Docker Compose v2 |
| Docker | docker run -p 4566:4566 hectorvent/floci | Docker Engine |
| Go install | go install github.com/hoci-io/floci@latest | Go 1.21以上 |
| ネイティブバイナリ | GitHub Releasesからダウンロード(約40MB) | なし |
最も手軽なDocker Compose構成(公式テンプレート)。
# docker-compose.yml
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566"
volumes:
- ./data:/app/data
docker compose up
# 環境変数を設定
export AWS_ENDPOINT_URL=http://localhost:4566
export AWS_DEFAULT_REGION=us-east-1
export AWS_ACCESS_KEY_ID=test
export AWS_SECRET_ACCESS_KEY=test
# 動作確認
aws s3 mb s3://my-bucket
aws sqs create-queue --queue-name my-queue
aws dynamodb list-tables
認証情報(AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY)はtestのようなダミー値で構わない。Flociは実際の認証を行わないため、本物のクレデンシャルを設定する必要はなく、誤って本番AWSへ繋いでしまう事故も起きにくい。
latest(ネイティブイメージ・サブ秒起動)が推奨。latest-jvm(JVMイメージ)はプラットフォーム互換性が最も広い。特定バージョンに固定する場合は x.y.z や x.y.z-jvm を使用する。
SDK別インテグレーション|Python・Node.js・Java からの接続
既存のAWS SDKコードはendpoint_url(またはエンドポイントオーバーライド)を1箇所指定するだけで動作する。アプリのロジックを書き換える必要はなく、接続先のURLを差し替えるだけなのが、移行コストの低さにつながっている。
Python(boto3)
import boto3
client = boto3.client(
"s3",
endpoint_url="http://localhost:4566",
region_name="us-east-1",
aws_access_key_id="test",
aws_secret_access_key="test"
)
# 通常どおり操作
client.create_bucket(Bucket="my-bucket")
Node.js(AWS SDK v3)
import { S3Client, CreateBucketCommand } from "@aws-sdk/client-s3";
const client = new S3Client({
endpoint: "http://localhost:4566",
region: "us-east-1",
credentials: { accessKeyId: "test", secretAccessKey: "test" },
forcePathStyle: true,
});
await client.send(new CreateBucketCommand({ Bucket: "my-bucket" }));
Java(AWS SDK v2)
DynamoDbClient client = DynamoDbClient.builder()
.endpointOverride(URI.create("http://localhost:4566"))
.region(Region.US_EAST_1)
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create("test", "test")))
.build();
6言語(Java・Node.js・Python・Go・Rust・AWS CLI)と主要IaC(Terraform/OpenTofu/CDK)向けの互換性テストが公式リポジトリに含まれており、PR単位で自動検証される。S3ではNode.jsから接続する際にforcePathStyle: trueを付けている点に注意したい。仮想ホスト形式(bucket.localhost)ではなくパス形式(localhost/bucket)でアクセスさせるための指定で、ローカルエミュレータでは実質必須になる。
Floci の環境変数・ストレージモードと設定
FLOCI_ プレフィックスの環境変数で全設定を上書きできる。
| 変数名 | デフォルト | 説明 |
|---|---|---|
QUARKUS_HTTP_PORT |
4566 |
Floci APIのリッスンポート |
FLOCI_DEFAULT_REGION |
us-east-1 |
デフォルトAWSリージョン |
FLOCI_DEFAULT_ACCOUNT_ID |
000000000000 |
デフォルトAWSアカウントID |
FLOCI_BASE_URL |
http://localhost:4566 |
SQS QueueURL等の返却ベースURL |
FLOCI_HOSTNAME |
(未設定) | Docker Compose内でURLを解決するホスト名 |
FLOCI_STORAGE_MODE |
memory |
ストレージモード(memory/persistent/hybrid/wal) |
FLOCI_STORAGE_PERSISTENT_PATH |
./data |
永続化ストレージのディレクトリ |
FLOCI_ECR_BASE_URI |
public.ecr.aws |
Lambdaイメージ取得元のECRベースURI |
ストレージモードの選び方(memory / hybrid / persistent / wal)
FLOCI_STORAGE_MODEはFlociの挙動を大きく左右する設定だ。用途に応じて選ぶ。
・memory(デフォルト):全データをメモリ上に保持し、プロセス終了で消える。最速で、CI/CDの使い捨て環境やユニットテストに最適
・hybrid:頻出データをメモリに保持しつつ、必要に応じてディスクへ退避する折衷案。長めのローカル開発セッション向き
・persistent:ディスクへ永続化し、再起動してもデータが残る。手元で作ったバケットやテーブルを翌日も使いたい場合に選ぶ
・wal:Write-Ahead Log方式で、書き込みの耐障害性を高める。予期しない停止でもデータ整合性を保ちたいケース向け
「テストのたびにクリーンな状態から始めたい」ならmemory、「開発データを残したい」ならpersistent、と覚えておけばまず外さない。walはデータ整合性を重視する場面、hybridはメモリと永続性のバランスを取りたい場面と、要件が明確になってから選べば十分だ。永続化する場合はFLOCI_STORAGE_PERSISTENT_PATH(デフォルト./data)にデータが書き出されるので、Docker Composeのvolumeマウントと組み合わせてホスト側に残すのが定番になる。
アプリがFlociとは別コンテナで動作する場合、SQSの
QueueUrl に http://localhost:4566/... が返るとコンテナ間で解決できない。FLOCI_HOSTNAME=floci(サービス名)を設定することで、返却URLが http://floci:4566/... に変わり正しく解決される。
# マルチコンテナ構成の例
services:
floci:
image: hectorvent/floci:latest
ports:
- "4566:4566"
environment:
- FLOCI_HOSTNAME=floci # URLをコンテナ名で解決
- FLOCI_STORAGE_MODE=persistent
my-app:
environment:
- AWS_ENDPOINT_URL=http://floci:4566
depends_on:
- floci
AWS各サービスの使い方例とトラブルシューティング
ここからは代表的なサービスを、AWS CLIを使った具体例で確認する。いずれもAWS_ENDPOINT_URL=http://localhost:4566が設定済みであることが前提だ。
S3・DynamoDB・SQS の基本操作
S3 — バケット作成、アップロード、署名付きURLの発行まで本物同様に動く。
# バケット作成とアップロード
aws s3 mb s3://assets
aws s3 cp ./logo.png s3://assets/logo.png
# バージョニングを有効化
aws s3api put-bucket-versioning --bucket assets \
--versioning-configuration Status=Enabled
# 署名付きURL(一定時間だけ有効なダウンロードURL)を発行
aws s3 presign s3://assets/logo.png --expires-in 3600
DynamoDB — テーブル作成から項目の書き込み・読み出しまで。GSI/LSIやTTLもエミュレートされる。
# テーブル作成
aws dynamodb create-table \
--table-name users \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
# 項目の書き込みと読み出し
aws dynamodb put-item --table-name users \
--item '{"id": {"S": "u001"}, "name": {"S": "Taro"}}'
aws dynamodb get-item --table-name users \
--key '{"id": {"S": "u001"}}'
SQS — キューを作り、メッセージを送受信する。StandardキューもFIFOキューも扱える。
# キュー作成・送信・受信
aws sqs create-queue --queue-name jobs
aws sqs send-message \
--queue-url http://localhost:4566/000000000000/jobs \
--message-body '{"task": "resize-image"}'
aws sqs receive-message \
--queue-url http://localhost:4566/000000000000/jobs
Lambda 実行と Docker 依存の注意点
Lambdaは前述のとおりContainerサービス層に属し、実際のDockerコンテナ上で関数を起動する。そのためDocker Engineが動作していない環境ではLambdaのエミュレーションが失敗する。同様にElastiCache・RDS・ECSもDockerを必要とする。CIランナーでこれらを使う場合は、Docker-in-Docker(dind)が有効なイメージやサービス設定を選ぶ必要がある。
逆に、S3・DynamoDB・SQS・SNS・IAMなどIn-processで動くサービスだけを使うなら、Dockerなしのネイティブバイナリでも完結する。「どのサービスを使うか」で必要な前提が変わる点を、導入前に整理しておきたい。
Lambda関数のコードそのものは、実AWSにデプロイするものと同じアーティファクトをそのまま流し込める。ハンドラの実装を書き換える必要はなく、Function URLやSQS/Kinesis/DynamoDB Streamsをトリガーとするイベントソースマッピング(ESM)もエミュレートされる。つまり「Lambdaがキューのメッセージを拾って処理する」といった非同期のイベント駆動フローを、ローカルで一気通貫にテストできる。ここまで再現できるローカルエミュレータは多くなく、Flociが単なるモックではなく実行環境寄りのツールであることがよく分かる部分だ。
よくあるトラブルと対処
| 症状 | 主な原因 | 対処 |
|---|---|---|
コンテナ間で QueueUrl を解決できない |
返却URLが localhost になっている |
FLOCI_HOSTNAME=floci を設定 |
| Lambda 呼び出しが失敗する | Docker Engineが無い/権限不足 | Docker起動を確認、CIではdindを有効化 |
| ポート4566が競合する | 別プロセスが使用中 | QUARKUS_HTTP_PORT で別ポートに変更 |
| 再起動でデータが消える | デフォルトのmemoryモード | FLOCI_STORAGE_MODE=persistent を指定 |
| S3のパス解決でエラー | 仮想ホスト形式でアクセス | SDKで forcePathStyle: true を指定 |
これらは「本物のAWSではなくエミュレータを使う」ことに起因する定番の詰まりどころだ。裏を返せば、この5点さえ押さえておけば、Floci導入時の初期トラブルの大半は回避できる。
なお、IAM・STSといった認証系サービスもIn-processで動くため、ロールやポリシーを作成してアクセスキーを発行する、といった検証もローカルで完結する。ただしFlociは実際の権限チェックを厳密に強制するわけではなく、あくまで「APIとしての形」を再現する点は理解しておきたい。本番のIAMポリシーが正しく効くかどうかの最終確認は、やはり実AWS環境で行う必要がある。エミュレータの守備範囲は「APIの疎通と挙動の確認」であり、「セキュリティ境界の検証」ではない、という線引きを意識すると使い方を誤らない。
Floci を LocalStack 代替として導入する判断基準(互換性・比較・CI/CD)

2026年3月のLocalStack Community Edition認証トークン必須化を受け、多くのチームがLocalStack 代替を検討している。ここでは互換性・他ツール比較・CI/CD活用の3つの角度から、FlociがLocalStack 代替として適切かどうかを判断する材料を整理する。
互換性テスト(1,873件)で担保される信頼性
公式リポジトリの compatibility-tests/ ディレクトリに、6言語・3 IaCツール向けのテストスイートが含まれる。
| モジュール | 言語/ツール | テスト件数 |
|---|---|---|
sdk-test-java |
Java 17 / AWS SDK v2 | 889 |
sdk-test-node |
Node.js / AWS SDK v3 | 360 |
sdk-test-python |
Python 3 / boto3 | 264 |
sdk-test-awscli |
Bash / AWS CLI v2 | 138 |
sdk-test-go |
Go / AWS SDK v2 | 120 |
sdk-test-rust |
Rust / AWS SDK for Rust | 69 |
compat-terraform |
Terraform v1.10+ | 14 |
compat-opentofu |
OpenTofu v1.9+ | 14 |
compat-cdk |
AWS CDK v2+ | 5 |
| 合計 | 1,873 |
これらはPRごとに自動実行されるため、「READMEに書いてあるが実は動かない」という乖離が起きにくい。IaC(Terraform/OpenTofu/CDK)を含めて検証されている点は、インフラをコード管理しているチームにとって特に安心材料になる。
他ツールとの比較|LocalStack・Moto との違い
| 項目 | Floci | LocalStack Community | Moto | ElasticMQ + DynamoDB Local |
|---|---|---|---|---|
| 認証トークン | 不要 | 必須(2026年3月〜) | 不要 | 不要 |
| セキュリティ更新 | 継続 | 凍結 | 継続 | AWS依存 |
| 起動時間 | 約24ms | 約3.3秒 | Python import時間 | 各サービス個別起動 |
| アイドルメモリ | 約13MiB | 約143MiB | テスト実行時のみ | サービスごとに数十MiB |
| Dockerイメージ | 約90MB | 約1.0GB | なし(pip) | 各サービス別イメージ |
| 対応サービス数 | 29 | 50+(Pro含む) | 多数(モック) | 個別 |
| API Gateway v2 | ✅ | ❌ | ❌ | ❌ |
| Cognito | ✅ | ❌ | ✅ | ❌ |
| ECS | ✅ | ❌ | ❌ | ❌ |
| EC2 | ✅ | ⚠️ Partial | ❌ | ❌ |
| ECR (OCI Registry) | ✅ | ❌ | ❌ | ❌ |
| DynamoDB Streams | ✅ | ⚠️ Partial | ✅ | ❌ |
| Lambda実行 | 実Dockerコンテナ | 実Dockerコンテナ | モック | なし |
| ライセンス | MIT | 独自制限 | Apache 2.0 | Apache 2.0 |
| 言語 | Go(ネイティブバイナリ) | Python | Python | Scala/Java |
Motoはユニットテスト向けモックであり、複数サービスの連携テストには不向き。ElasticMQ+DynamoDB Localはサービスごとにポート管理が煩雑になる。Flociは「1バイナリ・1ポートで29サービス」という統一性が強みだ。LocalStack Proの50以上のサービスが必要な場合はそちらが妥当。
この比較表で特に効いてくるのが、起動時間とメモリの差だ。LocalStackの約3.3秒・約143MiBに対し、Flociは約24ms・約13MiB。1回だけなら誤差に見えるが、テストを何百回も回すCIや、コードを保存するたびに再起動する開発ループでは、この差が積み重なって体感速度を大きく変える。Dockerイメージも約90MB対約1.0GBと10分の1で、pullやキャッシュの待ち時間も短い。「軽さ」は単なるスペック自慢ではなく、開発者の待ち時間を削るという実利に直結している。
LocalStack 代替としてFlociが適しているケース
| 判断基準 | Flociが適している | LocalStack Proを検討すべき |
|---|---|---|
| 必要サービス数 | 29サービスで十分 | 50以上のサービスが必要 |
| 予算 | 無料で使いたい | 商用サポートが必要 |
| 起動速度 | 24msの高速起動が重要 | 3秒の起動でも許容可能 |
| メモリ制約 | CI/CDでメモリ節約が重要 | メモリに余裕がある |
| API Gateway v2 | HTTP APIを使用 | REST APIのみ |
| ECS/RDS/ElastiCache | これらの統合テストが必要 | LocalStack Proで対応 |
| ライセンス | MITライセンスが必須 | 独自ライセンス許容 |
判断のコアはシンプルで、「必要な29サービスの中に収まり、無料・軽量を重視するならFloci」「50以上のサービスや商用サポートが要るならLocalStack Pro」という切り分けになる。まずはFlociで検証し、足りないサービスが出た時点でProを併用する、という段階的な移行も現実的だ。
Floci AWSエミュレーション:CI/CDでの活用パターン
FlociのAWSエミュレーションをCI/CDパイプラインに統合する具体的な構成例を示す。GitHub ActionsとGitLab CIの両方に対応。
GitHub Actions構成例
# .github/workflows/integration-test.yml
name: Integration Tests with Floci
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
floci:
image: hectorvent/floci:latest
ports:
- 4566:4566
steps:
- uses: actions/checkout@v4
- name: Run integration tests
env:
AWS_ENDPOINT_URL: http://localhost:4566
AWS_DEFAULT_REGION: us-east-1
AWS_ACCESS_KEY_ID: test
AWS_SECRET_ACCESS_KEY: test
run: |
# S3バケット作成とテストデータ投入
aws s3 mb s3://test-bucket
aws s3 cp testdata/ s3://test-bucket/ --recursive
# DynamoDBテーブル作成
aws dynamodb create-table \
--table-name test-table \
--attribute-definitions AttributeName=id,AttributeType=S \
--key-schema AttributeName=id,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
# アプリケーションテスト実行
npm test
GitLab CI構成例
# .gitlab-ci.yml
integration-test:
image: python:3.12
services:
- name: hectorvent/floci:latest
alias: floci
variables:
AWS_ENDPOINT_URL: http://floci:4566
AWS_DEFAULT_REGION: us-east-1
AWS_ACCESS_KEY_ID: test
AWS_SECRET_ACCESS_KEY: test
script:
- pip install boto3 pytest
- pytest tests/integration/ -v
CI/CDでFlociを使う最大のメリットは、Dockerイメージが約90MBと軽量なため、ジョブの起動時間が大幅に短縮される点。LocalStack(約1.0GB)と比較して約10分の1のダウンロードサイズで、CIランナーのキャッシュ効率も向上する。実行のたびにクリーンな環境が欲しいCIでは、デフォルトのmemoryモードとの相性も良い。Terraformの統合テストを含むインフラ管理にはInfracostによるコスト可視化と組み合わせると、開発段階からコスト最適化が可能になる。
制限事項・注意点
FlociはあくまでローカルAWS開発・テスト用エミュレータ。本番ワークロードの実行は非推奨。
・サービス数の上限: 29サービスに留まる。Redshift・Glue・Athenaなど分析系は未対応
・Lambda実行にDockerが必須: Lambdaエミュレーションは実際のDockerコンテナを起動するため、Docker Engineが動作している環境が前提
・API互換性の限界: AWSの全APIパラメータが忠実に再現されているわけではない。エッジケースでの挙動差異に注意
・商用サポートなし: GitHub IssuesまたはSlackコミュニティで対応
これらを踏まえても、「無料・軽量・認証トークン不要」という3点で、FlociはLocalStack 代替の第一候補たり得る。まずはローカルで29サービスの範囲を試し、自分のワークロードが収まるかを確かめるところから始めたい。