Claude Developer PlatformのantCLIにv1.30.0でapplyコマンドが追加されました。
ドキュメントではこちらに該当します。
クラウド環境はIaCが主流になっていますが、Manged Agents時代のIaC(Infrastructure as Code)っぽい感じです!
ドキュメントのタイトルはManage resources as codeです
やってみます。
ant cliをインストール
公式のインストール手順には、macOSの場合、brewでインストールする手順が書かれています。
が、私の趣味で、miseを使ってインストールします。
mise use 'github:anthropics/anthropic-cli[exe=ant]@latest'
インストール後、mise.tomlが生成されます。
[tools]
"github:anthropics/anthropic-cli" = { version = "latest", exe = "ant" }
antを呼び出してみましょう。
mise exec -- ant --version
ant version 1.32.0
ant cliの設定
これも完全に個人の趣味ですが、antコマンドでのログイン状態をグローバルに保持させず、今回のプロジェクトは以下に保持するようにしました。
方法としてはANTHROPIC_CONFIG_DIR環境変数で設定ファイルの保存先を指定します。で、環境変数の設定もmiseでできます。
[tools]
"github:anthropics/anthropic-cli" = { version = "latest", exe = "ant" }
[env]
ANTHROPIC_CONFIG_DIR = "{{config_root}}/.anthropic"
設定ファイルはコミットすべきではないので.gitignoreに追加します。
.anthropic
ant auth login
antコマンドを実行するためにログインします。
ant auth login
ブラウザでログイン後、設定ファイルが先ほど指定したANTHROPIC_CONFIG_DIRの場所に出力されました。
ant apply
さて、いよいよ今回の本題です。
私の作ったClaude Managed Agentsのワークショップのこれをやってみましょう。
私、Claude Community Ambassadorやってます!イベントやります!
エージェントのリソースをyamlファイルとして作成します。
.
├── agents
│ └── az900-quiz-bot.md
├── environments
│ └── learn-limited.yaml
└── mise.toml
---
name: Azure Fundamentals Quiz Bot
description: Microsoft Learn MCPサーバーの最新情報を使ってAZ-900(Azure Fundamentals)の練習問題を出題し、回答履歴から苦手分野を優先出題する学習アシスタント。
model: claude-sonnet-5
mcp_servers:
- name: microsoft-learn
url: https://learn.microsoft.com/api/mcp
type: url
tools:
- type: agent_toolset_20260401
- type: mcp_toolset
mcp_server_name: microsoft-learn
default_config:
permission_policy:
type: always_allow
skills: []
---
あなたはMicrosoft Learn MCPサーバーを使ってAZ-900(Azure Fundamentals)の練習問題を作成する学習アシスタントです。Microsoft Learnの最新の公式ドキュメントを参照し、選択式の問題を1問ずつ出題してください。
ルール:
- 問題文と選択肢を提示したら、ユーザーが回答するまで正解を明かさない。
- ユーザーの回答後、正誤を伝え、各選択肢について正誤のポイントを1行ずつで説明する。
- 学習の参考になるMicrosoft Learnドキュメントの実在するURLを3つ提示する。
- 会話内でユーザーの過去の回答(正解・不正解、出題分野)を記憶し、間違えた分野・苦手なトピックを優先的に次の問題として出題する。
- 一度に1問だけ出題し、テンポよく進める。
- 出題時は冒頭に【分野: ○○】と対象トピックを明示する。
- 解説の最後に、これまでの正答率を「正解 n/N」の形式で1行表示する。
name: az900-learn-limited
description: learn.microsoft.com へのアクセスだけを許可したクラウドサンドボックス。
config:
type: cloud
networking:
type: limited
allowed_hosts:
- learn.microsoft.com
applyする前にドライランができます。
ant apply --dry-run .
First apply ./claude-lock.json does not exist yet and will be created
Resources will be created with
credentials profile default
host api.anthropic.com
organization moritalous (e83bd1e7-d952-44a0-a9c4-7cb64d06e410)
workspace 2026-09-12-ant (wrkspc_01L2h1f8pmvd1TbPRdNo42aC)
Preview ./claude-lock.json (new)
± Name Plan
+ ./environments/learn-limited.yaml create
name: "az900-learn-limited"
+ ./agents/az900-quiz-bot.md create
model: "claude-sonnet-5"
name: "Azure Fundamentals Quiz Bot"
Resources + 2 to create
期待通りですので実際にapplyしましょう。
ant apply .
リソース作成前に確認が入ります。
Apply these changes? (y)es / (n)o / (d)etails
yで回答すると作成が始まります。
Apply ./claude-lock.json
± Name Status
+ ./environments/learn-limited.yaml created env_01JkwhfjfaQLMefaBxwLgwYx
+ ./agents/az900-quiz-bot.md created agent_01GCfaZCGB3cct6Na8HtsUNu
Resources + 2 created
State written to ./claude-lock.json
リソースが作成され、claude-lock.jsonが生成されます。
{
"version": 1,
"origin": {
"base_url": "https://api.anthropic.com",
"organization_id": "e83bd1e7-d952-44a0-a9c4-7cb64d06e410",
"workspace_id": "wrkspc_01L2h1f8pmvd1TbPRdNo42aC"
},
"resources": {
"./agents/az900-quiz-bot.md": {
"kind": "agent",
"id": "agent_01GCfaZCGB3cct6Na8HtsUNu",
"version": "1",
"hash": "ae0d65d5188fd375f8dec8a1bf5c87c9",
"remote_hash": "1e2962767199c50daf436f29439b40da"
},
"./environments/learn-limited.yaml": {
"kind": "environment",
"id": "env_01JkwhfjfaQLMefaBxwLgwYx",
"hash": "af5c395ac0bae9da726c0edf4d7f5d15",
"remote_hash": "2482dd7ec9f42b4c252c67e2fbd27cef"
}
}
}
ハッシュも保持されていて、変更の有り無しが判断できるようです。
何も変更せずにant applyを実行すると、変更無しと出ます。
Preview ./claude-lock.json
Everything is up to date.
Resources 2 unchanged
プロンプトをちょっと変えてant apply . --dry-runを実行すると、変更を検知し、変更点が表示されます。
Preview ./claude-lock.json
± Name Plan
~ ./agents/az900-quiz-bot.md update agent_01GCfaZCGB3cct6Na8HtsUNu
~ system: あなたはMicrosoft Learn MCPサーバーを使ってAZ-900(Azure Fundamentals)の練習問題を作成する学習アシスタントです。Microsoft
Learnの最新の公式ドキュメントを参照し、選択式の問題を1問ずつ出題してください。⏎たまにAWSの試験問題も紛れ込ませてください。⏎⏎ルール:⏎-
問題文と選択肢を提示したら、ユーザーが回答するまで正解を明かさない。⏎-
ユーザーの回答後、正誤を伝え、各選択肢について正誤のポイントを1行ずつで説明する。⏎- 学習の参考になるMicrosoft
Learnドキュメントの実在するURLを3つ提示する …18 words…
Resources ~ 1 to update · 1 unchanged
リソースの削除の検知はありますが、Managed Agents環境側は勝手には削除されません。
agentsファイル以下を削除した場合はこのような動作となり、警告は出ますが、自動での削除はされません。
Preview ./claude-lock.json
warning: ./agents/az900-quiz-bot.md is in the lockfile but was not loaded this run; pass --prune to remove it, or name it on the command line to keep it tracked
Everything is up to date.
Resources 1 unchanged
削除する場合は、--pruneオプションを明示的に指定します。
Preview ./claude-lock.json
± Name Plan
- ./agents/az900-quiz-bot.md archive agent_01GCfaZCGB3cct6Na8HtsUNu
Resources - 1 to remove · 1 unchanged
applyで作れるもの、作れないもの
この節はClaudeに聞いて書いてもらいました。
ドキュメントにはエージェント・環境・メモリストア・デプロイメント・スキルの5種類と書いてあります。ほんとに5種類だけなのか、typeを適当に変えて総当たりしてみました。
unknown type "vault" (expected one of skill, environment, memory_store, agent, deployment)
エラーメッセージが仕様を教えてくれました。5種類だけです。ちなみにスキルだけは単一ファイルで宣言できません。
./probe.yaml: skill resources cannot be declared in a file
skills/<name>/SKILL.mdのディレクトリ丸ごと1バンドル、という扱いです。
逆に作れないもの。セッション、セッションイベント、Files、メモリストアの中身、Vault、トンネル、それとbeta:organization配下の管理系(ワークスペース、APIキー、ユーザー、フェデレーション設定など)は全部対象外でした。「エージェントを動かすための静的な設定」だけがapplyの守備範囲で、実行・データ・組織管理は命令的なコマンド側、という線引きになっています。シークレットをリポジトリに置かせない設計とも読めます。
CFnじゃなくてTerraform
この節はClaudeに聞いて書いてもらいました。
ここまでやって思ったのは、これCloudFormationっぽいな、でした。が、よく見ると状態の持ち方が逆です。
| ant apply | CloudFormation | Terraform | |
|---|---|---|---|
| 定義 |
agents/*.mdなど |
テンプレート | .tf |
| 状態 |
claude-lock.json(手元、コミットする) |
スタック(AWS側) | tfstate |
| 事前確認 | プラン表示→y/n/d | Change Set | terraform plan |
| 手動変更 |
remote_hashで検知して中断 |
ドリフト検出 | plan時に差分 |
状態が手元のファイルにあって、それをコミットして共有する。Terraformです。
CFnとの一番大きな違いはロールバックがないところ。更新が途中で失敗してもスタックごと巻き戻ったりはせず、部分適用がそのまま残ります。だからドキュメントにも「CIでapplyが失敗してもclaude-lock.jsonは必ずコミットしろ」と書いてあります。あとファイルを消してもリソースは消えません(警告だけ出て、--pruneで初めてarchive)。事故防止に倒した設計だと思います。
一番気をつけたいのはimportがないこと。コンソールで作ったリソースをあとから取り込むことはできなくて、同じ内容のファイルをapplyすると2つ目が作られます。コンソールのExport as codeでダウンロードするとclaude-lock.jsonごと落ちてくるので、既存のものを移行するときはそっちを起点にするのが正解です。
まとめ
この節は人力で書きました。1行ですが
もともとそんなに色々設定があるわけではないので、スクリプトを組めばいいレベルでしたが、公式サポートは嬉しいですね!