Vercel - Audit Logs 詳解

Vercel - Audit Logs 詳解

Vercel の Audit Logs について、利用前提とエクスポート手順、実際の CSV に含まれるカラムや代表的な action の例を紹介します。Enterprise プランの Team で Owner がどのように監査ログを扱えるかを把握したい方に向けた記事です。
2025.11.27

はじめに

本記事では Vercel の Audit Logs (監査ログ) について、エクスポート方法の案内、および、参考としてログの内容の例を紹介します。実際にエクスポートされた CSV ファイルの確認結果を踏まえ紹介します。

Vercel とは

Vercel は フロントエンドアプリケーションや API をホスティングできるクラウドプラットフォームです。 Git 連携やプレビュー環境、 Edge 機能を備えた、開発者向けの SaaS です。

Audit Logs とは

Vercel の Audit Logs は、チームメンバーが Vercel 上で行った操作を記録し、誰が何をいつ実行したかを追跡できる監査証跡を提供する機能です。Team の Owner ロールを持つメンバーだけがアクセスできます。 監査ログは最大 90 日分が保持され、設定変更やメンバー操作の履歴をインシデント対応や権限管理、コンプライアンス対応の根拠として利用できます。

対象読者

  • Vercel の操作履歴をざっくり把握しておきたいエンジニア
  • セキュリティやコンプライアンスの観点から誰が何をしたか確認したい管理者
  • Audit Logs を既存のログ基盤や SIEM に連携したいと考えている担当者

参考

Audit Logs の取得

ロールの確認

Settings > Members > Team Members で自分のロールが Owner であることを確認します。

ロールの確認

Audit Logs のエクスポート

Settings > Security & Privacy > Audit Log で Export CSV を選択します。

Export CSV

Audit Logs の内容

実際にエクスポートした CSV の内容をざっくりと紹介します。

CSV 全体の構造

今回の検証でエクスポートした CSV ファイルの例は以下のようなものになります。

timestamp,action,actor_vercel_id,actor_name,actor_email,location,user_agent,previous,next
2025-11-27T06:48:32.605Z,team.member.role.updated,user-1,user-a,user-a@example.com,203.0.113.10,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36","{""user"":{""id"":""user-2"",""username"":""user-b"",""email"":""user-b@example.com""},""team"":{""id"":""team-1"",""members"":[{""uid"":""user-2"",""role"":""MEMBER""}]}}","{""directory"":{""id"":""dir-1""},""team"":{""id"":""team-1"",""members"":[{""uid"":""user-2"",""role"":""OWNER""}]}}"
2025-11-06T04:02:51.748Z,team.member.joined,user-3,user-c,user-c@example.com,203.0.113.11,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36","{""team"":{""id"":""team-1"",""members"":[{""uid"":""user-3"",""role"":""MEMBER"",""teamRoles"":[""MEMBER""],""confirmed"":false,""updatedAt"":1234567890123,""createdAt"":1234567890123}]}}","{""team"":{""id"":""team-1"",""members"":[{""uid"":""user-3"",""role"":""MEMBER"",""teamRoles"":[""MEMBER""],""confirmed"":true,""updatedAt"":1234567890123,""createdAt"":1234567890123}]}}"
2025-11-06T04:02:12.485Z,team.member.added,user-1,user-a,user-a@example.com,203.0.113.10,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",{},"{""directory"":{""id"":""dir-1""},""user"":{""id"":""user-3"",""username"":""user-c"",""email"":""user-c@example.com""},""invite"":{""id"":""invite-1"",""email"":""user-c@example.com"",""role"":""MEMBER""}}"
2025-11-03T12:28:31.475Z,project.transfer_in.completed,system,system,,unknown,unknown,"{""user"":{""id"":""void""},""team"":{""id"":""team-2"",""slug"":""team-slug-2""},""project"":{""id"":""project-1"",""name"":""project-a""}}","{""user"":{""id"":""void""},""team"":{""id"":""team-1"",""slug"":""team-slug-1""},""project"":{""id"":""project-1"",""name"":""project-a""}}"
2025-11-03T11:46:19.593Z,integration.updated,user-1,user-a,user-a@example.com,203.0.113.10,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36","{""installation"":{""id"":""install-1"",""projects"":[""project-2""]},""integration"":{""id"":""integration-1"",""name"":""Slack"",""slug"":""slack""}}","{""installation"":{""id"":""install-1"",""projects"":[""project-2"",""project-3""]},""integration"":{""id"":""integration-1"",""name"":""Slack"",""slug"":""slack""}}"
2025-11-03T11:35:55.469Z,integration.updated,user-1,user-a,user-a@example.com,203.0.113.10,"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36","{""installation"":{""id"":""install-1"",""projects"":[""project-2"",""project-3"",""project-4"",""project-5"",""project-6"",""project-7""]},""integration"":{""id"":""integration-1"",""name"":""Slack"",""slug"":""slack""}}","{""installation"":{""id"":""install-1"",""projects"":[""project-2""]},""integration"":{""id"":""integration-1"",""name"":""Slack"",""slug"":""slack""}}"

カラム構成は下記のようになっていました。

  • timestamp : イベントが発生した日時
  • action : 発生した操作の種類 (例 : alias.created, team.member.added など)
  • actor_vercel_id : 操作を行ったユーザーの Vercel 内部 ID
  • actor_name : 操作を行ったユーザーのアカウント名
  • actor_email : 操作を行ったユーザーのメールアドレス
  • location : 操作時のクライアント IP アドレス
  • user_agent : ブラウザや OS などの User-Agent 文字列
  • previous : 操作対象リソースの変更前状態を表す JSON
  • next : 操作対象リソースの変更後状態を表す JSON

上のカラムで「いつ・誰が・どこから・どのアクションを実行したか」が分かります。さらに previousnext を比較すると、設定やリソースがどのように変わったかを詳細に追跡できます。

action の内容

action カラムを確認すると、主に次のようなカテゴリのイベントが含まれていました。

  • エイリアス関連 : alias.created
  • チームメンバー管理 : team.member.addedteam.member.joinedteam.member.role.updatedteam.member.deleted
  • プロジェクト設定 :
    • パスワード保護 : project.password_protection.updatedproject.password_protection.enabledproject.password_protection.disabled
    • プロジェクト削除 : project.deleted
    • メンバー管理 : project.member.addedproject.member.removed
    • 移管 : project.transfer_in.completed
    • Web Analytics : project.web-analytics.enabled
  • アクセスグループ関連 : access_group.createdaccess_group.updatedaccess_group.deletedaccess_group.member.addedaccess_group.project.addedaccess_group.project.updated
  • インテグレーション関連 : integration.installedintegration.updated
  • デプロイ関連 : deployment.deleteddeployment.pruned
  • 観測性関連 : observability.enabled
  • 監査ログ自体の操作 : auditlog.export.requestedauditlog.export.downloaded

previous と next の内容

previousnext には、対象リソースの状態が JSON で保存されています。これにより「どのフィールドが、どの値からどの値へ変わったか」を機械的に追跡できます。

いくつか代表的な例を挙げます。

  • project.password_protection.updated

    • previous には変更前のパスワード保護設定、 next には変更後の設定が記録されていました。
    • 例として、保護対象の deployment type が all から all_except_custom_domains に変わるケースがあり、プレビューデプロイを中心とした保護へ切り替えたことが読み取れました。
  • access_group.*

    • アクセスグループの作成や更新イベントでは、 previousnext の差分から、対象となるメンバーやプロジェクトの追加・削除が分かるようになっていました。
    • 条件付きアクセスや SSO と組み合わせている場合、このログを使うことで「いつどのグループに誰を入れたか」を確認できます。
  • alias.created

    • next に新しい alias と、それが紐づく deployment の情報が記録されていました。
    • 実運用では「いつ本番ドメインをどのデプロイに切り替えたか」を追跡する根拠として使えます。
  • auditlog.export.requestedauditlog.export.downloaded

    • Audit Logs エクスポートの要求と、実際にダウンロードされたタイミングがそれぞれ記録されていました。
    • 監査ログそのものへのアクセスも監査できるため、「誰が監査ログを閲覧したか」を残したい場合に有用です。

previousnext の JSON 差分を見ることで、設定変更の内容と意図をかなり具体的に追いかけられます。

まとめ

Vercel の Audit Logs は、チーム内で行われた設定変更やメンバー管理、ドメイン操作などを、 actor 情報と差分付きで追跡できる仕組みです。 CSV としてエクスポートしておくと、トラブル調査から監査対応まで、後から必要になったときに根拠を示しやすくなります。

この記事をシェアする

FacebookHatena blogX

関連記事