- OpenTofuの内部
- リモートサービス検出
リモートサービス検出
OpenTofuは、その機能の多くをリモートサービスとして実装しています。多くの場合、これらは多くのアプリケーションで役立つ汎用的なサードパーティ製サービスですが、OpenTofuのニーズに合わせて特別に調整されたサービスもあります。これらを* OpenTofuネイティブサービス*と呼び、OpenTofuは以下に示すリモートサービス検出プロトコルを介してそれらと対話します。
ユーザー向けホスト名
ユーザーの観点からは、OpenTofuネイティブサービスは、構成と必要な認証クレデンシャルのキーとして機能する、ユーザー向けの「フレンドリーホスト名」で提供されます。
検出プロトコルの目的は、ユーザーが指定したホスト名から特定のサービスのベースURLにマッピングすることです。各ホストは、サービスの異なる組み合わせを提供できます(または、サービスをまったく提供しない場合もあります)。そのため、検出プロトコルには、OpenTofuが特定のホスト名に対して*どの*サービスが有効かを識別できるようにするという二次的な目的があります。
たとえば、モジュールソース文字列には、最初のセグメントとしてモジュールレジストリホスト名を含めることができます(例: `example.com/namespace/name/provider`)。OpenTofuはサービス検出を使用して、`example.com`にモジュールレジストリが*ある*かどうか、そしてある場合はそのAPIがどこで利用できるかを判断します。
ユーザー向けホスト名は、Unicode形式で表現された完全修飾国際化ドメイン名です(対応する「punycode」形式は許可されていません)。ポート443でHTTPSサーバーが実行されているアドレスにDNSで解決できる必要があります。
ユーザー向けホスト名は、標準のUnicode Nameprepアルゴリズムを使用して内部比較のために正規化されます。これには、すべての文字を小文字に変換し、可能な場合は結合分音記号を合成済み形式に正規化すること、およびその他のさまざまな正規化手順が含まれます。
検出プロセス
ホスト名が与えられると、検出は、そのホスト名に`https:`スキームと固定パス`/.well-known/terraform.json`を使用して初期検出URLを形成することから始まります。
たとえば、ホスト名`example.com`が与えられた場合、初期検出URLは`https://example.com/.well-known/terraform.json`になります。
次に、OpenTofuはこの検出URLに`GET`リクエストを送信し、JSONレスポンスを期待します。レスポンスのステータスが200でない場合、メディアタイプが`application/json`でない場合、または本文をJSONオブジェクトとして解析できない場合、検出は失敗し、OpenTofuはホストが* OpenTofuネイティブサービスをサポートしていないと見なします。
レスポンスがHTTPリダイレクトである場合、OpenTofuは新しい場所を検出URLとしてこの手順を繰り返します。OpenTofuは少なくとも1つのリダイレクトをたどることが保証されていますが、ネストされたリダイレクトは保証も推奨もされていません。
レスポンスが有効なJSONオブジェクトである場合、そのキーはOpenTofuネイティブサービス識別子であり、サービスタイプ名とバージョン文字列がピリオドで区切られています。たとえば、モジュールレジストリプロトコルバージョン1のサービス識別子は`modules.v1`です。
各オブジェクト要素の値は、問題のサービスのベースURLです。このURLは絶対パスまたは相対パスのいずれかであり、相対パスの場合は、(リダイレクト*後*に)最終的な検出URLに対して解決されます。
以下は、モジュールレジストリプロトコルバージョン1のサポートを宣言する検出ドキュメントの例です。
{
"modules.v1": "https://modules.example.com/v1/"
}
`{"modules.v1": "https://example.com/terraform/modules/v1"}`
サポートされているサービス
- 現在、以下のサービス識別子が使用されています。
- `login.v1`:ログインプロトコルバージョン1
- `modules.v1`:モジュールレジストリAPIバージョン1
`providers.v1`:プロバイダーレジストリAPIバージョン1
認証
CLI設定で`credentials_helper`またはホスト固有の環境変数を介して指定されたホスト名のクレデンシャルが使用可能な場合、それらは検出ドキュメントのリクエストに含まれます。
問題のサービスの要件に応じて、クレデンシャルは検出ドキュメントで宣言されたエンドポイントにも提供される場合があります。
ユーザー向けホスト名における非標準ポート
標準のHTTPSポート443でホスト名の検出ドキュメントを提供することを強くお勧めします。ただし、開発環境では、これは常に可能または便利とは限らないため、OpenTofuでは、ホスト名をコロンとそれに続く1つ以上の10進数で構成されるポート指定で終了させることができます。
カスタムポート番号が存在する場合、そのポートのサービスはHTTPSを実装し、同じ固定検出パスに応答することが期待されます。