Claude Codeを使ったタスクの協働デモ - AWS技術調査からIaC実装まで
2025-06-20 に 社内で Claude Code 勉強会があり、 その中で 「タスク管理と推進を Claude Code を協働する試み」 と題してデモを実施しました。
AWS技術調査〜IaC実装の仮想タスクをベースに、Claude Codeと協働でタスク推進を進める内容です。 10分という短い時間のデモで以下を実施しています。
10分デモでやったこと
- デモ#1: 課題を登録
- デモ#2: AWS技術調査
- デモ#3: Terraformコードを実装
- デモ#4: 1日の実績作成
実際のデモの内容を本ブログでまとめます。 1ユースケースとして参考になればと思います。
目次
- デモ#1: 課題を登録
- デモ#2: AWS技術調査
- デモ#3: Terraformコードを実装
- デモ#4: 1日の実績作成
- 補足情報: CLAUDE.md などの環境
- 補足情報: デモのログ
デモ#1: 課題を登録
事前に以下Backlog課題を仮想タスクとして作っていました。
仮想タスク「Inspector S3エクスポートの仕組みを構築する」
わたしは普段 Emacs org-mode のローカル環境でタスク管理をしています。 この課題をまずはローカル環境に登録します。
Claude Code にてカスタムスラッシュコマンド ( create-task
) を実行しました。 ※カスタムスラッシュコマンドの内容は「補足情報」章で後述します。
カスタムスラッシュコマンドの実行 → Backlog MCP Server 動作
ローカルにタスクファイルとして登録
Claude Code はm Backlog MCP サーバーで課題の内容を読み取って、 ローカルにタスクファイルとして登録します。
Claude Code が作成してくれたタスクファイル
デモ#2: AWS技術調査
設計にあたり、気になるポイントをまとめて Claude Code に調査依頼しました。
調査依頼 → AWS Documentation MCP Server 起動
調査結果をタスクファイルに記載してもらいます。
調査結果を追記してもらった
追記してもらったところ
デモ#3: Terraformコードを実装
タスクファイルに設計書を書きます。 これは手で書きました。
設計書は手で書いた
作成予定のコードの枠だけ書いておく
その設計をもとに、Claude Codeに TerraformのIaCコードを書いてもらいます。
実装依頼 → Terraform MCP Server 起動
実装完了
以下のようにタスクファイルにTerraformコードが記載されました。
Terraformコードを書いてくれた
s3.tf(抜粋)
kms.tf(抜粋)
デモ#4: 1日の実績作成
「これまでやったこと」を Claude Code にまとめてもらいます。 create-diary
カスタムスラッシュコマンドを実行します。
Gitの変更をまずはステージング, コミットしていく
日報を作ってもらう
生成された日報
これにて退勤(= デモ終了)です。
補足情報: CLAUDE.md などの環境
デモで使用した環境について参考情報として載せていきます。 まだまだ荒削りなので、コメント/アドバイス大歓迎です。
CLAUDE.md: プロジェクトメモリ
# ワークスペース概要
本ディレクトリは私(CM川原征大)のタスク管理・推進用ワークスペースです。
Emacs org-modeで管理されています。
# Claude Codeによるタスク管理・推進ガイドライン
## 基本的な記録・追記ルール
- 見出しに `ai:` プレフィクスをつけてAIが生成した内容であることを明示する
(例: `* ai: 内容まとめ` , `** ai: XXX調査結果` )
- Emacs org-mode文法に従って記述する(見出しは*、リストは-、サブ見出しは***など)
- **見出しの階層制限**: 見出しの深さは最大2階層までとし、それ以上のネストは避ける
- 可読性を重視し、深い階層構造による情報の迷子を防ぐ
- 詳細な分類が必要な場合はリスト形式やセクション分けを活用する
- 調査を行った際には、調べたURL情報を付与する
- 公式ドキュメント、記事、API仕様書等の参照元URLを明記
- org-mode link形式で記述: `[[URL][表示名]]`
- diary/ 配下のファイル:`ai:` プレフィックスは不要(個人の日報記録のため)
## ツール別ガイドライン
### 技術調査・分析
- AWS関連調査では AWS Documentation MCP server を優先使用
- 調査結果は `** ai: 調査結果` 見出しで記録
- 参考URLは必ず org-mode link形式で記載
### Terraform構築
- Terraformリソースを構築する際は、Terraform MCP serverを積極的に活用する
- `mcp__terraform-mcp-server__resolveProviderDocID` でプロバイダードキュメントIDを取得
- `mcp__terraform-mcp-server__getProviderDocs` で公式ドキュメントを参照
- 公式ドキュメントのサンプルコードを参考にしてTerraformコードを作成
- これにより最新かつ正確なTerraform構文でリソースを構築する
### Backlog連携
- Backlog wikiページやプロジェクト情報を参照する際は、Backlog MCP serverを積極的に活用する
- WebFetchツールではなく、以下のBacklog MCP server関数を使用する:
- `mcp__backlog__get_wiki` でwikiページの内容を取得
- `mcp__backlog__get_project` でプロジェクト情報を取得
- `mcp__backlog__get_issues` で課題情報を取得
- これによりBacklogの認証とアクセス権限に基づいた正確な情報取得を実現する
create-task.md: カスタムスラッシュコマンド
# 案件タスク作成
BacklogのURLから課題情報を取得してタスク管理します。
## 使い方
```
/project:create-task
```
## 例
```
/project:create-task
URLを入力してください: https://example.com/view/TEST-123
```
## 動作
1. ユーザーの入力から課題キーを抽出
2. Backlog MCPサーバーを使って Issue 情報を取得
4. `{課題キー}.org`ファイルを作成
5. 課題内容を分析して適切なorg-modeタグを自動付与
6. 以下の形式でorg-modeファイルに保存 (見出し前後に空行を作らない)
```org
\* TODO [0%] (課題キー) (課題タイトル) :(適切なタグ):
(URL)
\** ai: summary
(課題の要約)
\** TODO (課題にあるタスク#1)
\** TODO (課題にあるタスク#2)
\** TODO (課題にあるタスク#3)
```
#### 利用可能なタグ(AWS Well-Architected Framework準拠)
- `:sec:` - Security(セキュリティ)
- `:rel:` - Reliability(信頼性)
- `:perf:` - Performance(パフォーマンス効率性)
- `:cost:` - Cost Optimization(コスト最適化)
- `:ops:` - Operational Excellence(運用上の優秀性)
- `:mtg:` - Meeting(ミーティング関連)
create-diary.md: カスタムスラッシュコマンド
# 日報作成
本日の日報を作成します。
## 実行例
```bash
/create-diary
```
## 処理内容
1. ステージングされていない変更があれば git add, commit を実行
2. 本日分のgit diff(-U0オプション付き)を調査
3. 実施内容を分析・整理
4. `diary/{YYYY-MM-DD}.org`ファイルを作成
## 出力形式
各実施内容は以下の形式で記載:
```org-mode
\* 日報(${日にち: YYYY-MM-DD})
\** 推進したタスク
${*.org での実施内容}
```
※出力にaiプレフィクスは不要
### 実施内容の形式
```org-mode
<!-- 通常タスクの場合 -->
- ${タスク名}
- ${実施内容1}
- ${実施内容2}
- ${実施内容3}
<!-- ミーティングの場合 -->
- ミーティング参加: ${タスク名}
```
## 記載ルール
- **個人名・顧客名**: イニシャル表記(例:Aさん、Sさま)
- **タスク名**: 課題番号(`TEST-123`等)は除外
- **実施内容**: 最大3項目まで、簡潔に記載
## TODOステータス対応
- **TODO/DOIN**: 進行中(報告対象)
- **WAIT/HOLD**: 待ち状態(報告対象)
- **TRET/DONE**: 完了(報告対象)
- **SKIP**: 対応不要(報告対象外)
Backlog MCP Server
事前に環境変数( BACKLOG_DOMAIN
, BACKLOG_API_KEY
)をセットして、 以下コマンドでMCPサーバーを登録しました。
mcp_json=$(cat <<EOF
{
"command": "docker",
"args": [
"run",
"--pull", "always",
"-i",
"--rm",
"-e", "BACKLOG_DOMAIN",
"-e", "BACKLOG_API_KEY",
"ghcr.io/nulab/backlog-mcp-server"
]
}
EOF
)
claude mcp add-json backlog "${mcp_json}"
AWS Documentation MCP Server
以下コマンドでMCPサーバーを登録しました。
mcp_json=$(cat <<EOF
{
"command": "uvx",
"args": ["awslabs.aws-documentation-mcp-server@latest"],
"env": {
"FASTMCP_LOG_LEVEL": "ERROR",
"AWS_DOCUMENTATION_PARTITION": "aws"
},
"disabled": false,
"autoApprove": []
}
EOF
)
claude mcp add-json aws-documentation-mcp-server "${mcp_json}"
Terraform MCP Server
以下コマンドでMCPサーバーを登録しました。
mcp_json=$(cat <<EOF
{
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"hashicorp/terraform-mcp-server"
]
}
EOF
)
claude mcp add-json terraform-mcp-server "${mcp_json}"
補足情報: デモのログ
デモのログ(一部マスク/加工済み)
> /create-task is running…
⏺ URLを入力してください:
> https://example.com/view/TEST-123
⏺ backlog:get_issue (MCP)(issueKey: "TEST-123")
⎿ {
… +94 lines (ctrl+r to expand)
⏺ Write(TEST-123.org)
⎿ Wrote 8 lines to TEST-123.org
* TODO [0%] TEST-123 Inspector
S3エクスポートの仕組みを構築する :sec:
https://example.com/view/TEST-123
** ai: summary
Amazon Inspector の脆弱性情報をS3バケットにエクスポートする仕組みを構築する。CCoE
がオンデマンドにEC2脆弱性情報をクエリでき、将来的にQuickSightダッシュボードで可視
化して活用できるようにする。
** TODO Inspector S3エクスポートの手法や仕様を調査する
** TODO 設計書を作成する
** TODO 構築する
** TODO CCoE内に共有する
⏺ タスクファイル TEST-123.org を作成しました。Inspector
の脆弱性情報をS3エクスポートする仕組み構築のタスクで、セキュリティ関連として :sec:
タグを付与しています。
> - 気になるポイントメモ
- Inspector標準の機能として対応しているのか
- 出力形式 (CSV? JSON? Parquet?)
- 前提条件
- 必要な手順
調査タスクを進めます。
気になるポイントを書いたので公式ドキュメントを調べて調査結果を書いて。
⏺ aws-documentation-mcp-server:search_documentation (MCP)(search_phrase: "Amazon
Inspector export findings
S3")
⎿ {
"rank_order": 1,
"url": "https://docs.aws.amazon.com/inspector/latest/user/findings-managing-exp
… +4 lines (ctrl+r to expand)
⎿ {
"rank_order": 2,
"url": "https://docs.aws.amazon.com/inspector/latest/user/findings-managing.htm
… +5 lines (ctrl+r to expand)
(略)
⎿ {
"rank_order": 10,
"url": "https://docs.aws.amazon.com/AmazonS3/latest/userguide/vulnerability-ana
… +6 lines (ctrl+r to expand)
⏺ aws-documentation-mcp-server:read_documentation (MCP)(url: "https://docs.aws.amazon
.com/inspector/latest/user/fin
dings-managing-exporting-repor
ts.html", max_length: 8000)
⎿ AWS Documentation from https://docs.aws.amazon.com/inspector/latest/user/findings
-managing-exporting-reports.html:
… +192 lines (ctrl+r to expand)
(略)
⏺ aws-documentation-mcp-server:read_documentation (MCP)(url:
"https://docs.aws.amazon.com/i
nspector/v2/APIReference/API_C
reateFindingsReport.html",
max_length: 6000, start_index:
6000)
⎿ AWS Documentation from https://docs.aws.amazon.com/inspector/v2/APIReference/API_
CreateFindingsReport.html:
… +189 lines (ctrl+r to expand)
⏺ Update(TEST-123.org)
⎿ Updated TEST-123.org with 22 additions
8 - 出力形式 (CSV? JSON? Parquet?)
9 - 前提条件
10 - 必要な手順
11 + ** ai: 調査結果
12 + *** Inspector S3エクスポートの基本仕様
13 + Amazon Inspectorでは findings report
をS3バケットにエクスポートする標準機能を提供している。
14 + 参考:
[[https://docs.aws.amazon.com/inspector/latest/user/findings-managing
+ -exporting-reports.html][Exporting Amazon Inspector findings reports]]
15 +
16 + *** 出力形式
17 + - CSV形式
18 + - JSON形式
19 + - Parquet形式は対応していない(CSVまたはJSONのみ)
20 + 参考:
[[https://docs.aws.amazon.com/inspector/v2/APIReference/API_CreateFin
+ dingsReport.html][CreateFindingsReport API]]
21 +
22 + *** 前提条件
23 + - 同一リージョンのS3バケットが必要
24 + - S3バケットポリシーでInspector2サービスからの書き込み許可が必要
25 + - AWS KMSキーによる暗号化が必須(customer managed, symmetric encryption
key)
26 + - 適切なIAM権限が必要(Inspector, S3, KMS関連)
27 +
28 + *** 必要な手順
29 + 1. S3バケットの作成と権限設定
30 + 2. AWS KMSキーの作成と権限設定
31 + 3. Inspector findings reportの作成とエクスポート実行
32 + 4. 必要に応じてフィルタリング条件の設定
33 ** TODO 設計書を作成する
34 ** TODO 構築する
35 ** TODO CCoE内に共有する
⏺ Inspector
S3エクスポートについて調査結果をorgファイルに記録しました。標準機能でCSV/JSON形式で
の出力が可能で、S3バケットとKMS暗号化が必要な前提条件であることが分かりました。
> @TEST-123.org
に設計を記載しました。Terraformコード(WIP部分)を書いてほしい
⎿ Read TEST-123.org (60 lines)
⏺ Update Todos
⎿ ☐ S3バケットのTerraformコードを作成する
☐ KMSキーのTerraformコードを作成する
⏺ terraform-mcp-server:resolveProviderDocID (MCP)(providerName: "aws",
providerNamespace: "hashicorp",
serviceSlug: "s3", providerDataType:
"resources")
⎿ Available Documentation (top matches) for resources in Terraform provider hashico
rp/aws version: 6.0.0
… +201 lines (ctrl+r to expand)
⏺ terraform-mcp-server:getProviderDocs (MCP)(providerDocID: "9242510")
⎿ ---
subcategory: "S3 (Simple Storage)"
layout: "aws"
… +634 lines (ctrl+r to expand)
⏺ terraform-mcp-server:getProviderDocs (MCP)(providerDocID: "9242524")
⎿ ---
subcategory: "S3 (Simple Storage)"
layout: "aws"
… +87 lines (ctrl+r to expand)
⏺ Update(TEST-123.org)
⎿ Updated TEST-123.org with 54 additions and 1 removal
48 ** TODO 構築する
49 *** TODO S3バケット
50 #+begin_src terraform :tangle output/s3.tf
51 - # WIP
51 + # Inspector findings export用のS3バケット
52 + resource "aws_s3_bucket" "inspector_findings" {
53 + bucket = "example-doc-bucket"
54 +
55 + tags = {
56 + Name = "Inspector Findings Export Bucket"
57 + Environment = "production"
58 + Purpose = "inspector-findings-export"
59 + }
60 + }
61 +
62 + # S3バケットポリシー - Inspector2サービスからの書き込み許可
63 + resource "aws_s3_bucket_policy" "inspector_findings_policy" {
64 + bucket = aws_s3_bucket.inspector_findings.id
65 + policy = data.aws_iam_policy_document.inspector_findings_policy.json
66 + }
67 +
68 + data "aws_iam_policy_document" "inspector_findings_policy" {
69 + statement {
70 + sid = "allow-inspector"
71 + effect = "Allow"
72 +
73 + principals {
74 + type = "Service"
75 + identifiers = ["inspector2.amazonaws.com"]
76 + }
77 +
78 + actions = [
79 + "s3:PutObject",
80 + "s3:PutObjectAcl",
81 + "s3:AbortMultipartUpload"
82 + ]
83 +
84 + resources = [
85 + "${aws_s3_bucket.inspector_findings.arn}/*"
86 + ]
87 +
88 + condition {
89 + test = "StringEquals"
90 + variable = "aws:SourceAccount"
91 + values = [data.aws_caller_identity.current.account_id]
92 + }
93 +
94 + condition {
95 + test = "ArnLike"
96 + variable = "aws:SourceArn"
97 + values =
["arn:aws:inspector2:${data.aws_region.current.name}:${
+ data.aws_caller_identity.current.account_id}:report/*"]
98 + }
99 + }
100 + }
101 +
102 + # 現在のアカウントIDとリージョンを取得
103 + data "aws_caller_identity" "current" {}
104 + data "aws_region" "current" {}
105 #+end_src
106
107 *** TODO KMSキー
⏺ Update Todos
⎿ ☒ S3バケットのTerraformコードを作成する
☐ KMSキーのTerraformコードを作成する
⏺ terraform-mcp-server:resolveProviderDocID (MCP)(providerName: "aws",
providerNamespace: "hashicorp",
serviceSlug: "kms",
providerDataType: "resources")
⎿ Available Documentation (top matches) for resources in Terraform provider hashico
rp/aws version: 6.0.0
… +49 lines (ctrl+r to expand)
⏺ terraform-mcp-server:getProviderDocs (MCP)(providerDocID: "9242150")
⎿ ---
subcategory: "KMS (Key Management)"
layout: "aws"
… +428 lines (ctrl+r to expand)
⏺ Update(TEST-123.org)
⎿ Updated TEST-123.org with 67 additions and 1 removal
106
107 *** TODO KMSキー
108 #+begin_src terraform :tangle output/kms.tf
109 - # WIP
109 + # Inspector findings export用のKMSキー(Symmetric encryption)
110 + resource "aws_kms_key" "inspector_findings" {
111 + description = "KMS key for Inspector findings export
encry
+ ption"
112 + enable_key_rotation = true
113 + deletion_window_in_days = 30
114 +
115 + policy = data.aws_iam_policy_document.inspector_kms_policy.json
116 +
117 + tags = {
118 + Name = "Inspector Findings Export KMS Key"
119 + Environment = "production"
120 + Purpose = "inspector-findings-export"
121 + }
122 + }
123 +
124 + # KMSキーのポリシー - Inspector2サービスからの使用許可
125 + data "aws_iam_policy_document" "inspector_kms_policy" {
126 + # ルートアカウントに完全権限を付与
127 + statement {
128 + sid = "EnableIAMUserPermissions"
129 + effect = "Allow"
130 +
131 + principals {
132 + type = "AWS"
133 + identifiers =
["arn:aws:iam::${data.aws_caller_identity.current.ac
+ count_id}:root"]
134 + }
135 +
136 + actions = ["kms:*"]
137 + resources = ["*"]
138 + }
139 +
140 + # Inspector2サービスからの暗号化・復号化を許可
141 + statement {
142 + sid = "AllowInspectorToUseKey"
143 + effect = "Allow"
144 +
145 + principals {
146 + type = "Service"
147 + identifiers = ["inspector2.amazonaws.com"]
148 + }
149 +
150 + actions = [
151 + "kms:Decrypt",
152 + "kms:GenerateDataKey*"
153 + ]
154 +
155 + resources = ["*"]
156 +
157 + condition {
158 + test = "StringEquals"
159 + variable = "aws:SourceAccount"
160 + values = [data.aws_caller_identity.current.account_id]
161 + }
162 +
163 + condition {
164 + test = "ArnLike"
165 + variable = "aws:SourceArn"
166 + values =
["arn:aws:inspector2:${data.aws_region.current.name}:${
+ data.aws_caller_identity.current.account_id}:report/*"]
167 + }
168 + }
169 + }
170 +
171 + # KMSキーのエイリアス
172 + resource "aws_kms_alias" "inspector_findings" {
173 + name = "alias/example-key-for-inspector"
174 + target_key_id = aws_kms_key.inspector_findings.key_id
175 + }
176 #+end_src
177
178 ** TODO CCoE内に共有する
⏺ Update Todos
⎿ ☒ S3バケットのTerraformコードを作成する
☒ KMSキーのTerraformコードを作成する
⏺ Terraformコードの作成が完了しました。
作成したコード
S3バケット (output/s3.tf):
- Inspector2サービス専用のS3バケット
- 必要な権限(PutObject, PutObjectAcl, AbortMultipartUpload)を付与
- SourceAccountとSourceArnによる制限付きポリシー
KMSキー (output/kms.tf):
- Symmetric encryptionキー(Inspector要件)
- Key rotationを有効化
- Inspector2サービスからのDecrypt、GenerateDataKey権限を付与
- エイリアス設定で管理しやすく
どちらもAWS公式ドキュメントの要件に従って設計されており、セキュリティベストプラクテ
ィスを適用しています。
> /create-diary is running…
⏺ Bash(git status)
⎿ On branch main
No commits yet
… +9 lines (ctrl+r to expand)
⏺ Bash(git add .)
⎿ (No content)
⏺ Bash(git commit -m "Inspector S3エクスポート設計・Terraformコード作成…)
⎿ [main (root-commit) fbfe6f7] Inspector S3エクスポート設計・Terraformコード作成
5 files changed, 319 insertions(+)
create mode 100644 .claude/commands/create-diary.md
… +4 lines (ctrl+r to expand)
⏺ Bash(git diff HEAD~1 HEAD -U0)
⎿ Error: fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the
working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
⏺ Bash(git log --oneline --since="2025-06-20 00:00:00")
⎿ fbfe6f7 Inspector S3エクスポート設計・Terraformコード作成
⏺ Bash(git show --stat HEAD)
⎿ commit fbfe6f777f9eb8411b1d716654052e69e963677c
Author: XXX
Date: Fri Jun 20 16:56:20 2025 +0900
… +17 lines (ctrl+r to expand)
⏺ Bash(mkdir -p diary)
⎿ (No content)
⏺ Write(diary/2025-06-20.org)
⎿ Wrote 6 lines to diary/2025-06-20.org
* 日報(2025-06-20)
** 推進したタスク
- Inspector S3エクスポートの仕組みを構築する
- Inspector S3エクスポートの手法や仕様を調査
- 設計書を作成
- Terraformコードを実装(S3バケット・KMSキー)
⏺ 日報を作成しました。本日はInspector
S3エクスポートの仕組み構築タスクで、調査・設計・Terraformコード実装を完了しました。
おわりに
Claude Code とタスク管理/推進を協働するデモでした。 協働するうえで大事だと思ったことは以下のとおりです。
- プレーンテキストでタスク管理する
- 手に馴染むテキスト編集ツールを見つける
- VS Code
- Obsidian
- Cursor
- Vim
- (Emacs org-mode)
- 以下マインドを持つ
- より上位レイヤーを意識する
- 課題を先に立てる
- やることを先にリスト化する
- 実施したログをテキストに残す
協働し始めてからまだまだ日は浅いので、 今後どんどん関与の比率を高めていきたいですね。
以上、参考になれば幸いです。