Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ClaudeCode_vs_GeminiCLI_Terraformで比較してみた
Search
t-kikuchi
July 16, 2025
Technology
1
170
ClaudeCode_vs_GeminiCLI_Terraformで比較してみた
ClaudeCode_vs_GeminiCLI_Terraformで比較してみた
t-kikuchi
July 16, 2025
Tweet
Share
More Decks by t-kikuchi
See All by t-kikuchi
AWSLambdaMCPServerを使ってツールとMCPサーバを分離する
tkikuchi
1
4k
ネットワークの新要素ResourceGateway&Configuration関連アップデート
tkikuchi
0
2.3k
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
4
760
塩野義製薬様のAWS統合管理戦略:Organizations設計と運用の具体例
tkikuchi
0
830
JAWSPANKRATION2024-ECS Best Practice All on board(english)
tkikuchi
0
920
JAWSPANKRATION2024-ECS Best Practice All on board(japanese)
tkikuchi
0
690
AWSOrganizationsユースケースで学ぶAWSアカウント管理ベストプラクティス
tkikuchi
1
1.1k
AWS Organizationsありなしパターン別AWSのマルチアカウント管理Tips
tkikuchi
2
990
GuardDutyとSysdigのランタイムセキュリティ機能を比較してみる
tkikuchi
1
1.8k
Other Decks in Technology
See All in Technology
OpenTelemetryセマンティック規約の恩恵とMackerel APMにおける活用例 / SRE NEXT 2025
mackerelio
3
1.9k
“日本一のM&A企業”を支える、少人数SREの効率化戦略 / SRE NEXT 2025
genda
1
210
大量配信システムにおけるSLOの実践:「見えない」信頼性をSLOで可視化
plaidtech
PRO
0
360
TROCCO と Stripeを使ったら Tenant-aware Telemetryを有効活用できそう! / Using TROCCO and Stripe, it seems possible to effectively utilize tenant-aware telemetry!
oztick139
0
100
事例で学ぶ!B2B SaaSにおけるSREの実践例/SRE for B2B SaaS: A Real-World Case Study
bitkey
1
390
推し書籍📚 / Books and a QA Engineer
ak1210
0
130
マルチプロダクト環境におけるSREの役割 / SRE NEXT 2025 lunch session
sugamasao
1
610
american aa airlines®️ USA Contact Numbers: Complete 2025 Support Guide
aaguide
0
500
american airlines®️ USA Contact Numbers: Complete 2025 Support Guide
supportflight
1
120
セキュアな社内Dify運用と外部連携の両立 ~AIによるAPIリスク評価~
zozotech
PRO
0
120
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
39k
United™️ Airlines®️ Customer®️ USA Contact Numbers: Complete 2025 Support Guide
flyunitedguide
0
790
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.5k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
108
19k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Facilitating Awesome Meetings
lara
54
6.5k
Navigating Team Friction
lara
187
15k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Scaling GitHub
holman
460
140k
4 Signs Your Business is Dying
shpigford
184
22k
For a Future-Friendly Web
brad_frost
179
9.8k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
Transcript
Claude Code vs Gemini CLI Terraformコード生成で比較してみた クラスメソッド株式会社 菊池聡規(とーち) 2025/07/16
1. 基本機能比較 2. 実際の検証結果 3. まとめ 今日の内容 2
基本的な機能(ファイル読み書き、MCP対応、会話履歴等)は同等なので、特徴的な部分のみ 比較 機能カテゴリ Claude Code Gemini CLI カスタマイズ カスタムスラッシュコマンド hooks
なし なし マルチモーダル 画像貼付 画像・PDF 検索機能 Web検索 Google Search統合 実行環境 devcontainer サンドボックス トークン数 200k 1M 基本機能比較 3
対応形式の豊富さ SVG: Base64エンコードで画像として処理(Claude Codeはテキストとして処理) SVGに関してはClaude Codeでも読み込めるが、データとして読み込んでる感じ Gemini CLIはBase64エンコードして画像として読んでいるのでスムーズに読める PDF: 高精度でMarkdown形式に変換
RAG等でPDFで大量にデータがあるというときに便利かも Gemini CLIの特徴①:マルチモーダル 4
これが 5
## CLAUDE.mdの育て方 - 特定パスの配下は編集しないでほしい - AWS公式ドキュメントとの整合性確認 > 今まで編集した内容やMCPサーバを使ったことなど、今までの作業を踏まえてCLAUDE.mdに反映して <中略> CLAUDE.mdに今回の作業内容を反映しました。
主な追加・更新内容: 1. Technical Documentation Standardsに追加: - AWS Documentation MCP server活用による��術検証の推奨 - 絵文字使用禁止ルール 2. Content Organization Rulesに追加: - 概念設計と詳細設計の明確な分離 - パラメータシートの焦点明確化 3. Critical Document Dependenciesセクション新設: - 概念設計と詳細設計間の整合性確認 - OU構造の一致確認 4. MCP Server Integrationセクション新設: - 利用可能なMCPサーバの一覧 - 技術検証のベストプラクティス これにより、今後のSCP設計作業や技術文書作成時に、AWS Documentation MCPサーバを活用した技術検証や、文書間の整合性確認が標準化されます。 こうなる 6
Claude Codeよりも強力な検索機能 Claude Codeからgemini cliを呼び出して検索させる手法も Claude CodeでGemini CLIのWeb検索を使えるようにした GitHub -
mofumofu3n/mcp-gemini-web-search Gemini CLI経由でweb検索したほうがトークン消費的に優しいかも? Claude Codeはコンテキストウィンドウがすぐにいっぱいになって Compactionが走るがそ れの緩和に役立つかも あるページではGeminiCLI経由だと半分以上のトークン削減ができた(Claude Code曰く) Gemini CLIの特徴②:Web検索機能 7
2つの実行方式 ① macOS Seatbelt方式 macOSには sandbox-exec というコマンドが備わっており、これを利用しているらしい。 gemini -s で起動でき、手軽
SEATBELT_PROFILE 環境変数にプロファイル名を指定することで、ネットワークなし、書き 込み制限など様々な制限が可能 Gemini CLIの特徴③:サンドボックス 8
2つの実行方式 ② Docker方式 export GEMINI_SANDBOX=docker と環境変数をセットすればコンテナ内でのGemini CLI実行とな る チーム間での実行環境統一にも活用可能 自分が試した範囲だとAPI
Keyを使った認証だとデフォルトコンテナでもうまく起動できた。 具体的には Google AI StudioでGEMINI_API_KEYを作成 ~/.gemini/settings.jsonの "selectedAuthType": "gemini-api-key" にして export GEMINI_API_KEY="<払い出したAPIキー>" && GEMINI_SANDBOX=docker gemini Gemini CLIの特徴③:サンドボックス 9
検証内容 システム構成図と簡単な要件をインプットとしてパラメータシートとterraformコードを書いて もらう パラメータシート作成 → Terraformコード生成 実際にAWS環境へデプロイして動作確認 実際の検証:SecurityHub通知システム 10
システム構成図 11
# SecurityHub通知システム 要件定義書 ## システム概要 AWS組織全体のセキュリティ監視結果を統合し、適切な担当者に通知するシステム ## 構築範囲 **EventBridge →
Step Functions → SNS** - SecurityHubによる検出結果の集約は既に完了済み - 本プロジェクトでは通知処理部分のみを構築対象とする ## 機能要件 ### 1. 検出結果集約 - 全アカウント・全リージョンのSecurityHub検出結果を委任管理アカウントに集約 - GuardDuty、Access Analyzer等の結果もSecurityHub経由で統合 ### 2. 通知配信 - セキュリティチーム:全アカウントの通知を受信 - メールによる通知 ### 3. 通知フィルタリング - CRITICAL・HIGH重要度のみ通知 - MEDIUM・LOW重要度は通知対象外(コンソール確認)だが、Access AnalyzerについてはMEDIUM・LOW重要度も通知対象とする ## 技術要件 - **AWS Services**: SecurityHub, EventBridge, Step Functions, SNS - **通知形式**: メール - **アカウント**: SecurityHub機能にて、組織内全AWSアカウントの通知を集約。本通知システムは集約先アカウントにのみ作成することで、集約先アカウントに集約された通知をメール送信することを目的とする ## 主要コンポーネント 1. **SecurityHub**: 各アカウントの検出結果を委任管理アカウントに集約 2. **EventBridge**: 検出結果をトリガーとしたイベント配信 3. **Step Functions**: 通知内容の整形・フィルタリング処理 4. **SNS**: 通知配信管理 要件 12
モデルとバージョン Claude Code: Sonnet 4 Gemini CLI: gemini-2.5-pro 設定ファイルの統一 グローバル設定:
~/.claude/CLAUDE.md と ~/.gemini/GEMINI.md を統一 内容: 包括的開発標準、言語別設定、セキュリティルールなど記載 参考: Claude Code の CLAUDE.mdは設定した方がいい 比較の前提条件 13
Terraform設計ガイドライン適用 Terraform設計ガイドライン | フューチャー株式会社の内容を /initでCLAUDE.mdに落とし込ん だ MCP設定: 両ツールで統一 検証の公平性 同じ入力データ(構成図
+ 要件定義書) 同じ評価基準とテスト手順 同じ開発環境とツール設定 プロジェクト設定の統一 14
評価項目 Claude Code Gemini CLI 見た目 テキスト形式 表形式 命名規則 ほぼ準拠
無視 EventBridge設定 ProductName設定漏れ 正しい設定 Step Functions設定 動作しない定義 正しい条件分岐 パラメータ充実度 必要最低限 必要最低限 パラメータシート比較結果 15
EventBridge設定 Claude Codeは、SecurityHubとGuardDutyの1ルール、IAM Access Analyzerで1ルールと いう方針で設計してきた ただ、ProductNameのパラメータが抜けてるので、2重で通知されそう "detail-type": ["Security Hub
Findings - Imported"], "detail": { "findings": { "Severity": { "Label": ["CRITICAL", "HIGH"] } } } StepFunctions設定 ちゃんと通知結果を整形している良さげなコードに見えたが実際には実装できないコード だった。 結局、シンプル化して実装 パラメータシート所感(ClaudeCode) 16
命名規則 var.prefix-sechub-notification-sfn みたいな感じでかいてあり読みづらい。 本来は ${var.prefix}-sechub-notification-sfn といった感じで書いてほしいところ EventBridge設定 こちらはイベントパターンは一つでStepFunctions側で条件分岐する仕組みになっていた どんな通知でもステートマシンが動くのでコスト的には良くない StepFunctions設定
SNS送信時に通知の整形はしていない。要件として書いてないからむしろ正しい姿かも パラメータシート所感(GeminiCLI) 17
項目 Claude Code Gemini CLI terraform init 正常 正常 terraform
validate 正常 正常 tflint 3件の警告 問題なし Trivy 2件(暗号化不備) 1件(暗号化不備) terraform plan Step Functions定義エラー 正常 terraform apply 実行不可 成功 コードテスト結果 18
こんな感じで修正を依頼 以下を実行し、aws環境にリソースをデプロイしてください。\ 認証は `***` コマンドで取得してください \ # Terraform初期化 terraform init
# 構文チェック terraform validate # Terraform linter(tflint) tflint --format compact # セキュリティスキャン(Trivy) trivy config . --format table --exit-code 0 > claude-security-scan.txt # 結果を保存 terraform plan -out=gemini-cli.tfplan\ \ terraform apply 当たり前ですが、tflintやtrivyの違反項目を自動で直してくれました 最終的には(少し人間が手伝ったものの)apply成功 Claude Codeのリトライ 19
Claude Code variables.tf: 環境名をちゃんと定義、validation付き コメント: 各リソースが見やすく区切られている 柔軟性: terraform.tfvarsで環境別設定への配慮 タグ付け: 適切なタグ(プロジェクト、環境名、terraform管理を示すタグ)
# =============================================== # SNS Topic for SecurityHub Notifications # =============================================== resource "aws_sns_topic" "securityhub_notifications" { name = "${var.environment}-securityhub-notifications" Terraformコード品質比較 20
Gemini CLI 一発成功: 初回でterraform apply成功 しかも、何もせずともSNS送信の実行のところまでちゃんと動いていた。 コメント: 一切なし 柔軟性: 環境別設定なし
Terraformコード品質比較 21
Claude Code variable "environment" { description = "Environment name (dev,
stg, prod)" type = string validation { condition = contains(["dev", "stg", "prod"], var.environment) error_message = "Environment must be dev, stg, or prod." } } variable "security_team_email" { description = "Email address for security team notifications" type = string validation { condition = can(regex("^[^@]+@[^@]+\\.[^@]+$", var.security_team_email)) error_message = "Must be a valid email address." } } variable "tags" { description = "Common tags for all resources" type = map(string) default = { Project = "SecurityHub-Notification" Environment = "" ManagedBy = "Terraform" } variables.tf比較 22
Gemini CLI variable "prefix" { type = string description =
"The prefix for the resources." default = "sechub-notification" } variable "security_team_email" { type = string description = "The email address of the security team." } variables.tf比較 23
ルールの強制力はやっぱりそれほどはない 作成したコードでCLAUDE.mdにしたがっていない部分があるか聞いたら、ファイル構成・ モジュール構造、命名規則、バックエンド設定など8つ以上の項目をあげてきた。 まだまだプロンプトの良し悪しで決まる部分は多いと思ってる プロンプトの良し悪しできまるのだとしたら、プロンプトを管理、展開できるカスタムスラッ シュコマンドがあるClaude Codeは強い またルールの補助的仕組みとしてhooksも良い。特にlinter実行やセキュリティチェック実行の 自動化が良い 一方で多彩なマルチモーダル対応やWeb検索のうまさなどGemini
CLI独自の部分もあるのでこ ういった部分は活かしていきたい まとめ 24
実はクラスメソッド、Google Cloudの支援もやってます 25
ご清聴ありがとうございました @tttkkk215