# Pulumiを使用したワークロードの管理

> Pulumiを使用したワークロードの管理 - DataRobot Pulumiプロバイダーを使用して、ワークロードアーティファクトとワークロードを宣言的にプロビジョニングします。

This Markdown file sits beside the HTML page at the same path (with a `.md` suffix). It summarizes the topic and lists links for tools and LLM context.

Companion generated at `2026-09-02T14:28:12.981938+00:00` (UTC).

## Primary page

- [Pulumiを使用したワークロードの管理](https://docs.datarobot.com/ja/docs/workload-api/workload-interfaces/workload-pulumi/index.html.md): Full documentation for this topic (Markdown sidecar).

## Sections on this page

- [Pulumiを使用するケース](https://docs.datarobot.com/ja/docs/workload-api/workload-interfaces/workload-pulumi/index.html.md#when-to-use-pulumi): In-page section heading.
- [Pulumiのセットアップ](https://docs.datarobot.com/ja/docs/workload-api/workload-interfaces/workload-pulumi/index.html.md#pulumi-setup): In-page section heading.
- [簡単な例](https://docs.datarobot.com/ja/docs/workload-api/workload-interfaces/workload-pulumi/index.html.md#quick-example): In-page section heading.
- [本番環境の例](https://docs.datarobot.com/ja/docs/workload-api/workload-interfaces/workload-pulumi/index.html.md#production-example): In-page section heading.
- [リファレンス](https://docs.datarobot.com/ja/docs/workload-api/workload-interfaces/workload-pulumi/index.html.md#reference): In-page section heading.

## Documentation content

> [!NOTE] プレミアム機能
> Workload APIはプレミアム機能です。 この機能を有効にする方法については、DataRobotの担当者または管理者にお問い合わせください。

[DataRobot Pulumiプロバイダー](https://www.pulumi.com/registry/packages/datarobot/) は、ワークロードアーティファクトとワークロードをネイティブのリソースとして公開します。コードでアーティファクトとワークロードを宣言し、 `pulumi up` を実行すると、Pulumiはプラットフォームを宣言した状態に調整します。

リソース基盤全体（すべての引数、すべての出力）については、 [Pulumiレジストリリファレンス](https://www.pulumi.com/registry/packages/datarobot/api-docs/workload/) を参照してください。このページでは、Pulumiを使用するタイミング、リソースがWorkload APIの概念にどのようにマッピングされるか、何が依然として命令的であるかなど、フレームワークについて説明します。

## Pulumiを使用するケース

信頼できるビルドおよびロックされたアーティファクトがあり、それを本番インフラストラクチャとしてロールアウトする場合（リージョン間、ステージ間で、レプリカ数と重要度をコードレビューの対象とする場合）に、Pulumiを使用します。REST APIは動詞（ `build` 、 `promote` 、 `stop` ）を実行し、Pulumiは状態を調整します。

> [!NOTE] Pulumi管理のアーティファクトは常にロックされます
> すべての `datarobot.Artifact` リソースは、 `pulumi up` の終了までに `locked` アーティファクトに解決されます。プロバイダーは1回の呼び出しでアーティファクトを直接 `locked` として作成する（ `POST /artifacts` で `status: locked` を渡す）ため、新しく適用されたアーティファクトは、適用の完了時にすでにロックされています。アーティファクトをドラフト状態に保つには、REST APIまたはコンソールを使用してアーティファクトを作成し、ロックされてからPulumiの管理下に置きます。

| ワークフロー | 推奨ツール |
| --- | --- |
| ビルドをトリガーし、ドラフトを昇格させる | REST API |
| ステージ全体にロックされたアーティファクトをスタンプする | Pulumi |
| 本番フリートを新しいアーティファクトバージョンに調整する | Pulumi |
| 共有の管理（/sharedRoles） | RESTまたはコンソール |

**依然として命令的であるもの**

Pulumiを使用している場合でも、いくつかの操作は状態ではなく動詞のままであり、プロバイダーによってモデル化されません：

| 操作 | 存在する場所 |
| --- | --- |
| イメージの構築（POST /artifacts/{id}/builds） | RESTまたはコンソール |
| ドラフトを本番環境に昇格（POST /workloads/{id}/promote） | RESTまたはコンソール |
| 共有（PATCH /workloads/{id}/sharedRoles） | RESTまたはコンソール |
| 可観測性（イベント、統計、OTel） | 読み取り専用。プラットフォームによって管理されます |

パターン：シェルまたはCIから動詞を実行し、結果のロックされたアーティファクトに対してPulumiに本番フリートを調整させます。

## Pulumiのセットアップ

Pulumiの使用を開始するには、まず、DataRobot Pulumiプロバイダーをインストールします：

**Python:**
```
pip install "pulumi-datarobot>=0.10.38" 
```

**Node.js:**
```
npm install "@datarobot/pulumi-datarobot@>=0.10.38" 
```


プロバイダーはPulumiスタック設定からDataRobotの認証情報を読み取ります： `datarobot:endpoint` および `datarobot:apikey` 。スタックごとに1回設定します：

```
pulumi config set datarobot:endpoint [https://app.datarobot.com/api/v2](https://app.datarobot.com/api/v2)
pulumi config set datarobot:apikey <your-api-token> --secret


サポートされている設定パスの完全なリストについては、[Pulumiレジストリのインストールガイド](https://www.pulumi.com/registry/packages/datarobot/installation-configuration/){ target=_blank }を参照してください。

### `ApiTokenCredential`を使用した資格情報の管理 {: #managing-credentials-with-apitokencredential }

プロバイダーの`ApiTokenCredential`リソースは、Pulumiのステートから管理されたDataRobotの資格情報レコードを作成します。これにより、資格情報のライフサイクルが、それが機能するアーティファクトやワークロードとともに宣言的に保持されます。

``` python
import pulumi
import pulumi_datarobot as datarobot

# コンテナ側のトークン。Pulumiシークレットとして保持されるため、ソースに残ることはありません。
container_token = pulumi.Config().require_secret("datarobotToken")

credential = datarobot.ApiTokenCredential(
    "agent-service-token",
    name="agent-service-token",
    description="agent-serviceワークロードが使用するAPIトークン",
    api_token=container_token,
)
```

プロバイダー独自の認証（上記の `datarobot:endpoint` および `datarobot:apikey` ）は、 `ApiTokenCredential` とは独立しています。資格情報リソースは、プラットフォーム上で管理されるレコードを生成します。ワークロードがその資格情報をどのように利用するか（たとえば、アーティファクト仕様の環境変数を介して）は、ワークロード自体で設定されます。 `Workload` における資格情報関連の引数の現在の構成については、 [Pulumiレジストリのリファレンス](https://www.pulumi.com/registry/packages/datarobot/api-docs/workload/) を参照してください。

## 簡単な例

次の例は、Pulumiを使用したワークロードへの最短パス（インラインのドラフトアーティファクトによって裏付けられたドラフトワークロード）を示しています。

```
import pulumi
import pulumi_datarobot as datarobot

artifact = datarobot.Artifact(
    "whoami-artifact",
    name="whoami-artifact",
    type="service",
    spec={
        "container_groups": [{
            "name": "default",
            "containers": [{
                "name": "whoami",
                "image_uri": "containous/whoami:latest",
                "port": 8080,
                "primary": True,
                "entrypoint": ["/whoami", "--port", "8080"],
                "readiness_probe": {"path": "/", "port": 8080, "initial_delay_seconds": 5},
            }]
        }]
    },
)

workload = datarobot.Workload(
    "hello-whoami",
    name="hello-whoami",
    artifact_id=artifact.artifact_id,
    runtime={
        "container_groups": [{
            "name": "default",
            "replica_count": 1,
            "containers": [{
                "name": "whoami",
                "resource_allocation": {"cpu": 1, "memory": "512MB"},
            }],
        }]
    },
)

pulumi.export("endpoint", workload.endpoint)
```

## 本番環境の例

本番環境レベルのワークロードでは通常、管理された資格情報、明示的な `importance` 、スタック間のパラメーター化、およびアーティファクトが変更された場合の明確なポリシーが必要になります。

```
"""Pulumi program that stands up a service workload."""
import pulumi
import pulumi_datarobot as datarobot

# Third-party credential (for example, a model provider API key). Held as a Pulumi
# secret so it never lands in source. The DataRobot API token the container needs
# to call DataRobot's own APIs doesn't need this treatment -- see environment_vars below.
third_party_token = pulumi.Config().require_secret("modelProviderToken")

credential = datarobot.ApiTokenCredential(
    "model-provider-token",
    name="model-provider-token",
    description="Third-party model provider API token used by the agent-service workload",
    api_token=third_party_token,
)

artifact = datarobot.Artifact(
    "agent-service-artifact",
    name="agent-service-artifact",
    description="Agent service container artifact",
    type="service",
    spec={
        "container_groups": [{
            "containers": [{
                "name": "main",
                "image_uri": "ghcr.io/example/agent-service:0e90773",
                "port": 8000,
                "primary": True,
                "environment_vars": [
                    # Per-Workload DataRobot API token, resolved and injected automatically;
                    # no value is supplied here, and DATAROBOT_ENDPOINT needs no entry at
                    # all -- both are platform-managed. See Environment variable types.
                    {"source": "api-key"},
                    # Third-party credential, looked up from the managed credential record above.
                    {
                        "source": "dr-credential",
                        "name": "MODEL_PROVIDER_API_KEY",
                        "dr_credential_id": credential.id,
                        "key": "apiToken",
                    },
                ],
            }],
        }],
    },
)

workload = datarobot.Workload(
    "agent-service",
    name="agent-service",
    description="Agent service workload",
    importance="low",
    artifact_id=artifact.artifact_id,
    runtime={
        "container_groups": [{
            "replica_count": 1,
            "containers": [{
                "name": "main",
                "resource_allocation": {
                    "cpu": 2.0,
                    "memory": 5096 * 1024 * 1024,
                },
            }],
        }],
    },
    opts=pulumi.ResourceOptions(replace_on_changes=["artifact_id"]),
)

pulumi.export("credentialId", credential.id)
pulumi.export("artifactId", artifact.artifact_id)
pulumi.export("workloadId", workload.id)
pulumi.export("endpoint", workload.endpoint) 
```

以下のパターンは注目に値します：

- {"source": "api-key"} は、ワークロードごとのDataRobot APIトークンを自動的に注入します。コンテナがDataRobot独自のAPIを呼び出すために、Pulumiのシークレット、資格情報リソース、または明示的な DATAROBOT_ENDPOINT エントリーは必要ありません。 環境変数のタイプ を参照してください。
- pulumi.Config().require_secret(...) は、サードパーティの資格情報をソースから除外し、Pulumiの状態にプレーンテキストとして保存されないようにします。その後、 dr_credential_id=credential.id がその管理された資格情報をコンテナに組み込むため、シークレットがアーティファクトの仕様に表示されることはありません。
- replace_on_changes=["artifact_id"] は、ワークロードが新しいアーティファクトを指すようになったときに、インプレースの更新ではなく完全な置換をトリガーし、Pulumiの差分にアーティファクトの交換を表面化させます。
- バイト単位の memory ( 5096 * 1024 * 1024 ) は、プロバイダーのリソース割り当てスキーマと一致します。

ここから、Pulumiスタック ( `dev` 、 `stage` 、 `prod`) ごとに `name` 、 `replica_count` 、および `importance` をパラメーター化することで、同じワークロードを複数のステージにわたってデプロイできます。また、同じロックされた `artifact_id` に裏付けられた複数の `Workload` リソースを宣言することでカナリアを追加したり、PulumiをCIに統合して、昇格のたびに `pulumi up` を実行し、宣言した本番環境のフリートを新しいアーティファクトバージョンに調整したりすることができます。

このプロセスは、以下のRESTフローにマッピングされます：

| RESTのステップ | Pulumi |
| --- | --- |
| インラインアーティファクトを使用してワークロードを作成する (POST /workloads) | datarobot.Artifact + datarobot.Workload |
| APIトークンの資格情報を管理する (コンソール または REST) | datarobot.ApiTokenCredential |
| running を待つ | pulumi up は準備ができるまでブロックします。 |
| 呼び出し | pulumi stack output endpoint |
| importance を上げる (PATCH /workloads/{id}) | 宣言的な importance="critical"。 |
| ワークロードの背後にあるアーティファクトを置き換える | artifact_id を変更します。replace_on_changes は管理された置換をトリガーします。 |
| /sharedRoles 経由で共有する | RESTまたはコンソール経由で管理します。 |
| イベント / 統計情報を読み取る | 変更なし。可観測性は読み取り側です。 |

## リファレンス

詳細については、Pulumiプロバイダーのレジストリとリファレンスを参照してください：

- DataRobot Pulumiレジストリ (プロバイダーの概要とインストール)。
- workloadリソースリファレンス (すべての引数と出力)。
