Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

Jamf Proをコード管理 - AIを活用したTerraform Providerの自作

はじめに

こんにちは、Sansan株式会社 コーポレートシステム部の坂尾です。社内システムやインフラに関連する設計・開発・運用を担当しています。
これまでの業務経験においてプロダクトの研究開発やアーキテクチャ設計などのテックリードをしており、現在はその経験を活かして社内の各種SaaSやMDMソリューションなど幅広くシステムの運用改善に取り組んでいます。

コーポレートシステム部では、社内インフラの効率化と自動化を推進しています。特に、Infrastructure as Code(IaC)の導入により、設定管理の効率化と運用の安定性向上を目指しています。今回のテーマにしたのは、Macデバイス管理のためのJamf Proの設定管理についてです。

背景と課題

Jamf Proでの設定管理の現状

Jamf Proは、Appleデバイス(macOS/iOS)の管理をするためのMDMソリューションです。デバイス登録、ポリシー配布、ソフトウエアインストール、構成管理などができる強力なツールですが、設定管理には課題がありました。

現在、Macに配布する管理用のスクリプトはソースコード管理システムであるGitで管理しているものの、Jamf Proへの設定反映は手動でコピー&ペーストする必要があります。このため、Gitで管理しているスクリプトとJamf Proに展開されたスクリプトの同一性が担保できていない状況でした。

解決策の検討

この課題を解決するために、TerraformによるIaC化を検討しました。Terraformは、インフラの構成や設定をコード化し、バージョン管理や自動化を行うためのツールです。AWSやGCPなどのクラウドリソースの管理に広く使われていますが、Jamf ProのようなSaaSサービスにも適用できる可能性があります。

しかし、Jamf Pro向けのTerraform Providerは公式には提供されておらず、コミュニティで作成されたもののみ存在する状況でした。公式提供でないプロバイダは保守性や信頼性の面で本番環境への採用には不安がありました。そこで、独自のTerraform Providerを開発することを検討しました。

概念実証(PoC)のアプローチ

AIを活用した計画と実装

Terraform Providerの開発にあたり、まずは実現可能性とコストが問題となります。インフラ運用の定常的な業務に取り組む中でこのアイデアを実行に移すには時間的制約があります。
この状況を打開するために、AIを活用した調査と開発を通じて概念実証(PoC)を行う方針を取りました。具体的には、次の2つのAIを組み合わせて段階的に実行しました。

AIツール 用途
ChatGPT(o1 pro mode) ・実現可能性の調査
・設計の依頼
Cline(Visual Studio Codeの拡張機能) ・設計書を読み込ませて実装の計画を依頼
・AIが提案した中で優先して実装すべき項目の指示
・AIの成果物を随時確認し、修正点を指示

ChatGPTを使用した実現可能性の調査と設計

ChatGPTを使用した実現可能性の調査と設計を次のステップで進めました。モデルには推論に優れたo1 pro modeを使用しました。

  1. 実現可能性の調査
  2. 設計の依頼

実現可能性の調査

まずはChatGPTにJamf ProのIaC化が実現可能かどうかを調査してもらいました。

ChatGPTへの調査依頼
ChatGPTからの調査結果

どうやらJamf ProのIaC化は実現可能だということがわかりました。

設計の依頼

次に設計を依頼しました。

ChatGPTへの設計依頼

ChatGPTからの設計依頼結果

ChatGPTからの設計依頼結果 アーキテクチャ図

ここでは一部省略していますが、要件定義からシステムアーキテクチャ設計、実装の計画まで生成されました。この設計書を基に実装します。

Clineを使用した実装

次にClineを使用して実装の計画を依頼します。ClineはVisual Studio Codeの拡張機能で、AIを活用したコード生成やコードレビューができます。
まずはChatGPTで生成された設計書を読み込ませて実装の計画を依頼しました。依頼する際はClineのPlanモードを使用します。

Clineへの実装依頼

Clineからは次のような計画が提案されました。Clineと都度対話しながら計画を修正していきます。今回はプロトタイプと割り切って、動作検証が簡易的に行えるスクリプトの実装を優先しました。ここでのスクリプトとは、Macにスクリプトを配布するJamf Proの機能のことです。スクリプトを実装することでJamf Proの設定管理の基本機能を検証できます。

Clineからの実装計画

出力された実装計画で問題ないと判断したら実装を開始します。ClineをActモードに切り替えることで実装が開始されました。

プロトタイプの実装結果

実現できたこと

Clineによるプロトタイプの開発により、次の機能を実現できました。

  1. Jamf ProのIaC化の概念実証

    • Terraformによる設定管理の基本機能
    • リソースの定義と管理
    • 状態の同期
  2. Jamf Proのスクリプト機能のプロトタイプ実装

    • スクリプトの作成・更新・削除
    • パラメータの管理
    • バージョン管理

実際にClineが生成したコードは次のようなものでした。人の手によるプログラミングは不要で、すべて自動で実装されました。

Clineが生成したコード

アーキテクチャ設計

プロトタイプのアーキテクチャは次のような構成になっています。
プロトタイプではJamf Terraform Providerの箇所が実装されていますが、プロバイダを使用するにはTerraform構成ファイルを作成してterraform applyコマンドを実行することで、Jamf Proの設定を管理できます。

実装したTerraform Providerのアーキテクチャ

動作検証

Terraform Providerが実装されたので、実際に動作するか検証しました。

まずはJamf Proに配布するスクリプトを作成します。

example.sh:

#!/bin/bash
echo "Hello from Jamf Terraform Provider"
exit 0

スクリプトをJamf Proに配布するためのTerraform構成ファイルを作成します。次のコードは構成ファイルの主要な部分です。作成したProviderを読み込んで、スクリプトリソースを定義します。ここではスクリプトの内容をファイルから読み込むようにしています。実行にはJamf Proへの認証情報の定義も必要ですが、ここでは割愛します。

main.tf:

terraform {
  required_providers {
    jamf = {
      source  = "terraform.local/local/jamf"
      version = "0.1.0"
    }
  }

  backend "local" {
    path = "terraform.tfstate"
  }
}

provider "jamf" {
  url      = "https://example.jamfcloud.com"
  client_id     = var.jamf_client_id
  client_secret = var.jamf_client_secret
}

resource "jamf_script" "example" {
  name        = "Example Script"
  notes       = "Created via Terraform"
  category_id = 0
  priority    = "AFTER"
  content     = file("${path.module}/example.sh")
}

Terraform構成ファイルを作成したら、terraform applyを実行してJamf Proにスクリプトを配布します。

applyコマンドの実行:

❯ terraform apply

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # jamf_script.example will be created
  + resource "jamf_script" "example" {
      + category_id = 0
      + content     = <<-EOT
            echo '#!/bin/bash
            echo "Hello from Jamf Terraform Provider"
            exit 0' > example.sh
        EOT
      + id          = (known after apply)
      + name        = "Example Script"
      + notes       = "Created via Terraform"
      + priority    = "AFTER"
    }

Plan: 1 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

jamf_script.example: Creating...
jamf_script.example: Creation complete after 0s [id=70]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

さて、成功したようなので実際にJamf Proにスクリプトが配布されていることを確認します。

Jamf Proのスクリプト設定画面

定義通りにスクリプトが配布されていることが確認できました。

プロトタイプ開発を通じて得られた知見と考察

AIを活用してプロトタイプ開発をしたことで次のような知見を得ることができました。

迅速なPoCの実現
プロトタイプの開発は他の業務と並行して実行したのにも関わらず数時間で完了し、従来の開発手法と比較して大幅な時間短縮を実現しました。ChatGPTを用いた設計フェーズでは要件定義からアーキテクチャ設計までを短時間で完了でき、Clineを用いた実装フェーズでは設計書を基にしたコード生成により実装時間も短縮され、設計から実装までのサイクル短縮により早期のフィードバック獲得と開発の方向性検証が可能となりました。

設計の重要性
初期段階での要件定義やアーキテクチャ設計が成果物の品質を左右します。設計はAIに進むべき方向性を示し、人間のコントロール可能な枠組みの中でAIが持つ自律的な提案能力を最大限に引き出す鍵となります。ChatGPTを用いた対話的プロセスでは、AIが自発的に提示する選択肢を人間が評価・補正する往復が可能となり、漏れや矛盾を早期に発見して堅牢な設計へと収束させることができます。実装前にこのような設計フェーズを挟むことで、AIを制御しながら自律性を生かす協働体制を築き、開発効率と品質を大幅に高められると実感しました。

これらの知見は今後のプロジェクトでも活かせる貴重な経験となりました。AIを活用した開発手法と従来のソフトウエア開発のベストプラクティスを組み合わせることで、より効率的な開発が可能になると考えています。

今後の展望

インフラのIaC化による変革

今回のプロトタイプ開発を通じて、インフラのIaC化がもたらす変革の可能性をより具体的にイメージできるようになりました。

ナレッジ管理の効率化
コード化された仕様設計やパラメーターシートが存在することで、従来の静的なナレッジ管理の必要性が大幅に低減されます。AIを組み合わせることで、システム運用者やエンジニアの調査タスクが効率化され、必要な情報を必要な時に動的に取得できるようになります。

コードレビューによる品質向上
GitHubでのコード管理によりシステム変更のプロセスが明確になります。コードレビューを通じて変更内容の確認や品質の担保が可能となり、システム変更の承認におけるプロセスもスムーズになります。また、レビューを通じたナレッジ共有により、チーム全体の技術力向上にも繋がります。

自動化の実現
コード上の設定と各サービスの設定の整合性を監視し、軽微な修正はAIエージェントによる自動化が可能になります。これにより、運用保守の負担が軽減され、人を介した問い合わせ対応も減少します。

おわりに

今回の挑戦から得たもの

今回のプロトタイプ開発では貴重な学びを得ることができました。実利として、これまでIaC化が難しいとされていた領域でも自動化が可能であることを実証できました。
さらに大きな成果として、アプリケーションエンジニアなどのプログラマのスキルセットが、インフラ領域でも大きな価値を生み出す可能性を見出しました。特に、コードベースでの管理やAPIを活用した自動化といったスキルは、IaCの普及によりインフラ管理においても不可欠な要素となっています。

インフラ領域はAIの登場により変革の夜明けにあります。この変革の中で今後のインフラエンジニアに求められるスキルとして、プログラミング能力、自動化の考え方、AIツールの活用が重要になってくると実感しています。これらのスキルは、従来のインフラエンジニアリングの領域を超え、より広範な技術領域との接点を持つことを示唆しています。

読者へのメッセージ

この記事を読んで、私たちの取り組みに少しでも共感していただけたなら、ぜひ一度カジュアルにお話ししませんか?チームや業務内容、今後の展望について、ざっくばらんにご紹介できれば嬉しいです。

最後までお読みいただき、ありがとうございました。

Sansan技術本部ではカジュアル面談を実施しています

Sansan技術本部では中途の方向けにカジュアル面談を実施しています。Sansan技術本部での働き方、仕事の魅力について、現役エンジニアの視点からお話しします。「実際に働く人の話を直接聞きたい」「どんな人が働いているのかを事前に知っておきたい」とお考えの方は、ぜひエントリーをご検討ください。

© Sansan, Inc.