セキュリティやコスト通知の暫定ソリューションとしてDevinを活用

セキュリティやコスト通知の暫定ソリューションとしてDevinを活用

Clock Icon2025.03.18

はじめに

今回は、セキュリティやコスト通知などを実装あるいはSaaS導入などで対応する前の代替としてDevinに作業してもらう使い方を考えます。

例えばSecurityHubの通知で特定以上のレベルの異常が発生している場合に、通知を受け取りたいとします。その場合、SecurityHubとSNS、Amazon Q(Chatbot)を組み合わせて実装したり、セキュリティ系のSaaS製品を購入して通知を受けるという事もできます。前者の場合は、実装工数が多少必要になり、後者の場合は導入までに見積もりや製品比較なども必要になります。

またコスト分析についても、コスト配分タグの調整やサービス単位の分析を自力で行うか、SaaS製品を導入することで手動より効率的に分析できます。ただこちらも上記と一緒で事前準備がいくつか必要になります。

上記のような状況がある中、暫定対処としてAWSアカウントの状況を定期的に分析するためにDevinを活用する方法を試してみます。具体的には、DevinのAPIを使用して定期的にDevinを呼び出して、セキュリティチェックやコスト情報の連絡を行ってもらいます。これでSaaS導入前の暫定ソリューションとして使えないかを考えてみます。

Devinを定期実行する方法

DevinはAPIキーを使ってcurlなどから直接実行することができます。DevinのSettings画面で以下のように「Organizations Setting > Devin's API」を選択するとAPI Keyの発行画面が出るので青いボタンからAPIキーを生成します。下図はキーを発行済なのでView Keyになっている部分です。

スクリーンショット 2025-03-18 16.08.43.png

APIキーの詳細については以下のドキュメントを参考にしてください。

https://docs.devin.ai/api-reference/overview

APIキーを取得して以下のようにcurlなどでPOSTすることでDevin側のセッションを開始できます。

export DEVIN_API_KEY={先ほど取得したAPIキー}

curl -X POST "https://api.devin.ai/v1/sessions" \
     -H "Authorization: Bearer $DEVIN_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
  "prompt": "Your task description here"
}'

またPlaybookを作っている場合は、playbook_idを追加することでプロンプトの再利用も簡単にできます。

curl -X POST "https://api.devin.ai/v1/sessions" \
     -H "Authorization: Bearer $DEVIN_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
  "prompt": "Your task description here",
  "playbook_id": "playbook-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

週一でセキュリティ通知を行う

SecurityHubとSNS、EventBridgeを単純に接続すると少しでもセキュリティに問題のある設定があると常に通知が飛んできます。これは、ものによっては重要でない通知(例えば開発環境でのS3バケットのバージョニング有効化など)も常に来ることになります。特定のルールを除外したり、定期的に通知を絞って送ろうとするとマネージドサービス間の単純な接続だけでは実装できません。なので結構手間がかかります。そこをDevinに依頼します。

既にDevinに対してアクセスキーやシークレットキーなどの認証情報を与えている前提で以下のようにPOSTを定期的に送って通知してもらいます。定期的な実行にはPCのcronやEventBridge+Lambdaなどを利用してください。

改行したプロンプト

- SecurityHubの結果のサマリーを教えてほしいです。
  - AWSアカウント123456789012にReadOnlyRoleで接続してください
  - SecurityHubの結果を確認してください
  - SecurityHubの結果の中で重要な内容をサマリしてください
  - ReadOnlyRoleにはoathtoolにDevin secretsのAWS_MFA_SEED_SECRETを使って生成して接続してください。
curl -X POST "https://api.devin.ai/v1/sessions" \
     -H "Authorization: Bearer $DEVIN_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
  "prompt": "- SecurityHubの結果のサマリーを教えてほしいです。  - AWSアカウント123456789012にReadOnlyRoleで接続してください  - SecurityHubの結果を確認してください  - SecurityHubの結果の中で重要な内容をサマリしてください  - ReadOnlyRoleにはoathtoolにDevin secretsのAWS_MFA_SEED_SECRETを使って生成して接続してください。"
}'

実行完了すると、以下のようにsession_idとセッションのURLとしてurlが返ってきます。

{"session_id":"devin-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","url":"https://app.devin.ai/sessions/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}

セッションに移動すると、API Userとして処理を実行し始めているのが確認できます。おそらくAPIキーはOrganization単位で発行されているため、具体的な実行者は特定できません。

スクリーンショット 2025-03-18 16.37.03.png

Securityhubの通知結果を確認して、対処すべき内容をリストアップしてくれました。ただ、以下の2点について改善の余地があります。

  • 生成されるフォーマットが毎回異なる
  • Devin APIからセッションを開始するとSlackへの通知がされない

前者の方はPlaybookを活用してフォーマットを指定し、一貫性のある出力を得るようプロンプトを調整して試します。後者の方は、Devin UI上から行うとSlackの連携は出来なく以下のように表示されます。Slack上からDevinを呼び出すような仕組みに変えればいけるかもしれません。今回は割愛します。

スクリーンショット 2025-03-18 17.13.28.png

Playbookで補正する

出力を補正するために、以下のようにもともと与えていたプロンプトに追加してみます。

## 手順

- 出力について
  - サマリは以下のフォーマットで出力してください
    - 推奨される対応策
      - 1. [Severity(CRITICAL or HIGH or MEDIUM)] [Titleのprefix(IAM.2など)] 詳細な記述
      - 2. [Severity(CRITICAL or HIGH or MEDIUM)] [Titleのprefix(IAM.2など)] 詳細な記述
      - 3. [Severity(CRITICAL or HIGH or MEDIUM)] [Titleのprefix(IAM.2など)] 詳細な記述

プロンプトを与えてcurlでセッションを実行します。ちなみにタスク自体のプロンプトをPlaybookに含めるとうまくタスクを読み取れなかったので、promptに渡しています。

curl -X POST "https://api.devin.ai/v1/sessions" \
     -H "Authorization: Bearer $DEVIN_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
  "prompt": "- SecurityHubの結果のサマリーを教えてほしいです。  - AWSアカウント123456789012にReadOnlyRoleで接続してください  - SecurityHubの結果を確認してください  - SecurityHubの結果の中で重要な内容をサマリしてください  - ReadOnlyRoleにはoathtoolにDevin secretsのAWS_MFA_SEED_SECRETを使って生成して接続してください。 - サマリの出力はPlaybookのフォーマットに従ってください。この指示には必ず従ってください。",
  "playbook_id": "playbook-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

出力の結果は以下のような感じになりました。中々思ったフォーマットでは出してくれないのでこれはPlaybookやプロンプトの調整が必要そうです。

スクリーンショット 2025-03-18 18.25.51.png

コストについて

今度はコスト状況のサマリも通知させてみます。Lambdaなどから定期実行できるようにcurlでセッションを作成します。

curl -X POST "https://api.devin.ai/v1/sessions" \
     -H "Authorization: Bearer $DEVIN_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
  "prompt": "- AWSのコスト観点で見直したほうがよい部分を探してください  - AWSアカウント123456789012にReadOnlyRoleで接続してください  - ReadOnlyRoleにはoathtoolにDevin secretsのAWS_MFA_SEED_SECRETを使って生成して接続してください。"
}'

最終的には以下のようなマークダウンを生成してくれました。

# AWS コスト最適化レポート - アカウント 123456789012

## 概要
このレポートは、AWSアカウント123456789012のコスト最適化の機会を特定するために実施した分析の結果をまとめたものです。主要なコスト発生源と、コスト削減のための推奨事項を提供します。

## 主要なコスト発生源

### 1. AWS Security Hub (~$12.70/月)
- **現状**: CIS AWS Foundations Benchmark v1.2.0とAWS Foundational Security Best Practices v1.0.0の2つの標準が有効化されています。
- **推奨事項**: 
  - 必要なセキュリティ標準のみを有効にする
  - 不要な検出結果を除外するフィルターを設定する
  - 開発/テスト環境では完全に無効化することを検討する

### 2. Claude 3.5 Sonnet (Amazon Bedrock) (~$3.70/月)
- **現状**: Amazon Bedrockの使用によるコストが発生しています。
- **推奨事項**:
  - 使用量の監視と上限設定
  - 開発/テスト目的の場合は、より低コストのモデルへの切り替えを検討
  - 不要な場合は完全に無効化

(以下省略)

このマークダウンを例としてPlaybookからフォーマットを指定できると良さそうです。Playbookで指定以下のように指定してみました。

curl -X POST "https://api.devin.ai/v1/sessions" \
     -H "Authorization: Bearer $DEVIN_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
  "prompt": "- AWSのコスト観点で見直したほうがよい部分を探してください  - AWSアカウント123456789012にReadOnlyRoleで接続してください  - ReadOnlyRoleにはoathtoolにDevin secretsのAWS_MFA_SEED_SECRETを使って生成して接続してください。",
  "playbook_id": "playbook-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

ただ以下のようにかなり違うフォーマットで生成されたので、もう少し単純なフォーマットで依頼したほうが良さそうです。

# AWS コスト最適化詳細レポート

## 概要
AWS アカウント 123456789012 のコスト分析を行い、最適化の機会を特定しました。このレポートでは、高コストサービスの詳細分析と具体的な最適化提案を提供します。

## 主要な発見

### 1. 高コストサービス (2025年2月)

| サービス名 | 月間コスト (USD) | 前月比 | 最適化ポテンシャル |
|------------|-----------------|--------|-------------------|
| AWS Security Hub | $10.90 | ほぼ横ばい ||
| AWS WAF | $7.70 | 大幅増加 ||
| AWS Config | $3.24 | 増加 ||
| Amazon Timestream | $3.00 | 横ばい ||
| AmazonCloudWatch | $2.30 | 増加 ||
| Amazon GuardDuty | $0.96 | 横ばい ||
| AWS Secrets Manager | $0.80 | 横ばい ||
| Amazon S3 | $0.38 | 減少 ||

### 2. 異常なコスト変動

| サービス名 | 期間 | 変動 | 考えられる原因 |
|------------|------|------|---------------|
| AWS WAF | 2025年1月→2月 | $0.03 → $7.70 | 新規WAFルールの追加または異常なトラフィック |
| Amazon VPC | 2024年12月 | $19.24 (通常の約3倍) | 一時的なNATゲートウェイまたはVPCエンドポイントの使用 |
| AWS Config | 2025年1月→2月 | $1.94 → $3.24 | 設定項目の増加または記録対象リソースの増加 |

## 詳細分析と最適化提案

### AWS Security Hub ($10.90/月)
**現状**: 最も高コストのサービスであり、毎月約$10-11のコストが発生しています。
**最適化提案**:
1. **不要なセキュリティ標準の無効化**:
   - 全ての標準を有効にするのではなく、ビジネス要件に合った標準のみを有効化
   - 例: PCI DSS が不要な場合は無効化することでコスト削減可能
2. **スキャン対象の最適化**:
   - 開発/テスト環境のリソースを除外
   - 重要度の低いリソースタイプを除外
3. **統合の見直し**:
   - 他のセキュリティサービス (GuardDuty, Inspector) との重複を確認

### AWS WAF ($7.70/月)
**現状**: 2025年2月に突然コストが増加 ($0.03 → $7.70)
**最適化提案**:
1. **WAFルールの見直し**:
   - 不要または重複したルールの削除
   - カスタムルールの最適化
2. **リクエスト分析**:
   - 異常なトラフィックパターンの特定
   - ボットトラフィックのフィルタリング強化
3. **サンプリングレートの調整**:
   - ログ記録のサンプリングレートを下げる (100%→10%)

(以下省略)

所感

非同期的な作業の依頼として、セキュリティやコストなど機能開発の中で置いていかれがちなものを実装やSaaSでなくDevinで頼めるか試してみました。まだPlaybookが使いこなせていないので出力は安定しないですが、今後非同期型のAIエンジニアの使い方としてありかもと考えています。将来的にもっとPlaybookの錬度が上がったら再チャレンジしてみたいです。もしこのブログが多少でも参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.