Claudeエージェントをサーバーなしで定期実行する|Scheduled Deployments実装ガイド【2026年7月】
「毎朝9時にAIに集計させたい」を、自前サーバーもcronも用意せずに実現する方法です。Anthropic公式のScheduled Deploymentsを使い、cron式で自動起動する構成の作り方、実行履歴の追い方、そしてサマータイムや自動一時停止といった実運用でハマる挙動まで整理しました。
自前cronの何がしんどいのか
AIに定期的な仕事をさせる方法として、まず思いつくのは「サーバーを1台用意して、cronでClaude Codeを叩く」構成です。実際に動きますし、以前の記事でもその手順を扱いました。ただ、運用に乗せると以下が地味に効いてきます。
- サーバーの面倒を見続ける必要がある。OSアップデート、ディスク、プロセスの死活監視。AIの仕事とは無関係な作業が増えます
- 失敗が静かに起きる。cronは失敗してもログに残るだけで、ジョブ自体が起動しなかったのか、起動して途中で落ちたのかを切り分けるには自分でログ設計が必要です
- 実行環境がサーバーと一体になっている。AIに危険なコマンドを打たせたくないのに、実行場所は本番サーバーそのもの、という構成になりがちです
Scheduled Deploymentsは、この3点をまとめてAnthropic側に寄せる仕組みです。cron式を登録しておくと、Anthropicのインフラが定刻にエージェントのセッションを起動し、そのセッションはAnthropic側の隔離されたサンドボックスで動きます。自前サーバーは一切要りません。
Managed Agentsは、AIエージェントの実行ループとサンドボックス環境の両方をAnthropicがホストするサービスです。APIで「エージェント設定(モデル・システムプロンプト・使えるツール)」と「実行環境」を登録し、「セッション」を作ると、Anthropic側のコンテナ内でbashやファイル操作を伴う作業が走ります。Scheduled Deploymentsは、そのセッションの起動をcron式でスケジュールする機能です。
自前cronとの比較
| 観点 | 自前サーバー+cron | Scheduled Deployments |
|---|---|---|
| インフラ管理 | 自分でサーバーを保守 | 不要 |
| 起動失敗の記録 | 自分でログ設計が必要 | デプロイメント実行記録に自動で残る |
| 実行環境の隔離 | サーバー本体。自分で制限をかける必要あり | 使い捨てサンドボックス。ネットワーク制限も設定可能 |
| 認証方式 | OAuthログイン(サブスク枠)が使える | APIキー必須(従量課金) |
| コスト構造 | サーバー固定費+サブスクまたはAPI従量 | API従量のみ。使わなければ0円 |
| 実行タイミングの正確さ | cron式どおり | 最大9分のジッター(後述) |
| ローカルファイル・社内ネットワークへのアクセス | 可能 | 不可(別途リポジトリ接続やMCP経由が必要) |
判断の分かれ目は「社内リソースに直接触る必要があるか」と「サブスク枠で回したいか」です。社内のファイルサーバーを直接読む必要があるなら自前サーバー、それが不要でAPI課金でよいならScheduled Deploymentsのほうが圧倒的に運用が軽くなります。自前サーバー構成の実装は別記事にまとめています。
実装:3つのオブジェクトを順番に作る
Managed Agentsはベータ機能で、ANTHROPIC_API_KEY が必須です。Claude CodeやClaude.aiのサブスクリプションログインでは利用できません。すべてのManaged AgentsのAPIリクエストには managed-agents-2026-04-01 ベータヘッダーが必要ですが、公式SDKを使えば自動で付与されます。
登場するオブジェクトは3つです。上から順に作ります。
| オブジェクト | IDの形 | 中身 | 作る頻度 |
|---|---|---|---|
| エージェント | agent_... | モデル・システムプロンプト・使えるツール | 1回だけ(以後は使い回す) |
| 環境 | env_... | サンドボックスの設定(ネットワーク制限など) | 1回だけ |
| デプロイメント | depl_... | スケジュール+起動時に送るメッセージ | スケジュールごとに1つ |
ステップ1:エージェントと環境を用意する
from anthropic import Anthropic
client = Anthropic() # ANTHROPIC_API_KEY を環境変数から読む
agent = client.beta.agents.create(
name="Daily Report Agent",
model="claude-opus-5",
system="あなたは日次レポートの作成担当です。結論を先頭に置き、数値には集計元を併記してください。",
tools=[{"type": "agent_toolset_20260401"}],
)
environment = client.beta.environments.create(
name="report-env",
config={"type": "cloud", "networking": {"type": "unrestricted"}},
)
print(agent.id, environment.id)
agent_toolset_20260401 は、bash・ファイル読み書き・Web検索などの標準ツール一式を有効化する指定です。エージェントと環境の id は保存しておいて使い回します。毎回作り直すのはアンチパターンです(不要なオブジェクトが溜まるうえ、バージョン管理の意味がなくなります)。
ステップ2:デプロイメントを作る
ここでスケジュールを設定します。initial_events には毎回の実行開始時に送られるメッセージを書きます。これが実質的な「定期実行させたい指示」です。
deployment = client.beta.deployments.create(
name="毎朝の売上レポート",
agent=agent.id,
environment_id=environment.id,
initial_events=[
{
"type": "user.message",
"content": [{"type": "text", "text": "昨日の売上データを集計し、前週同曜日との比較レポートを作成してください。"}],
},
],
schedule={
"type": "cron",
"expression": "0 9 * * 1-5", # 平日9時
"timezone": "Asia/Tokyo",
},
)
print(deployment.schedule.upcoming_runs_at)
レスポンスの schedule.upcoming_runs_at には次回以降の実行予定時刻が入っています。cron式を書き間違えていても作成自体は成功してしまうため、ここを見て「意図した時刻になっているか」を確認するのが確実です。1週間放置してから気づく、という事故を防げます。
initial_events に指定できるのは user.message と user.define_outcome のいずれかで、最低1つは必須です。ファイル・GitHubリポジトリ・メモリストア・認証情報(Vault)も、通常のセッションと同じようにデプロイメントに紐付けられます。たとえばメモリストアを接続しておけば、毎回の実行結果から得た知見を次回に引き継がせることもできます。
cron式で必ずハマる3つの落とし穴
落とし穴1:実行時刻は最大9分ずれる
これは知らないと必ず混乱します。upcoming_runs_at は設定どおりの時刻を返しますが、実際の実行には負荷分散のためのジッター(ゆらぎ)が入ります。
- ジッター幅:実行間隔の最大15%
- 下限5秒、上限9分
つまり1時間ごとの実行なら、最大9分遅れる可能性があります。「9時ちょうどにレポートが届く」前提で後続処理の締め切りを組むと破綻します。後工程の期限は余裕を持って設計してください。
落とし穴2:サマータイムで実行が消える/2回走る
cronは壁掛け時計どおりの時刻マッチングで動きます。America/New_York で 0 20 * * * を指定すれば、EST期間でもEDT期間でも現地20時に実行されます。ここまでは直感どおりです。
問題は切り替え日です。
| 状況 | 挙動 |
|---|---|
| 春の切り替え日(時計が進む)に、その日存在しない時刻を指定していた場合 | 実行されない |
| 秋の切り替え日(時計が戻る)に、その日2回来る時刻を指定していた場合 | 2回実行される |
公式の推奨は「現地時間の1〜3時を避けてスケジュールする」か「UTCを使う」です。日本(Asia/Tokyo)はサマータイムがないためこの問題は起きませんが、海外拠点向けのタイムゾーンを指定する場合は要注意です。二重実行が致命的な処理(請求・通知・外部への書き込み)では、処理側に冪等性を持たせておくのが安全です。
落とし穴3:分単位より細かくはできない
cron式は標準のPOSIX形式(分 時 日 月 曜日)で、最小粒度は分です。秒単位の制御はできません。また、1組織あたり最大1,000デプロイメントという上限があります。
cron式に自信がない場合は、Claude Console のデプロイメント画面で式を生成・検証できます。
実行履歴の追い方:失敗を「起動できたか」で切り分ける
ここがcron運用との一番大きな違いです。デプロイメント実行記録(deployment run)が、起動の成否を1件ずつ自動で記録します。
重要なのは、この記録が追っているのが「セッションを起動できたかどうか」だという点です。起動後にAIの作業が失敗したかどうかは、セッション側のイベントストリームやWebhookで追います。この2層構造を理解しておくと、障害調査が速くなります。
# すべての実行履歴
for run in client.beta.deployment_runs.list(deployment_id=deployment.id):
print(run.created_at, run.session_id or run.error.type)
# 失敗したものだけ
for run in client.beta.deployment_runs.list(
deployment_id=deployment.id,
has_error=True,
):
print(run.created_at, run.error.type, run.error.message)
成功した実行には session_id が入るので、そこからセッションの中身を追えます。失敗した実行には error が入ります。
失敗レコードの実例
{
"type": "deployment_run",
"id": "drun_01abc124",
"deployment_id": "depl_01xyz",
"trigger_context": { "type": "schedule", "scheduled_at": "2026-05-09T00:00:00Z" },
"session_id": null,
"error": {
"type": "environment_archived_error",
"message": "environment `env_01abc` is archived"
},
"agent": { "type": "agent", "id": "agent_01ghi789", "version": 3 },
"created_at": "2026-05-09T00:00:01Z"
}
trigger_context.type で、スケジュール起動(schedule)か手動起動(manual)かが区別できます。agent.version も記録されるので、「いつからエージェント設定を変えて挙動が変わったか」を後から追えます。
| エラー型 | 意味 | 対処 |
|---|---|---|
environment_archived_error |
実行環境がアーカイブされている | 新しい環境を作り、デプロイメントを作り直す |
agent_archived_error |
参照しているサブエージェントがアーカイブされている | エージェント設定を更新してから再開 |
session_rate_limited_error |
セッション作成がレート制限に当たった | リトライされないため、次回の定刻を待つ |
なお、Webhookを設定しておけばポーリングせずに実行結果を受け取れます。ただしWebhookイベントが飛ぶのはスケジュール実行のみで、手動実行では飛びません。
いちばんハマるのは「勝手に止まる」挙動
失敗時の挙動は一様ではありません。ここを知らないと「気づいたら1週間動いていなかった」が起きます。
| 起きたこと | デプロイメントの状態 | 実行記録 |
|---|---|---|
| レート制限に当たった | そのまま継続 | 失敗として記録。リトライせず次回の定刻へ |
| 参照先エージェントがアーカイブされた | 自動アーカイブ(終了) | 記録されない |
| 参照先エージェントが削除された | 次回起動時に自動アーカイブ | 記録されない |
| サブエージェント/環境/Vaultがアーカイブされた | 自動一時停止 | 失敗として記録 |
エージェントをアーカイブすると、それを参照しているデプロイメントも同じ操作の中で自動的にアーカイブされます。アーカイブは終了状態で、解除できません。デプロイメントを作り直すことになります。
一方、環境やVaultのアーカイブによる自動一時停止は解除できます。原因を直してから unpause してください。一時停止の理由は paused_reason.error.type に、失敗した実行記録と同じエラー型が入っています。
実務上は、失敗記録(has_error=True)を定期的に監視するか、Webhookで通知を受ける仕組みを最初に入れておくのが現実的です。デプロイメントが止まっていることに人間が気づかない、というのが最大のリスクです。
pause・unpause・archive の使い分け
| 操作 | できること | 取り消し |
|---|---|---|
pause |
以降のスケジュール起動を停止。実行中のセッションは継続し、手動実行は引き続き可能 | 可能 |
unpause |
次回の定刻から再開。止まっていた間の実行は補填されない | — |
archive |
スケジュール終了。デプロイメント自体が変更不可になる | 不可(終了状態) |
client.beta.deployments.pause(deployment.id)
client.beta.deployments.unpause(deployment.id)
client.beta.deployments.archive(deployment.id) # 取り消せない
原則として、止めたいときはまず pause です。archive は「このスケジュールはもう二度と使わない」と確信できるときだけにしてください。
本番前のテストは手動実行で
スケジュールを信じて1週間待つ必要はありません。run エンドポイントで即座に1回実行できます。
run = client.beta.deployments.run(deployment.id)
print(run.session_id)
これは trigger_context.type: "manual" として記録され、一時停止中でも実行できます。「pauseしたまま手動実行で挙動を確認し、問題なければunpauseする」という運用ができます。
Vertex AI・Bedrock経由のClaudeでは使えない
「うちはGoogle CloudのVertex AI(Agent Platform)でClaudeを使っている」「AWSのBedrock経由で契約している」というケースは多いはずです。結論から書くと、Managed Agentsはこれらのプラットフォームでは利用できません。Anthropicの公式ドキュメントに、サポート対象外として明記されています。
| 提供経路 | 推論基盤の運営 | Managed Agents |
|---|---|---|
| Claude API(Anthropic直接) | Anthropic | 使える(ベータ) |
| Claude Platform on AWS | Anthropic | 使える(ベータ・差異あり) |
| Amazon Bedrock | AWS | 使えない |
| Google Cloud(Vertex AI / Agent Platform) | 使えない | |
| Microsoft Foundry | Anthropic(Azure上) | 使えない |
ここが最も紛らわしい点です。同じAWS経由でも、Amazon BedrockはAWSが推論基盤を運用する形態で、Managed Agentsは使えません。一方Claude Platform on AWSはAnthropicが運用し、AWSは認証(SigV4またはAPIキー)・IAMによるアクセス制御・AWS Marketplace経由の課金を担当する形態で、こちらならManaged Agentsが使えます。
「AWSでClaudeを使っている」だけでは判別できません。エンドポイントが bedrock-mantle.{リージョン}.api.aws ならAmazon Bedrock、aws-external-anthropic.{リージョン}.api.aws ならClaude Platform on AWSです。
なぜ使えないのか
Managed Agentsが「モデルを呼び出すAPI」ではなく、エージェントの実行ループとサンドボックス環境そのものをAnthropicがホストするサービスだからです。Vertex AIやBedrockが提供しているのは推論(Messages API)であって、Anthropic側のコンテナやスケジューラではありません。
同じ理由で、これらのプラットフォームではFiles API・コード実行・Agent Skills・MCPコネクタ・Message Batchesなども対象外です。Vertex AI・Amazon Bedrock・Microsoft Foundryそれぞれの公式ドキュメントに、いずれも「サポートされない機能」の一覧としてClaude Managed Agentsが挙げられています。
Vertex AIやBedrockを選んでいる理由が「データ保持やコンプライアンスの要件」である場合、注意が必要です。Managed Agentsは設計上ステートフルで、会話履歴・サンドボックスの状態・成果物をサーバー側に保存します。そのためAnthropicは、Managed Agentsをゼロデータ保持(ZDR)とHIPAA BAAの対象外と明記しています。
ただしセッションおよびアップロードしたファイルは、APIからいつでも削除できます。要件次第では運用でカバーできる場合もあるため、法務・情報システム部門と確認してください。
Claude Platform on AWSでもManaged Agentsは使えますが、セッションの挙動が1点だけ異なります。ユーザーからのイベントが一切ない状態で自律実行できるのは最大6時間までで、それを超えると継続に再認証が必要です(任意のユーザーイベントを送れば再認証されます)。Claude API直接の場合、この自律実行時間の上限はありません。
Vertex AI・Bedrockのままで近いことを実現するには
定期実行そのものは、この記事の冒頭で比較した「自前サーバー+cron」構成に戻ることになります。Vertex AIやBedrock経由でMessages APIを叩くスクリプトを書き、それをcronやCloud Scheduler、Amazon EventBridge Schedulerから起動する形です。
| Managed Agentsの機能 | Vertex AI・Bedrockでの代替 |
|---|---|
| スケジュール起動 | cron / Cloud Scheduler / Amazon EventBridge Scheduler |
| サンドボックス実行環境 | 自前のコンテナ・VM(Cloud Run、ECSなど) |
| 実行記録(deployment run) | 自前のログ出力・DB記録 |
| エージェントの実行ループ | Claude CodeのheadlessモードまたはClaude Agent SDK |
| 失敗時の自動一時停止 | 自前の監視・アラート |
Claude Code自体はAmazon BedrockおよびVertex AI経由での利用に対応しているため、「Bedrock契約のままClaude Codeをcronで回す」という構成は成立します(プラットフォーム経由で使う際の設定は別記事で解説しています)。
失われるのは「使い捨てサンドボックス」「実行記録の自動保存」「エージェントループの提供」の3つで、これらは自前で用意することになります。逆に得られるのは、社内ネットワークへのアクセスと、プラットフォーム側のコンプライアンス境界の中で完結できることです。どちらが有利かは要件次第なので、記事冒頭の比較表と合わせて判断してください。
よくある質問
Q. Claude ProやMaxのサブスクリプション枠で動かせますか?
いいえ。Managed AgentsはAPIの機能で、ANTHROPIC_API_KEYによる従量課金が必要です。サブスクリプションの利用枠は使えません。サブスク枠で定期実行したい場合は、Claude Codeのheadlessモードを自前サーバーのcronで叩く構成になります(別記事で解説)。コスト構造が根本的に違うので、実行頻度と1回あたりのトークン量から試算してから選んでください。
Q. 毎回同じ指示しか送れないのですか?
initial_events は固定なので、そのままでは毎回同じ文面が送られます。日付などを動的に変えたい場合は、指示文の中で「本日の日付を取得して」とエージェント側に処理させるか、参照させるデータ側(メモリストアやリポジトリ内のファイル)を外部から更新する設計にします。デプロイメント自体を毎回作り直すのは1,000件の上限にも触れるため避けてください。
Q. 実行が失敗したとき、自動でリトライされますか?
されません。レート制限による失敗は即座に失敗として記録され、リトライせず次回の定刻を待ちます。それ以外の回復不能なエラー(環境やVaultのアーカイブなど)では、失敗が記録されたうえでデプロイメントが自動一時停止します。リトライが必要なら、失敗記録を監視して自分で run を叩く仕組みを別途組むことになります。
Q. 実行時刻をきっちり守らせる方法はありますか?
ありません。ジッターは仕様として組み込まれており、無効化できません。厳密な時刻が必要な処理(取引の締め、外部システムとの時刻同期が必要な連携)には向いていません。そういう用途では自前cronか、時刻に依存しない設計への変更を検討してください。
Q. 動いているかどうかを確認する一番簡単な方法は?
deployment_runs.list を見るのが確実です。成功していれば session_id が入った記録が定刻ごとに並びます。記録そのものが増えていない場合は、デプロイメントが一時停止またはアーカイブされている可能性が高いので、デプロイメントの status と paused_reason を確認してください。
まとめ
- Vertex AI・Amazon Bedrock・Microsoft Foundry経由では利用できない(Claude APIまたはClaude Platform on AWSが必要)
- 自前サーバーもcronも不要。エージェント → 環境 → デプロイメントの順に作るだけ
- 作成直後に
upcoming_runs_atでcron式の解釈を必ず確認する - 実行時刻は最大9分ずれる。厳密な時刻が必要な処理には向かない
- サマータイム切替日は、実行がスキップされたり2回走ったりする。現地1〜3時は避ける
- 起動の成否は実行記録に自動で残る。AIの作業成否はセッション側で追う、の2層構造
- 失敗時の挙動は3種類(継続・自動一時停止・自動アーカイブ)。自動アーカイブは取り消せない
- 止めるときは
pause。archiveは終了状態で戻せない - 本番投入前に
runで手動実行してテストする。一時停止中でも実行できる
今日やれる最初の一歩は、「いま人間が毎週やっている定型作業を1つ選ぶ」ことです。それを initial_events の1文に書き下せるなら、この仕組みに乗せられます。書き下せないなら、まだ手順が固まっていないということなので、先に手順を言語化するところからです。


