コンテンツにスキップ
シークレット

シークレット

Composia は age 暗号化を使用して期待状態リポジトリ内の暗号化シークレットファイルを管理します。暗号化と復号はコントローラー上で行われます。エージェントは age 秘密鍵に一切アクセスしません。

設定

シークレットには age 鍵ペアが必要です。コントローラー設定で設定します:

controller:
  secrets:
    provider: age
    identity_file: "/app/configs/age-identity.key"
キー必須説明
providerstringはいage である必要があります。
identity_filestringはいage 秘密鍵ファイルへのパス。
recipient_filestringいいえage 受信者(公開鍵)を含むファイルへのパス。省略した場合、受信者は秘密鍵から導出されます。
armorboolいいえASCII アーマー出力を使用します。デフォルトは true

鍵ペアの生成:

age-keygen -o age-identity.key

オプション: 公開鍵を受信者として抽出:

age-keygen -y age-identity.key > age-recipients.txt

シークレットの保存方法

リポジトリ内のシークレットファイルは慣例として .enc 拡張子を持ちます。age 暗号化された暗号文として保存されます:

my-app/
├── docker-compose.yaml
├── composia-meta.yaml
└── .secret.env.enc        (age で暗号化)

コントローラーは書き込み時に平文を暗号化し、読み取り時に復号します。リポジトリには暗号文のみが含まれます。シークレットがリポジトリ内、タスクログ内、またはエージェントへの転送中に平文で現れることはありません。

シークレットがエージェントに届く仕組み

デプロイまたは更新タスクのレンダリングステップ中に、コントローラーは:

  1. リポジトリ内のサービスディレクトリから暗号化ファイルを読み取ります。
  2. age 秘密鍵を使用して各ファイルを復号します。
  3. .enc 接尾辞を削除し、復号した内容を実行時ファイル名で注入します。たとえば .secret.env.enc.secret.env になります。

バンドルはエージェントレポート接続を通じてエージェントにストリーミングされます。エージェントはバンドルをディスクに書き込み、docker compose up を続行します。復号されたシークレット環境は、エージェントが秘密鍵を見ることなく Compose サービスから利用可能になります。

composia-meta.yaml のファイル参照には .env.enc のようなリポジトリ名を使用し、Composia が実行時の利用前に .env へ変換します。Compose ファイル、Caddyfile、スクリプト内では実行時名 .env を直接使用します。

CLI の使用

暗号化シークレットファイルの書き込み:

composia service my-app edit .secret.env.enc

シークレットファイルの読み取りと復号:

composia repo get my-app/.secret.env.enc

シークレットのインプレース編集(エディタが開きます):

composia repo update --file ./local-plain.env my-app/.secret.env.enc

すべてのシークレット書き込み操作には、同時変更との競合を防ぐためのベースリビジョンチェックが含まれます。

ファイルパスのルール

シークレットファイルのパスは:

  • サービスディレクトリからの相対パス(絶対パスではない)である必要があります。
  • ../ のようなパス横断シーケンスを含んではいけません。
  • サービスディレクトリ内のファイルを指す必要があります。

コントローラーはサービスを見つけ、サービスディレクトリからの相対パスとしてファイルパスを解決し、リポジトリファイルに対して操作を行います。

エラー条件

  • シークレット未設定: .enc への Repo アクセスは FailedPrecondition を返します。
  • ファイルが見つからない: GetRepoFileNotFound を返します。
  • ベースリビジョン競合: UpdateRepoFile は CAS でリポジトリ HEAD を保護します。
最終更新日 • alexma233