Flociが公開から2ヵ月で52サービスへ、アップデートをまとめてみた
こんにちは。サービス開発室の武田です。
LocalStackの代替として登場したオープンソースのAWSエミュレータ「Floci」を、これまで2回取り上げてきました。
- 1回目: 導入と主要サービスの動作検証(2026年3月)
- 2回目: 公開から1ヵ月のアップデートまとめ(2026年4月30日)
前回の記事からさらに1ヵ月が経ちました。相変わらず開発が活発で、これは第3弾です。今回は新しく増えたサービスや機能をいくつか手元で動かしながら、この1ヵ月のアップデートをまとめていきます。
この1ヵ月の主な変化(2026年5月30日時点)
前回記事(1.5.10時点)から現在(1.5.20)までの変化をサマリーすると、次のとおりです。
- リリース 10回(1.5.10 → 1.5.20)、 237コミット。約3日に1回というペースは変わらず
- GitHubスターが 4,276 → 13,299 へ(約3倍)
- 対応サービスが 41 → 52 へ(公式表記)
- CloudFront・AWS Config・Neptune・Route53・コスト系サービスなど、新サービスが続々追加
- DynamoDB PartiQLやS3 Selectなど、既存サービスにも実用的な機能が追加
- EC2が実Dockerコンテナ実行に対応するなど、「実エンジンで動かす」路線がさらに拡大
- LocalStackからの移行支援(
awslocal同梱イメージ、環境変数の自動翻訳、専用DNS)が整理された
順に見ていきます。
開発の勢いと互換性テスト
GitHub APIで集計したところ、前回記事を公開した2026年4月30日(1.5.10)から本記事執筆時点(1.5.20)まで、リリースは10回、コミットは237件でした。スター数は前回の4,276から13,299まで増えています(約3倍)。
互換性テストの規模も拡大しています。第1弾の記事では「408件のSDKテスト」と紹介しましたが、READMEによると現在は 1,968件 です。
| モジュール | 言語/ツール | テスト数 |
|---|---|---|
| Java(AWS SDK v2) | Java 17 | 899 |
| Node.js(AWS SDK v3) | Node.js | 366 |
| Python(boto3) | Python 3 | 272 |
| AWS CLI v2 | bash | 152 |
| Go(AWS SDK v2) | Go | 144 |
| Rust(AWS SDK) | Rust | 90 |
| Terraform | v1.10+ | 14 |
| OpenTofu | v1.9+ | 14 |
| AWS CDK | v2+ | 17 |
6つのSDKと3つのIaCツールにまたがる構成です。
対応サービスが52個へ
前回記事では41サービスでしたが、現在は公式表記で 52サービス です。この1ヵ月で追加された主な新顔を挙げます。
| 分類 | サービス | 追加バージョン |
|---|---|---|
| CDN | CloudFront | 1.5.18 |
| ガバナンス | AWS Config | 1.5.18 |
| グラフDB | Neptune | 1.5.17(1.5.18でGremlinバックエンド) |
| DNS | Route53 | 1.5.13 |
| バックアップ | AWS Backup | 1.5.13 |
| ファイル転送 | Transfer Family | 1.5.13 |
| AI/ML | Textract、Transcribe | 1.5.14 / 1.5.16 |
| コスト/FinOps | Pricing、Cost Explorer、CUR、BCM Data Exports | 1.5.15〜1.5.17 |
| その他 | Glue Schema Registry、EC2 Auto Scaling | 1.5.12 |
特にコスト系(Price List → Cost Explorer → Cost and Usage Reports + BCM Data Exports)が短期間でそろいました。FinOps系ツールのローカル検証ができるようになった点が目を引きます。
実機で軽く動かしてみる
新サービスのうち、いくつかを手元で動かしてみました。環境構築は前回記事と同じくdocker-compose.ymlを用意するだけです。今回はバージョンを固定して使っています(理由は後述します)。
$ export AWS_ENDPOINT_URL=http://localhost:4566
$ export AWS_DEFAULT_REGION=us-east-1
$ export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test
まずRoute53です。ホストゾーンを作成すると、NSレコードを含む応答が返ってきました。
$ aws route53 create-hosted-zone --name example.internal --caller-reference cref-001
{
"HostedZone": {
"Id": "/hostedzone/Z8YPQUSGTJFS65K",
"Name": "example.internal.",
"CallerReference": "cref-001",
"ResourceRecordSetCount": 2
},
"ChangeInfo": {
"Status": "INSYNC"
},
"DelegationSet": {
"NameServers": [
"ns-1.awsdns-01.org",
"ns-2.awsdns-02.net",
"ns-3.awsdns-03.com",
"ns-4.awsdns-04.co.uk"
]
}
}
AWS Configも、設定レコーダー(configuration recorder)を作成して取得できました。
$ aws configservice put-configuration-recorder \
--configuration-recorder 'name=default,roleARN=arn:aws:iam::000000000000:role/aws-config-role'
$ aws configservice describe-configuration-recorders
{
"ConfigurationRecorders": [
{
"name": "default",
"roleARN": "arn:aws:iam::000000000000:role/aws-config-role"
}
]
}
Pricing(AWS Price List)は、サービスと属性の一覧があらかじめ組み込まれていました。
$ aws pricing describe-services --max-results 3
{
"Services": [
{
"ServiceCode": "AmazonEC2",
"AttributeNames": ["instanceType", "location", "tenancy", "operatingSystem", "productFamily"]
},
{
"ServiceCode": "AmazonS3",
"AttributeNames": [ ... ]
}
]
}
いずれも基本的なオペレーションは問題なく動きました。
既存サービスの機能強化
前回扱った範囲(S3、DynamoDBなど)でも、実用的な機能が追加されています。今回はそのうち2つを動かしてみました。
DynamoDB PartiQL(1.5.17)
ExecuteStatement・ExecuteTransaction・BatchExecuteStatementが実装されました。PartiQL(SQL風のインターフェース)でDynamoDBを操作できます。
# テーブル作成
$ aws dynamodb create-table --table-name Users \
--attribute-definitions AttributeName=userId,AttributeType=S \
--key-schema AttributeName=userId,KeyType=HASH \
--billing-mode PAY_PER_REQUEST
# INSERT
$ aws dynamodb execute-statement \
--statement "INSERT INTO \"Users\" VALUE {'userId':'u1','name':'Alice','age':30}"
$ aws dynamodb execute-statement \
--statement "INSERT INTO \"Users\" VALUE {'userId':'u2','name':'Bob','age':20}"
# SELECT
$ aws dynamodb execute-statement \
--statement "SELECT userId, name, age FROM \"Users\" WHERE userId = 'u1'"
{
"Items": [
{
"userId": { "S": "u1" },
"name": { "S": "Alice" },
"age": { "N": "30" }
}
]
}
INSERTした2件のうち、条件に一致する1件が正しく返りました。
S3 SelectObjectContent(1.5.16)
S3 Selectが、SELECT ... FROM S3Objectを実際に評価するようになりました。エンジンは2段構えです。floci-duck(DuckDB)が起動していれば、CSV・JSON・ParquetをフルのSQLで処理します。起動していなければ、CSVとJSONはJava製の簡易評価器にフォールバックします(Parquetはfloci-duckが必須)。
CSVを置いて全件取得してみます。
$ cat data.csv
name,age,city
Alice,30,Tokyo
Bob,20,Osaka
Carol,40,Nagoya
$ aws s3 mb s3://select-test
$ aws s3 cp data.csv s3://select-test/data.csv
$ aws s3api select-object-content --bucket select-test --key data.csv \
--expression "SELECT * FROM S3Object" --expression-type SQL \
--input-serialization '{"CSV":{"FileHeaderInfo":"USE"}}' \
--output-serialization '{"JSON":{}}' out.json
$ cat out.json
{"name":"Alice","age":"30","city":"Tokyo"}
{"name":"Bob","age":"20","city":"Osaka"}
{"name":"Carol","age":"40","city":"Nagoya"}
全件取得は問題なく動きました。一方で、WHERE CAST(age AS INTEGER) > 25のような関数を含む条件は、筆者の環境(floci-duck未起動)では結果が返りませんでした。これはフィルタが未実装なのではなく、簡易評価器がCASTなどの関数に対応していないためです。比較演算子やLIKE・BETWEEN・IN・IS NULLなら簡易評価器でも動きます(対応範囲はdocs/services/s3.mdに記載があります)。関数を含むフルのSQLを使いたい場合は、Athenaを一度実行するなどしてfloci-duckを起動すれば、同じCAST付きのクエリでも結果が返りました。
ひとつ注意点として、簡易評価器は未対応の式に出会っても、エラーや警告を出さずに黙って空の結果を返します。本物のAWS S3 Selectなら400エラーになる場面です。込み入ったクエリを使うときはfloci-duckを起動しておくか、結果が空でないかを確かめておくと安心です。
その他の強化
実機では試していませんが、リリースノートから目立つものを挙げておきます。
- Lambda Layers(1.5.19)。
PublishLayerVersionなどに対応し、レイヤー依存の関数をローカル検証可能に - API Gateway v2 WebSocket(1.5.12〜1.5.14)。管理プレーンとデータプレーンの両方
- SNS HTTP/HTTPS配信(1.5.18)。Webリクエスト形式のfan-out(webhook)テストに対応
- Cognito Lambdaトリガー(1.5.17)。
PostConfirmation・PreSignUpに対応 - CloudFormationの対応リソース拡大。Authorizer、Cognitoユーザープール、SQSなど
- CloudFormation SAM transform・ネストスタック(1.5.20)。
AWS::Serverless-2016-10-31の展開とAWS::CloudFormation::Stackに対応 - OpenSearch 3.x(1.5.20)。エンジンバージョン3.x対応と、レガシー向けの実ES 7.10 OSSイメージ
- KMS Grant API(1.5.20)。
CreateGrant・ListGrants・RevokeGrantなどに対応
「実エンジンで動かす」路線の拡大
前回記事で紹介した「制御プレーンはAWS互換、データプレーンは本物のエンジン」という二層構造が、さらに広がりました。
- EC2が実Dockerコンテナ実行に(1.5.11)。SSH・UserData・IMDSに対応し、インスタンスが実コンテナとして起動
- Neptune(1.5.17〜1.5.18)。
tinkerpop/gremlin-serverを裏で起動し、Gremlin WebSocket経由でグラフクエリを実行 - S3 Select(1.5.16)。前述のとおり
floci-duck(DuckDB)で実SQLを評価
Floci本体は軽量なJava/Quarkusアプリケーションのまま、忠実性が必要なところは本物のエンジンを立ち上げる、という方針が一貫しています。
LocalStackからの移行支援
前回記事のまとめで、気になる点として「LocalStackのawslocalのようなラッパーCLIは提供されていない」と書きました。この1ヵ月で、移行周りがまとめて手当てされています。
awslocal同梱の-compatイメージ
1.5.14で、AWS CLIとboto3、awslocalラッパを同梱した-compatイメージが追加されました。initスクリプトの中でawslocalやawsコマンドを使っている場合は、こちらのイメージに替えればそのまま動きます。
# 標準イメージ
image: floci/floci:latest
# initスクリプトでAWS CLIやboto3が必要な場合
image: floci/floci:latest-compat
環境変数とinitスクリプトの互換
LocalStackの主要な環境変数は自動で翻訳されます。
| LocalStack | Floci相当 |
|---|---|
LOCALSTACK_HOST |
FLOCI_HOSTNAME |
PERSISTENCE=1 |
FLOCI_STORAGE_MODE=persistent |
LAMBDA_DOCKER_NETWORK |
FLOCI_SERVICES_LAMBDA_DOCKER_NETWORK |
DEBUG=1 |
QUARKUS_LOG_LEVEL=DEBUG |
さらに、/etc/localstack/init/にマウントしたinitスクリプトはそのまま実行されます。/_localstack/init・/_localstack/healthエンドポイントも提供されます。自動翻訳を無効にしたい場合はLOCALSTACK_PARITY=falseを指定します。
専用DNS localhost.floci.io
1.5.15で、S3のvirtual-hosted styleアドレッシングに対応しました。合わせて、localhost.floci.ioと*.localhost.floci.ioを127.0.0.1に解決する公開DNSも用意されています。これはイメージに同梱されるものではなく、外部の権威DNS側の設定です。これで/etc/hostsの編集やカスタムリゾルバーなしに、http://<bucket>.s3.localhost.floci.io:4566がそのまま使えます。LocalStackのlocalhost.localstack.cloudも互換エイリアスとして引き続き解決されます。
「image:行を差し替えて、必要なら-compatにする」だけで移行を試せる状態になってきました。
プラットフォーム機能の強化
サービス単体ではなく、基盤側の機能も入りました。
- マルチアカウント分離(1.5.14)。アカウントごとにストレージを分離。複数アカウントを前提にしたテストがはかどる
- TLS/HTTPS対応(1.5.14)。自己署名の証明書を自動生成
- 再現可能ビルド(1.5.17)。
SOURCE_DATE_EPOCHにより、同じGitリビジョンからバイト単位で同一のイメージが作られる。SBOMやサプライチェーン検証向け - ECR Public Gallery公開(1.5.19)。Docker Hubのレート制限を回避したい場合や、AWSネイティブなCI環境で便利
- グローバルCORSフィルター(1.5.20)。ブラウザからエミュレータへ直接アクセス可能に
補足: ローカルのlatestは自動では更新されない
最後に、これはFloci自体の問題ではなく自分の確認不足だったのですが、参考までに共有します。今回、最初にfloci/floci:latestで起動したら、前回記事時点の 1.5.10 が立ち上がりました。新サービスがEnabled servicesに出てこず、しばらく悩みました。
floci 1.5.10 native (powered by Quarkus 3.34.3) started in 0.154s.
docker imagesで見ると、ローカルのlatestタグは4週間前のイメージ(1.5.10と同一のイメージID)を指していました。明示的にfloci/floci:1.5.20を指定してpullし直したところ、新サービスがすべて有効になりました。
floci 1.5.20 native (powered by Quarkus 3.34.6) started in 0.034s.
Enabled services: [..., neptune, route53, cloudfront, configservice, pricing, ce, cur, transcribe, ...]
latestのイメージは、ローカルにあるとdocker pullし直さない限り古いまま使われます(Docker全般の挙動です)。ただ、Flociはリリースのペースが速いぶん、数週間前のlatestが何バージョンも前になりがちで、症状も「新サービスが出てこない」だけと分かりにくいです。最新を使いたいなら、docker pull(Composeならpull_policy: always)で明示的に更新します。確実に同じ版を使いたいなら、floci/floci:1.5.20のようにバージョンをピン留めしておくとよいでしょう。
まとめ
この1ヵ月のFlociは、新サービスの追加、既存機能の強化、LocalStackからの移行支援のいずれも前進していました。手元で動かした範囲では、Route53・AWS Config・Pricing・DynamoDB PartiQL・S3 Select(全件)はいずれも基本的な操作が動きました。
- 対応サービスが52個へ拡充。CloudFront・AWS Config・Neptune・Route53・コスト系がそろった
- 既存サービスの機能追加。DynamoDB PartiQL、S3 Select(DuckDB連携)、Lambda Layersなど
- 「実エンジン」路線の拡大。EC2の実コンテナ実行、Neptune(Gremlin)、S3 Select(DuckDB)
- LocalStack移行支援の整備。
-compatイメージ(awslocal同梱)、環境変数の自動翻訳、localhost.floci.io専用DNS。前回記事で弱点として挙げた点が解消された - 基盤の強化。マルチアカウント分離、TLS、再現可能ビルド、ECR Public Gallery公開
一方で注意点もあります。S3 Selectの条件付きクエリのように、実装の深さにはサービスごとのばらつきがあります。READMEのservice notesやdocs/services/<service>.mdで対応状況を確認しておくとよいでしょう。また、リリース頻度が高いので、latestではなくバージョンをピン留めしておくことをお勧めします。
LocalStack Community Editionの代替として様子見していた方にとって、移行を具体的に検討できる段階になってきました。引き続き様子を見ていきたいですね。







