provider v1.0.1 · Registry verified

Take the vendor out of your Terraform code.

Takoform is an open-source specification and a Terraform/OpenTofu provider. You describe what you need — a bucket, a queue, a database — and a conforming host can select and operate a backend for that exact portable contract. Support, replacement, and migration still depend on the host and an explicit operator plan.

  • MIT license
  • 34 published immutable Form Packages
  • Exactly 10 admitted portable-standard
  • One read-only data "takoform_interface" projection
  • Definitions are data, not code
main.tf
terraform {
  required_providers {
    takoform = {
      source  = "registry.terraform.io/tako0614/takoform"
      version = "= 1.0.1"
    }
  }
}

# Published on the canonical Registry; keep the exact pin.
provider "takoform" {
  endpoint = "https://forms.example.com"
  space    = "prod"
}

resource "takoform_object_bucket" "assets" {
  name             = "assets"
  storage_class    = "standard"
  versioning       = true
  access_protocols = ["s3_api"]
}

Why

Terraform code usually names a vendor. Writing aws_s3_bucket ties the module and its state to AWS, and moving to another cloud means rewriting. Takoform resources name only what you need, so the choice of backend stays on the host side. Portability is a contract boundary, not proof that every host supports every Form or can migrate an existing resource.

aws_s3_bucket Works on AWS only. Moving elsewhere means rewriting the module and migrating state by hand.
takoform_object_bucket Uses one portable Form contract. A host must prove support for the exact Form, and any migration remains explicit operator work.

How it works

The provider delivers typed desired state to a host and observes the result. A conforming host implements the Takoform API, validates the exact Form identity, and owns creating, changing, and deleting the backend. The selected-ten admission retains a signed Takosumi host report; every other host must still prove its own exact support.

01

Write

Describe what you need with typed takoform_* resources. The resource type does not name a backend vendor.

02

Apply

On apply, the provider sends the configuration to the host over HTTP. Nothing is changed during plan.

03

The host runs it

The host chooses the backend, holds the credentials, and makes the changes. The provider synthesizes the portable Kind/name ID itself and writes drift, portability, and public outputs only after both host documents satisfy the exact closed Form schemas. An undeclared key, backend target, or credential rejects the whole state projection.

The published Form resources

All 34 portable Form Packages across compute, data, analytics, networking, and operations are published and immutable. Exactly 10 are admitted as portable-standard under forms/admissions/v1.0.6; the other 24 are published but not admitted. Each describes what you want, never who runs it.

Compute and application

takoform_edge_workerEdge/event-driven application served from a prebuilt immutable artifact
takoform_container_serviceOCI container service pinned to an immutable image digest
takoform_compute_instanceLong-running machine instance built from digest-bound boot-image bytes
takoform_static_siteStatic asset site served from a prebuilt immutable artifact
takoform_workflowDurable workflow definition and instance-state lifecycle
takoform_stateful_entityNamespace of addressable persistent entities implemented by digest-bound application bytes
takoform_scheduleCron lifecycle that invokes exactly one connected Resource

Data and storage

takoform_object_bucketObject storage with a portable default storage class
takoform_object_lifecycle_ruleOne expiration or storage-transition action applied to a connected object store
takoform_key_value_storeKey/value state with an optional consistency preference
takoform_cache_clusterIn-memory cache sized by an open capability token
takoform_relational_databaseRelational database addressed through an open engine capability token
takoform_indexed_storeBounded key/value item store with declared queryable attributes and no query language
takoform_queueAsynchronous delivery with at-least-once semantics
takoform_stream_topicPublished event stream that many independent consumers can read
takoform_search_indexFull-text index over a declared set of document fields
takoform_vector_indexVector index with dimensions fixed for the index lifecycle

Analytics and inference

takoform_analytics_datasetAppend-oriented dataset queried for analysis rather than transactions
takoform_model_endpointInference endpoint serving digest-bound model bytes for one declared task

Network and delivery

takoform_dns_zoneAuthoritative DNS zone for one domain
takoform_dns_recordDNS record published into one connected zone
takoform_tls_certificateManaged TLS certificate for a fixed set of domains. Key material stays with the host
takoform_http_routeHostname and path binding that sends HTTP traffic to one connected Resource
takoform_load_balancerListener that distributes connections across connected backends
takoform_private_networkPrivate address space that other Resources can attach to

Operations and integration

takoform_container_registryOCI artifact registry namespace
takoform_log_sinkDestination that retains structured application logs
takoform_metric_sinkDestination that retains numeric time series
takoform_email_senderOutbound mail identity for one verified domain
takoform_webhook_endpointInbound HTTP endpoint that forwards received requests to one connected Resource
takoform_identity_clientOIDC relying-party registration. Issued client material stays with the host
takoform_feature_flagNamed runtime switch expressed as one complete enabled percentage
takoform_rate_limit_policyRequest budget applied to one connected Resource
takoform_backup_policyScheduled copy and retention rule for one connected Resource

More are coming

This published set is a starting point, not the limit. The specification can define additional service kinds in the same data-only format. A new Form still needs its own specification, tests, publication, host evidence, and admission. If something you need is missing, propose it on GitHub.

Propose a resource

The provider deliberately has no settings for backends, credentials, prices, or billing. Those belong to the host.

Configuring a service

Portable does not have to mean bare. The application resources take a configuration map, so a service can actually be configured from the same code that describes it. The rest of the set carries the settings that checking these definitions against real cloud provider contracts showed were missing.

main.tf
resource "takoform_container_service" "api" {
  name              = "api"
  image             = "registry.example.com/api@sha256:845b5424415de5f77dd5753cbb7c1be8bd8e44cc81f20f9705783a02f8848317"
  ports             = [8080]
  replicas          = 3
  health_check_path = "/healthz"

  # Non-secret only. The host injects credentials on its own path.
  configuration = {
    LOG_LEVEL = "info"
  }
}

resource "takoform_relational_database" "primary" {
  name              = "primary"
  engine            = "postgres"
  engine_version    = "17"
  size_class        = "db.small"
  database_name     = "app"
  high_availability = true
}
configuration Non-secret values the running service reads. The desired values remain in code and state, but only a host that supports the exact Form and fields can realize them.
DATABASE_PASSWORD Not portable configuration. Map keys are held to the same data-only field policy as declared fields, so a credential cannot be smuggled in as configuration. Secret material is never portable state: a host injects it through its own credential path.

takoform_edge_worker, takoform_container_service, takoform_compute_instance, takoform_workflow, and takoform_stateful_entity take a configuration map. Elsewhere the added settings are ordinary typed arguments: size class, initial database name, and a standby for a relational database; replica count and a health check path for a container service; internal-only listeners and an idle timeout for a load balancer; retention, message size, delivery delay, and ordering for a queue, which can now also name a connection for messages it could not deliver.

Design principles

Definitions are data

Resource definitions and their test fixtures are plain JSON. They contain no executable code, and the verifier rejects anything that does.

Verify, then trust

Published releases are signed and pinned by digest. All 34 current packages have immutable releases; only the exact 10 bound by the admission evidence may be called portable-standard.

The host operates

Backend choice, credentials, and operations belong to the host. The provider only submits what you asked for.

Both lifecycles tested

Terraform and OpenTofu are tested separately against an in-process test host. This is portable test coverage, not live-host proof.

The specification

Everything the provider and a host agree on is written down as data-only documents. Start with the public provider documentation or browse the specification.

  • /docs/ Provider configuration, 34 Form resource references, examples, and the read-only data "takoform_interface" projection.
  • /spec/ The public host, Form, package, interface, trust, conformance, and versioning contracts.
  • spec/host-api How the provider talks to a host: discovery, preview, apply, observe, delete.
  • spec/form-definition How a service type is defined as data, and how definitions are identified. It also sets what a configuration map key is allowed to be.
  • spec/form-package How definitions are packaged, distributed, and verified.
  • spec/interface-declaration How a service declares what it exposes at runtime. The host still owns the record and who may use it.
  • spec/trust How releases are signed, and what gets rejected.

Current status

The published identities and the limits that remain, as of the latest retained evidence.

Working today

  • The schemas and an offline package verifier
  • Published provider v1.0.1, installed and read back from the canonical Registry with Terraform and OpenTofu
  • 34 statically typed Form resources with create, update, delete, import, and drift detection against an in-process test host
  • One read-only data "takoform_interface" projection; Form definitions declare interfaces, while the host owns their records, bindings, authorization, and lifecycle
  • Non-secret configuration on the application resources
  • Lifecycle tests on both Terraform and OpenTofu, run against an in-process test host
  • All 34 current Form Packages as signed, immutable releases
  • forms/admissions/v1.0.6, admitting exactly 10 packages as portable-standard

Limits that remain

  • The API is still forms.takoform.com/v1alpha1; provider SemVer does not make it stable
  • The other 24 published Form Packages are not admitted as portable-standard
  • The retained Takosumi host report covers the exact admitted 10; it is not universal proof for every host
  • Backend availability, placement, credentials, support, and migration remain host/operator responsibilities

The historical generation published before the rebuild is retired, not erased. Its releases keep their immutable bytes, signatures, and admission evidence, and still verify offline. Nothing there is rewritten or re-signed, and the current ga-core-v2 closure does not inherit those proofs. In the source descriptor, publicationStatus: candidate-only is candidate metadata; signed release and readback evidence establish the live status of v1.0.1.

Run it locally

shell
# clone and run the complete repository gate
git clone https://github.com/tako0614/terraform-provider-takoform
cd terraform-provider-takoform

bun run check

# run the source conformance verifier directly
go run ./cmd/standard-form-conformance verify

provider v1.0.1 · Registry 検証済み

Terraform のコードから、
ベンダー名をなくす。

Takoform は、サービスをベンダー中立に書くためのオープンな仕様と、その Terraform/OpenTofu プロバイダです。コードに書くのはバケット・キュー・データベースといった必要なものだけ。対応ホストは、その正確なポータブル契約に対してバックエンドを選び、運用できます。ただし、対応状況・置換・移行はホストと明示的な運用計画に依存します。

  • MIT ライセンス
  • 公開済みの immutable な Form Package 34 件
  • 正確な 10 件を portable-standard として admission
  • 読み取り専用の data "takoform_interface" projection 1 種類
  • 定義はデータのみで、コードを含みません
main.tf
terraform {
  required_providers {
    takoform = {
      source  = "registry.terraform.io/tako0614/takoform"
      version = "= 1.0.1"
    }
  }
}

# canonical Registry で公開済み。正確な version を pin する。
provider "takoform" {
  endpoint = "https://forms.example.com"
  space    = "prod"
}

resource "takoform_object_bucket" "assets" {
  name             = "assets"
  storage_class    = "standard"
  versioning       = true
  access_protocols = ["s3_api"]
}

なぜ作ったか

Terraform のコードには、ふつうベンダー名が入ります。aws_s3_bucket と書いた時点でそのモジュールと state は AWS 専用になり、別のクラウドへ移すには書き直すしかありません。Takoform のリソース型は必要なものをベンダー中立に表します。ただし、ポータビリティは契約の境界であり、すべてのホストがすべての Form を実装する証明でも、既存リソースをそのまま移行できる保証でもありません。

aws_s3_bucket AWS でしか使えません。移行にはモジュールの書き直しと state の移し替えが必要です。
takoform_object_bucket 1 つのポータブルな Form 契約を使います。ホストはその正確な Form への対応を証明する必要があり、移行は運用者が明示的に行います。

しくみ

プロバイダは、型付き desired state をホストへ届け、結果を観測します。対応ホストは Takoform API を実装し、正確な Form identity を検証したうえで、バックエンドを作る・変える・消す責任を持ちます。選択された 10 Form の admission には署名付き Takosumi host report が保持されていますが、ほかのホストはそれぞれ正確な対応を証明する必要があります。

01

書く

型の決まった takoform_* リソースで、必要なものを書きます。リソース型はバックエンドのベンダー名を持ちません。

02

送る

apply すると、プロバイダは書かれた内容を HTTP でホストに送ります。plan の段階では何も変更しません。

03

ホストが動かす

バックエンドの選択、認証情報の管理、実際の変更はホストの仕事です。プロバイダは portable な Kind/name ID を自分で合成し、ホストの observed / output が正確な Form の閉じた schema を満たした場合だけ drift・portability・公開出力を state に書きます。未宣言のキー、バックエンド target、認証情報が一つでも入れば state への反映全体を拒否します。

公開済みの Form リソース

計算・データ・分析・ネットワーク・運用にまたがる Form Package 34 件はすべて公開済みで immutable です。forms/admissions/v1.0.6 で正確な 10 件を portable-standard として admission し、残り 24 件は公開済みですが admission されていません。どれも「何が欲しいか」だけを書き、「誰が動かすか」は書きません。

計算とアプリケーション

takoform_edge_workerエッジ/イベント駆動アプリケーション
takoform_container_serviceコンテナサービス
takoform_compute_instancedigest で固定した起動イメージを使う長時間稼働マシン
takoform_static_site静的サイト
takoform_workflow長時間実行ワークフロー
takoform_stateful_entitydigest で固定したアプリケーションが実装する、アドレス可能で永続的な entity namespace
takoform_scheduleスケジュール実行

データとストレージ

takoform_object_bucketオブジェクトストレージ
takoform_object_lifecycle_rule接続先 object store に適用する、期限切れまたは storage transition の単一アクション
takoform_key_value_storeKey/Value ストレージ
takoform_cache_clusterインメモリキャッシュ
takoform_relational_databaseリレーショナルデータベース
takoform_indexed_storeキー指定データストア
takoform_queueメッセージキュー
takoform_stream_topicイベントストリーム
takoform_search_index全文検索インデックス
takoform_vector_indexベクトルインデックス

分析と推論

takoform_analytics_dataset分析用データセット
takoform_model_endpointdigest で固定した model bytes を 1 つの task に提供する推論エンドポイント

ネットワークと配信

takoform_dns_zoneDNS ゾーン
takoform_dns_recordDNS レコード
takoform_tls_certificateTLS 証明書
takoform_http_routeHTTP ルート
takoform_load_balancerロードバランサー
takoform_private_networkプライベートネットワーク

運用と連携

takoform_container_registryコンテナレジストリ
takoform_log_sinkログ保存先
takoform_metric_sinkメトリクス保存先
takoform_email_senderメール送信
takoform_webhook_endpointWebhook 受信口
takoform_identity_clientOIDC クライアント
takoform_feature_flag完全な enabled percentage 1 つで表す、名前付き runtime switch
takoform_rate_limit_policyレート制限
takoform_backup_policyバックアップ

ここで終わりではありません

この公開済みセットが上限ではありません。仕様は、別のサービス種別も同じデータ形式で定義できます。ただし、新しい Form ごとに仕様・テスト・公開・ホスト証跡・admission が必要です。足りないものがあれば GitHub で提案してください。

リソースを提案する

このプロバイダには、バックエンドの指定・認証情報・価格・課金の設定はあえてありません。それらはホスト側で管理します。

サービスを設定する

ベンダー中立でも、何も設定できないわけではありません。アプリケーション系のリソースには configuration マップがあり、サービスの設定を同じコードの中に書けます。それ以外のリソースにも、実際のクラウドの契約と突き合わせて足りないとわかった項目を入れてあります。

main.tf
resource "takoform_container_service" "api" {
  name              = "api"
  image             = "registry.example.com/api@sha256:845b5424415de5f77dd5753cbb7c1be8bd8e44cc81f20f9705783a02f8848317"
  ports             = [8080]
  replicas          = 3
  health_check_path = "/healthz"

  # シークレットでない値だけ。認証情報はホストが自前の経路で注入する。
  configuration = {
    LOG_LEVEL = "info"
  }
}

resource "takoform_relational_database" "primary" {
  name              = "primary"
  engine            = "postgres"
  engine_version    = "17"
  size_class        = "db.small"
  database_name     = "app"
  high_availability = true
}
configuration 動いているサービスが読む、シークレットでない値です。desired value はコードと state に残りますが、正確な Form とフィールドに対応するホストだけが実現できます。
DATABASE_PASSWORD これは configuration には書けません。マップのキーにも、通常のフィールドと同じデータのみのポリシーがかかります。認証情報を設定に紛れ込ませることはできません。シークレットは state に載せるものではなく、ホストが自前の経路で注入します。

configuration マップを持つのは takoform_edge_worker / takoform_container_service / takoform_compute_instance / takoform_workflow / takoform_stateful_entity です。ほかに増えたのは普通の型付き引数で、リレーショナルデータベースのサイズクラス・初期データベース名・スタンバイ、コンテナサービスのレプリカ数とヘルスチェックパス、ロードバランサーの内部限定リスナーとアイドルタイムアウト、キューの保持期間・最大メッセージサイズ・配信遅延・順序保証があります。キューは、配信できなかったメッセージの送り先を connections で指せるようにもなりました。

設計方針

定義はデータだけ

リソースの定義もテストデータも、ただの JSON です。実行コードは含められず、含まれていれば検証で弾かれます。

検証してから信頼する

公開済みリリースには署名が付き、内容は digest で固定されます。現在の Form Package 34 件はすべて immutable に公開済みで、admission 証跡に束ねた正確な 10 件だけを portable-standard と呼びます。

運用はホストに任せる

バックエンドの選択も、認証情報も、実際の操作もホストの担当です。プロバイダは頼まれた内容を送るだけです。

両方でテストする

Terraform と OpenTofu を同じものとは見なさず、プロセス内のテスト用ホストに対して別々にテストしています。これは portable test の網羅であり、実ホストの証明ではありません。

仕様

プロバイダとホストの間の取り決めは、すべてデータだけのドキュメントに書いてあります。まず公開版の プロバイダドキュメントを読むか、仕様を参照できます。

  • /docs/ プロバイダ設定、34 Form のリソースリファレンス、例、読み取り専用の data "takoform_interface" projection。
  • /spec/ host、Form、package、interface、trust、conformance、versioning の公開契約。
  • spec/host-api ホストの見つけ方と、preview / apply / observe / delete のやりとり。
  • spec/form-definition サービスの種類をデータとして定義する方法と、その識別のしかた。設定マップのキーに何を認めないかも、ここで決めています。
  • spec/form-package 定義をパッケージにして配布・検証する方法。
  • spec/interface-declaration サービスが実行時に何を提供するかの宣言。その記録と利用の許可はホストが持ちます。
  • spec/trust リリースへの署名と、何を受け入れて何を拒否するか。

いまの状態

できていることと、まだできていないことをそのまま書いています。

できていること

  • スキーマ一式と、オフラインで動くパッケージ検証ツール
  • canonical Registry から Terraform / OpenTofu の両方で install と readback を確認した provider v1.0.1
  • プロセス内のテスト用ホストに対して、作成・更新・削除・import・drift 検出まで対応した型付き Form 34 種類
  • 読み取り専用の data "takoform_interface" projection 1 種類。Form 定義が interface を宣言し、record・binding・認可・lifecycle はホストが所有します
  • アプリケーション系リソースの、シークレットを含まない configuration
  • Terraform / OpenTofu それぞれでのライフサイクルテスト。相手はプロセス内のテスト用ホストです
  • 現在の Form Package 34 件すべての署名付き immutable release
  • forms/admissions/v1.0.6 による、正確な 10 件の portable-standard admission

残っている境界

  • API は forms.takoform.com/v1alpha1 のままです。provider SemVer は API を stable にしません
  • 残り 24 件の公開済み Form Package は portable-standard として admission されていません
  • 保持された Takosumi host report が証明するのは正確な 10 件だけで、すべての host に共通する証明ではありません
  • バックエンドの availability・placement・credential・support・migration は host / operator の責務です

作り直す前に公開した過去の世代は、消さずに retire しています。リリースの immutable bytes・署名・admission の証跡はそのまま残り、いまもオフラインで検証できます。書き換えも署名し直しもしませんし、現在の ga-core-v2 closure がその証跡を引き継ぐこともありません。source descriptor の publicationStatus: candidate-only は candidate metadata であり、v1.0.1 の live status は署名付き release と readback evidence が確定します。

手元で動かす

shell
# clone してリポジトリ全体の gate を実行する
git clone https://github.com/tako0614/terraform-provider-takoform
cd terraform-provider-takoform

bun run check

# source conformance verifier を直接実行する
go run ./cmd/standard-form-conformance verify