> ## Documentation Index
> Fetch the complete documentation index at: https://docs.coreweave.com/llms.txt
> Use this file to discover all available pages before exploring further.

# W&B シークレットを使用する

> Python または TypeScript を使用して、W&B のチームシークレットをサーバーレスサンドボックスに注入します。

W\&B Secret Manager を使用すると、API トークンなどの認証情報をサーバーレスサンドボックス内で利用できます。アプリケーションからシークレット名を Sandbox API に渡すと、API はサンドボックスの作成時に W\&B チームから値を解決し、環境変数として注入します。

<h2 id="before-you-begin">
  始める前に
</h2>

W\&B シークレット注入を使用するには、W\&B APIキーで認証されたサンドボックスが必要です。この機能はサーバーレスサンドボックスでは利用できますが、独自の CoreWeave Kubernetes Service (CKS) クラスター上のサンドボックスでは利用できません。CKS への配置では CoreWeave API アクセストークンを使用します。このトークンに別途 W\&B キーを組み合わせて、CKS サンドボックスのシークレットを解決することはできません。

| サンドボックスの配置 | サンドボックスの認証情報 | W\&B シークレット注入 |
| - | - | - |
| サーバーレス | W\&B APIキー | サポートされています。`wandb` ストアを使用します。 |
| サーバーレス | CoreWeave API アクセストークン | サポートされていません。 |
| 独自の CKS クラスター | CoreWeave API アクセストークン | サポートされていません。`WANDB_API_KEY` を追加しても有効になりません。 |

サンプルを実行するには、以下が必要です。

* [サーバーレスサンドボックスへのアクセス権](/ja/products/sandboxes/serverless/get-started)を持つ W\&B SaaS (Software as a Service) アカウント。
* W\&B チームの Secret Manager に登録された `HF_TOKEN` という名前のシークレット。シークレットが存在しない場合は、W\&B 管理者に[シークレットの追加](/ja/products/wandb/platform/secrets#add-a-secret)を依頼してください。
* そのチームへのアクセス権を持つ W\&B APIキー。

サンドボックスを作成するプロセスの環境で `WANDB_API_KEY` を設定します。`[WANDB-API-KEY]` はご自身の W\&B APIキーに置き換えてください。

```bash theme={"system"}
export WANDB_API_KEY="[WANDB-API-KEY]"
```

`WANDB_ENTITY` はオプションです。指定しない場合は、APIキーのデフォルトの entity が使用されます。シークレットが別のチームに属している場合は、`WANDB_ENTITY` にそのチームを設定してください。`[WANDB-TEAM]` はチーム名に置き換えます。

```bash theme={"system"}
export WANDB_ENTITY="[WANDB-TEAM]"
```

使用する言語のクライアントをインストールします。

<Tabs>
  <Tab title="Python">
    Python 3.11 以降を使用し、必要に応じて [`uv` をインストール](https://docs.astral.sh/uv/getting-started/installation/)します。Python 環境に、W\&B 認証用の依存関係とあわせてクライアントをインストールします。

    ```bash theme={"system"}
    uv pip install 'cwsandbox[wandb]'
    ```
  </Tab>

  <Tab title="TypeScript">
    Node.js 22 以降を使用します。TypeScript クライアントと、サンプルの実行に必要な `tsx` をインストールします。

    ```bash theme={"system"}
    npm install @coreweave/cwsandbox
    npm install --save-dev tsx
    ```

    実行したい TypeScript のサンプルを `secrets.mts` として保存し、`npx tsx secrets.mts` を実行します。
  </Tab>
</Tabs>

<h2 id="inject-a-secret">
  シークレットを注入する
</h2>

Python では `store="wandb"`、TypeScript では `store: "wandb"` を使用します。このストアは、認証済みの W\&B チームのシークレットを解決します。このフローでは、組織のシークレットストアを登録する必要はありません。

以下のサンプルでは、`HF_TOKEN` を注入し、値を出力せずにその存在を確認します。サンドボックス内の環境変数名は、デフォルトでシークレット名と同じになります。

<Tabs>
  <Tab title="Python">
    `AuthStrategy.WANDB` を使用して、W\&B 認証を明示的に選択します。

    ```python theme={"system"}
    from cwsandbox import AuthStrategy, Sandbox, Secret

    with Sandbox.run(
      auth=AuthStrategy.WANDB,
      placement_mode="serverless",
      container_image="python:3.11",
      resources={"cpu": "1", "memory": "1Gi"},
      secrets=[Secret(store="wandb", name="HF_TOKEN")],
    ) as sandbox:
      result = sandbox.exec([
        "python", "-c",
        "import os; assert os.environ.get('HF_TOKEN'); print('Secret is available')",
      ]).result()
      print(result.stdout)
    ```
  </Tab>

  <Tab title="TypeScript">
    W\&B のエントリポイントからクライアントをインポートします。`runnerIds` を省略すると、クライアントはサーバーレス配置を使用します。

    ```typescript theme={"system"}
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/wandb";

    const client = createSandboxClientFromEnv();

    const result = await client.withSandbox(
      async (sandbox) => sandbox.commands.run([
        "python", "-c",
        "import os; assert os.environ.get('HF_TOKEN'); print('Secret is available')",
      ]),
      {
        containerImage: "python:3.11",
        resources: { cpu: "1", memory: "1Gi" },
        secrets: [{ store: "wandb", name: "HF_TOKEN" }],
      },
    );

    console.log(result.stdout);
    ```
  </Tab>
</Tabs>

どちらのサンプルも `Secret is available` を出力し、操作の完了後にサンドボックスを停止します。サンドボックス内で実行されるコードは、`HF_TOKEN` から値を読み取れます。

`secrets` には、シークレットの値ではなく名前を渡してください。値はサーバー側で解決されます。値を出力したり、ログに書き込んだりしないでください。

<h2 id="secret-reference-fields">
  シークレット参照フィールド
</h2>

Python の `Secret` または TypeScript の `secrets` エントリでは、次のフィールドを使用します。

| Python フィールド | TypeScript フィールド | 必須 | 説明 |
| - | - | - | - |
| `store` | `store` | はい | シークレットストア名。W\&B Secret Manager を使用する場合は `wandb` を指定します。 |
| `name` | `name` | はい | 選択した W\&B チームの Secret Manager に登録されているシークレットの名前。 |
| `field` | `field` | いいえ | 値が JSON オブジェクトであるシークレットから取り出すトップレベルキー。省略すると、シークレットの値全体が注入されます。 |
| `env_var` | `envVar` | いいえ | 値を受け取る環境変数。デフォルトは `name` です。 |

<h2 id="use-a-custom-environment-variable-name">
  カスタム環境変数名を使用する
</h2>

シークレットを受け取る環境変数を指定するには、Python では `env_var`、TypeScript では `envVar` を設定します。次のサンプルでは、`HF_TOKEN` シークレットを `HUGGINGFACE_TOKEN` として公開します。

<Tabs>
  <Tab title="Python">
    ```python theme={"system"}
    from cwsandbox import AuthStrategy, Sandbox, Secret

    with Sandbox.run(
      auth=AuthStrategy.WANDB,
      placement_mode="serverless",
      container_image="python:3.11",
      secrets=[Secret(
        store="wandb",
        name="HF_TOKEN",
        env_var="HUGGINGFACE_TOKEN",
      )],
    ) as sandbox:
      result = sandbox.exec([
        "python", "-c",
        "import os; assert os.environ.get('HUGGINGFACE_TOKEN'); print('Secret is available')",
      ]).result()
      print(result.stdout)
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={"system"}
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/wandb";

    const client = createSandboxClientFromEnv();

    const result = await client.withSandbox(
      async (sandbox) => sandbox.commands.run([
        "python", "-c",
        "import os; assert os.environ.get('HUGGINGFACE_TOKEN'); print('Secret is available')",
      ]),
      {
        containerImage: "python:3.11",
        secrets: [{
          store: "wandb",
          name: "HF_TOKEN",
          envVar: "HUGGINGFACE_TOKEN",
        }],
      },
    );

    console.log(result.stdout);
    ```
  </Tab>
</Tabs>

どちらのサンプルも、`HUGGINGFACE_TOKEN` が設定されていることを確認してから `Secret is available` を出力します。

<h2 id="select-a-field-from-a-structured-secret">
  構造化シークレットからフィールドを選択する
</h2>

JSON オブジェクトから 1 つの値だけを注入するには、`field` にそのトップレベルキーを指定します。ネストされたパスはサポートされていません。値が JSON 文字列の場合、注入される値は JSON の引用符で囲まれません。

この例では、`{"password":"[DB-PASSWORD]"}` のような JSON オブジェクトを値とするチームシークレット `DB_CREDENTIALS` を追加します。シークレットを保存する前に、`[DB-PASSWORD]` を実際のパスワードに置き換えてください。以下のサンプルでは、このシークレットの `password` フィールドを `DB_PASSWORD` に注入します。

<Tabs>
  <Tab title="Python">
    ```python theme={"system"}
    from cwsandbox import AuthStrategy, Sandbox, Secret

    with Sandbox.run(
      auth=AuthStrategy.WANDB,
      placement_mode="serverless",
      container_image="python:3.11",
      secrets=[Secret(
        store="wandb",
        name="DB_CREDENTIALS",
        field="password",
        env_var="DB_PASSWORD",
      )],
    ) as sandbox:
      result = sandbox.exec([
        "python", "-c",
        "import os; assert os.environ.get('DB_PASSWORD'); print('Secret is available')",
      ]).result()
      print(result.stdout)
    ```
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={"system"}
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/wandb";

    const client = createSandboxClientFromEnv();

    const result = await client.withSandbox(
      async (sandbox) => sandbox.commands.run([
        "python", "-c",
        "import os; assert os.environ.get('DB_PASSWORD'); print('Secret is available')",
      ]),
      {
        containerImage: "python:3.11",
        secrets: [{
          store: "wandb",
          name: "DB_CREDENTIALS",
          field: "password",
          envVar: "DB_PASSWORD",
        }],
      },
    );

    console.log(result.stdout);
    ```
  </Tab>
</Tabs>

どちらのサンプルも、パスワード自体は出力せずに `Secret is available` と出力します。シークレットが JSON オブジェクトでない場合、指定したキーが存在しない場合、またはその値が `null` の場合は、フィールドの選択に失敗します。

<h2 id="reuse-secret-references">
  シークレット参照を再利用する
</h2>

Python のセッションでは、共有するシークレット参照を `SandboxDefaults` に指定します。TypeScript では、サンドボックスを作成するときに `secrets` 配列を使い回します。

<Tabs>
  <Tab title="Python">
    ```python theme={"system"}
    from cwsandbox import AuthStrategy, SandboxDefaults, Secret, Session

    defaults = SandboxDefaults(
      auth=AuthStrategy.WANDB,
      placement_mode="serverless",
      secrets=(Secret(store="wandb", name="HF_TOKEN"),),
    )

    with Session(defaults) as session:
      sandbox = session.sandbox()
      result = sandbox.exec([
        "python", "-c",
        "import os; assert os.environ.get('HF_TOKEN'); print('Secret is available')",
      ]).result()
      print(result.stdout)
    ```

    Python クライアントは、セッションのデフォルトとサンドボックスごとの `secrets` をマージし、完全に一致する重複は無視します。異なる参照が同じ環境変数を対象としている場合、クライアントはサンドボックスを作成する前に `ValueError` を送出します。Python の型シグネチャについては、[Secret リファレンス](/products/sandboxes/client/ref/configuration/secret)を参照してください。
  </Tab>

  <Tab title="TypeScript">
    ```typescript theme={"system"}
    import { createSandboxClientFromEnv } from "@coreweave/cwsandbox/wandb";

    const client = createSandboxClientFromEnv();
    const secrets = [{ store: "wandb", name: "HF_TOKEN" }];

    const result = await client.withSandbox(
      async (sandbox) => sandbox.commands.run([
        "python", "-c",
        "import os; assert os.environ.get('HF_TOKEN'); print('Secret is available')",
      ]),
      { containerImage: "python:3.11", secrets },
    );

    console.log(result.stdout);
    ```
  </Tab>
</Tabs>

<h2 id="troubleshoot-secret-injection">
  シークレット注入のトラブルシューティング
</h2>

シークレット参照を指定したサンドボックスが起動しない場合は、エラーテキストをもとに認証、選択したチーム、配置を確認してください。

| エラーテキスト | 確認事項 |
| - | - |
| `secret store "wandb" not found` | クライアントで CoreWeave 認証が選択されていないか確認してください。サーバーレス配置の場合は、Python では `auth=AuthStrategy.WANDB` を、TypeScript では `@coreweave/cwsandbox/wandb` エントリポイントを選択します。`WANDB_API_KEY` を設定するだけでは、CoreWeave 認証済みのクライアントは W\&B 認証に切り替わりません。ストアを登録する必要はありません。 |
| `one or more W&B secrets not found` | シークレット名と選択した W\&B チームを確認してください。シークレットが APIキーのデフォルトの entity 以外のチームに属している場合は `WANDB_ENTITY` を設定し、W\&B アカウントからそのシークレットにアクセスできることを確認してください。 |
| `entity not found` | `WANDB_ENTITY` に入力ミスがないか確認し、チームが存在すること、および W\&B アカウントからそのチームにアクセスできることを確認してください。 |
| `no eligible runner is available on this replica right now; retry shortly` | W\&B 認証で CKS ランナーを選択している場合、この組み合わせはサポートされていないため、再試行しても解決しません。シークレット注入を使用するには、W\&B 認証とサーバーレス配置を組み合わせてください。サーバーレスのリクエストでこのエラーが発生した場合は、ランナーが一時的に利用できない状態である可能性があります。 |

W\&B のシークレット注入は CKS 配置では利用できません。CoreWeave API アクセストークンと W\&B APIキーの両方を設定した場合も同様です。
