Flociが公開から2ヵ月で52サービスへ、アップデートをまとめてみた

Flociが公開から2ヵ月で52サービスへ、アップデートをまとめてみた

2026.05.30

こんにちは。サービス開発室の武田です。

LocalStackの代替として登場したオープンソースのAWSエミュレータ「Floci」を、これまで2回取り上げてきました。

前回の記事からさらに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)

ExecuteStatementExecuteTransactionBatchExecuteStatementが実装されました。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などの関数に対応していないためです。比較演算子やLIKEBETWEENINIS 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)。PostConfirmationPreSignUpに対応
  • 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)。CreateGrantListGrantsRevokeGrantなどに対応

「実エンジンで動かす」路線の拡大

前回記事で紹介した「制御プレーンは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スクリプトの中でawslocalawsコマンドを使っている場合は、こちらのイメージに替えればそのまま動きます。

# 標準イメージ
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.io127.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の代替として様子見していた方にとって、移行を具体的に検討できる段階になってきました。引き続き様子を見ていきたいですね。

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事