[Azure][CronJob][ScheduledJob] Azure環境におけるCronJob (定期実行ジョブ)

# `CronJob`(定期実行ジョブ)とは
- 時間ベースで自動的に処理を実行する仕組み
- `Scheduled Job`や`Time-triggered Job`、`Timer-based Workflowと呼ばれることもある`

# Azure環境における選択肢
| サービス名                                      | 種別          | マネージド性         | 主な用途・特徴                                |
| ------------------------------------------ | ----------- | -------------- | -------------------------------------- |
| **Azure Functions Timer Trigger**          | サーバーレス      | ✅           | 軽量コードの定期実行、簡易スケジューラ                    |
| **Logic Apps Recurrence**                  | ノーコードワークフロー | ✅           | GUIで定期処理＋SaaS連携                        |
| **AKS CronJob（Kubernetes CronJob）**        | Kubernetesネイティブ    | ❌（AKSのみ）    | コンテナの定期実行、柔軟だが運用コストあり                  |
| **Azure Data Factory (Trigger)**           | データパイプライン   | ✅           | ETL処理、データ転送・集計の定期実行                    |

# 実装方法
| サービス名                               | スタイル                      | 実装方法（手順の概要）                                                                   |
| ----------------------------------- | --------------------------- | ----------------------------------------------------------------------------- |
| **Azure Functions (Timer Trigger)** | **コード**                  | 1. Azure Functions プロジェクト作成<br>2. `TimerTrigger` 属性で関数作成（cron式指定）<br>3. デプロイ  |
| **Logic Apps (Recurrence)**         | **GUI**              | 1. AzureポータルでLogic App作成<br>2. トリガー(Recurrence)を選択<br>3. 後続アクションをGUIで構成 |
| **AKS CronJob（Kubernetes CronJob）** | **YAML（コード）**               | 1. CronJob用の `cronjob.yaml` を作成（cron式、Pod定義）<br>2. `kubectl apply`でデプロイ       |
| **Azure Data Factory (Trigger)**    | **GUI** | 1. ADFポータルでパイプライン作成<br>2. トリガー（Schedule）を追加<br>3. 時刻や繰り返し間隔をGUIで設定            |

# ユースケース
| ユースケース                       | 選択肢                               |
| ---------------------------------- | ------------------------------------------ |
| 軽量な定期処理（ログ清掃、APIコールなど）             | **Azure Functions Timer Trigger**          |
| GUIでSaaSとつないで簡単に自動化したい             | **Logic Apps Recurrence**                  |
| コンテナで処理内容を細かく制御したい                 | **AKS CronJob** |
| データ移動や集計、ETL処理を定期実行したい             | **Azure Data Factory**                     |

以下に、「**呼び出す側**」「**呼び出される側**」の関係を、毎朝6時にファイルをインポートするケースにおいて、**各サービスごとに明確に整理**しました。

---

## Azure Functions (Timer Trigger)

| 種別          | 内容                                                                 |
| ----------- | ------------------------------------------------------------------ |
| **呼び出す側**   | Azure Functionsの**Timer Trigger**<br>`function.json`でCronスケジュールを設定 |
| **呼び出される側** | Python/C#/JavaScriptなどで書かれた `main()` 関数（ファイルインポート処理）               |

### 呼び出す側（function.json）

```json
{
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 0 6 * * *"
    }
  ]
}
```

### 呼び出される側（Python）

```python
def main(mytimer: func.TimerRequest) -> None:
    # ファイルインポート処理
```

---

## Logic Apps (Recurrence + HTTPアクション)

| 種別          | 内容                                                      |
| ----------- | ------------------------------------------------------- |
| **呼び出す側**   | Logic Apps の **Recurrenceトリガー** → HTTP アクションで API を呼び出す |
| **呼び出される側** | 外部のHTTP API（例：Azure FunctionやExpressなどのエンドポイント）         |

### 呼び出す側（Logic Apps の構成 GUI 例）

```
[Recurrence @ 6:00] → [HTTP POST to https://myapi.com/import]
```

### 呼び出される側（例：Node.js）

```javascript
app.post('/import', (req, res) => {
  // ファイルインポート処理
  res.send('done');
});
```

---

## AKS CronJob（Kubernetes CronJob）

| 種別          | 内容                                                |
| ----------- | ------------------------------------------------- |
| **呼び出す側**   | Kubernetes の **CronJob マニフェスト**（YAMLで定義されたスケジューラ） |
| **呼び出される側** | コンテナ内のコード（`app.py`の`main()`など）                    |

### 呼び出す側（cronjob.yaml）

```yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: file-import-job
spec:
  schedule: "0 6 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: file-import
            image: myregistry.azurecr.io/import-image:latest
            command: ["python", "app.py"]
          restartPolicy: OnFailure
```

### 呼び出される側（app.py）

```python
def main():
    print("Importing files...")
    # ファイルのダウンロード・処理
    print("Done.")

if __name__ == "__main__":
    main()
```

---

## Azure Data Factory (Trigger + Webアクティビティ)

| 種別          | 内容                                      |
| ----------- | --------------------------------------- |
| **呼び出す側**   | ADF の **スケジュールトリガー** + **Webアクティビティ**   |
| **呼び出される側** | HTTPエンドポイント（例：Azure FunctionsやREST API） |

### 呼び出す側（ADF パイプライン GUI）

* トリガー：毎朝6時
* アクティビティ：「Webアクティビティ」→ POST `https://my-function.azurewebsites.net/api/import`

### 呼び出される側（Azure Functions）

```python
def main(req: func.HttpRequest) -> func.HttpResponse:
    # ファイルインポート処理
    return func.HttpResponse("OK")
```


# 参考リンク
## Azure Functions (Timer Trigger)
* [Timer trigger for Azure Functions | Microsoft Learn](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-timer)
* [Create a function in Azure that runs on a schedule | Microsoft Learn](https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-scheduled-function)


## Azure Logic Apps (Recurrence Trigger)
* [Schedule and run recurring workflows - Azure Logic Apps | Microsoft Learn](https://learn.microsoft.com/en-us/azure/connectors/connectors-native-recurrence)
* [Schedules for recurring triggers in Azure Logic Apps workflows | Microsoft Learn](https://learn.microsoft.com/en-us/azure/logic-apps/concepts-schedule-automated-recurring-tasks-workflows)


## AKS CronJob（Kubernetes CronJob）
* [CronJob - Kubernetes](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/)
* [Running Automated Tasks with a CronJob - Kubernetes](https://kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs/)


## Azure Data Factory (Schedule Trigger)
* [Pipeline execution and triggers - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/en-us/azure/data-factory/concepts-pipeline-execution-triggers)
* [Create schedule triggers - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/en-us/azure/data-factory/how-to-create-schedule-trigger)