# エフェメラル VM {#ephemeral-vm}

Takumi Runner では、すべてのワークフロージョブが専用のエフェメラル（使い捨て）VM 上で実行されます。このページでは、エフェメラル VM の定義と分離モデルを説明します。

## エフェメラル VM とは {#what-is-ephemeral-vm}

エフェメラル VM とは、ジョブの実行ごとに新規に作成され、完了後に自動的に破棄される仮想マシンです。各 VM は独立したカーネル・ファイルシステム・ネットワークスタックを持ち、ジョブ間で一切の状態が共有されません。

以下の図に示すように、複数のジョブが実行される場合も、異なる VM の割り付けが保証されています。

```mermaid
sequenceDiagram
    participant GH as GitHub Actions

    box rgb(230, 240, 255) Takumi Runner
        participant VM1 as VM 1
        participant VM2 as VM 2
        participant VM3 as VM 3
    end

    GH->>VM1: Job A を割り当て
    activate VM1
    Note over VM1: VM 作成

    GH->>VM2: Job B を割り当て
    activate VM2
    Note over VM2: VM 作成

    VM1->>GH: Job A 完了
    deactivate VM1
    Note over VM1: VM 破棄

    GH->>VM3: Job C を割り当て
    activate VM3
    Note over VM3: VM 作成

    VM2->>GH: Job B 完了
    deactivate VM2
    Note over VM2: VM 破棄

    VM3->>GH: Job C 完了
    deactivate VM3
    Note over VM3: VM 破棄
```

この「1 ジョブ = 1 VM」のモデルにより、以下が保証されます。

- 前のジョブが残したファイルやプロセスが次のジョブに影響を与えない
- ジョブ実行中に取得されたクレデンシャルやトークンが VM の破棄とともに消失する
- あるジョブの侵害が他のジョブに波及しにくい

:::note
エフェメラル VM により VM レベルでの状態共有は排除されますが、GitHub Actions の [Cache Poisoning](https://adnanthekhan.com/2024/05/06/the-monsters-in-your-build-cache-github-actions-cache-poisoning/) のように、GitHub 側の共有キャッシュを介してジョブ間の侵害が成立する可能性は残ります。エフェメラル VM はランナー環境の分離を強化するものであり、GitHub Actions プラットフォーム側の共有リソースに起因するリスクを完全に排除するものではありません。
:::

## 分離単位 {#isolation-boundary}

エフェメラル VM の分離は、以下のレイヤで構成されています。

| レイヤ           | 分離の内容                                                       |
| ---------------- | ---------------------------------------------------------------- |
| カーネル         | VM ごとに独立した Linux カーネルが起動する                       |
| ファイルシステム | VM ごとに独立したルートファイルシステムが割り当てられる          |
| ネットワーク     | VM ごとに独立したネットワーク名前空間と仮想 NIC が割り当てられる |
| プロセス         | VM 内のプロセスは他の VM のプロセスを参照できない                |

コンテナベースの分離ではホスト OS のカーネルを共有するため、カーネルの脆弱性を介したエスケープのリスクがあります。VM レベルの分離ではジョブごとに独立したカーネルが起動するため、共通基盤（ホスト）への脱出は相対的に困難です。
