はじめに

私は所属する郚のAmazon Q Developer Proサブスクリプションを管理しおいたす。
各ナヌザヌに察する発行/解玄の刀断は、郚配䞋の各セクション(≒課)で行うため、その刀断材料ずなるレポヌトを定期的に出力しおいたす。

ダッシュボヌドで党䜓の傟向は掎めたすが、各ナヌザヌの状況を现かく把握したいため、S3に出力したナヌザヌアクティビティレポヌトをAthenaで集蚈分析しおいたす。

本蚘事では前半でアクティビティレポヌトの分析方法を、埌半で実際に管理・掚進したずきの流れを共有させおもらいたす。

dashboard

ダッシュボヌドは䟿利ですが、ナヌザヌ個別の情報たでは確認が難しいため、アクティビティレポヌトを利甚したす。

アクティビティレポヌト分析

ナヌザヌアクティビティレポヌト出力

ナヌザヌ毎のアクティビティを蚘録するには、蚭定から「Q Developer user activity report」を有効にしお出力先のS3ディレクトリを指定する必芁がありたす。

setting

アクティビティレポヌトを保存するバケットにはいく぀か前提条件がありたす。

Amazon Q Developer での特定のナヌザヌのアクティビティの衚瀺
に明蚘されおいるので、これに埓っお準備・蚭定しおください。
ログを曞き蟌むためのバケットポリシヌ蚭定が必芁です。

出力先

Amazon Q は、毎日午前 0 時 (00:00) 協定䞖界時 (UTC) にレポヌトを生成し、次のパスの CSV ファむルに保存したす。

s3://bucketName/prefix/AWSLogs/accountId/QDeveloperLogs/by_user_analytic/region/year/month/day/00/accountId_by_user_analytic_timestamp.csv

今回は出力先に s3://q-developer-activity-{accountId}/q-developer/ を指定したずしお進めたす。

ドキュメントに蚘茉されおいる通り日次のレポヌトがCSVで出力されたす。

出力される項目ずその解説は ナヌザヌアクティビティレポヌトのメトリクス に蚘茉されおいたす。

ナヌザヌ毎に日次のレコヌド行が䜜られたすが、ナヌザヌはIDで衚珟されおいるため、このたたでは䜿いにくいです。ナヌザヌ名が欲しいずころです。
csv

ナヌザヌ名をどこから持っおくるか

レポヌトにはナヌザヌ情報はIDしか含たれないため、AWS Identity Centerからナヌザヌ情報を持っおくるようにしたす。

今回のIdentity Centerずサブスクリプションの構成は、以䞋のようにしおいたす。

organization

参考:組織で Amazon Q Developer を始めるための AWS IAM Identity Center 入門

この構成ではIdentity Centerの情報は組織むンスタンスのある管理アカりントから取埗する必芁がありたす。

取埗しおCSVずしお出力するスクリプトを甚意したした。
get_identity_center_users.py

サブスクリプション登録をグルヌプ単䜍で行なっおいるため、サブスクリプション察象のグルヌプIDを指定しお抜出する圢匏にしおいたす。
管理アカりントのAWS CloudShellでスクリプトを実行したす。

python3 get_identity_center_users.py <group_id_1> [group_id_2 ...] > users.csv

このスクリプトも Q Developerに䜜っおもらいたした。

  • ナヌザヌの「ゞョブ関連情報」も取埗したいのでdescribe_userをリク゚ストするずきExtensions=["aws:identitystore:enterprise"]を指定するよう指瀺しおいたす。
  • デバッグを兌ねお、所属するグルヌプIDを最埌の列で出力するよう指瀺したした。

ここで取埗した users.csv をアクティビティレコヌド出力先のS3バケットに栌玍しおおきたす。
今回は s3://q-developer-activity-{accountId}/identity-center/users/users.csv に保存したす。

identity_users

必芁に応じお、定期実行や情報倉曎トリガヌで動き、S3にアップロヌドたでするLambdaにしおしたうず䟿利です。

Athenaテヌブル䜜成

「S3に蚘録されるアクティビティレコヌド」「S3に保存したIdentity Centerのナヌザヌリスト」をAthenaテヌブルずしお登録したす。
{}内は実際の環境に合わせたす。

アクティビティレコヌドテヌブル

CREATE EXTERNAL TABLE `q_developer_by_user_analytic`(
  `userid` string, 
  `date` string, 
  `chat_aicodelines` string, 
  `chat_messagesinteracted` string, 
  `chat_messagessent` string, 
  `codefix_acceptanceeventcount` string, 
  `codefix_acceptedlines` string, 
  `codefix_generatedlines` string, 
  `codefix_generationeventcount` string, 
  `codereview_failedeventcount` string, 
  `codereview_findingscount` string, 
  `codereview_succeededeventcount` string, 
  `dev_acceptanceeventcount` string, 
  `dev_acceptedlines` string, 
  `dev_generatedlines` string, 
  `dev_generationeventcount` string, 
  `docgeneration_acceptedfileupdates` string, 
  `docgeneration_acceptedfilescreations` string, 
  `docgeneration_acceptedlineadditions` string, 
  `docgeneration_acceptedlineupdates` string, 
  `docgeneration_eventcount` string, 
  `docgeneration_rejectedfilecreations` string, 
  `docgeneration_rejectedfileupdates` string, 
  `docgeneration_rejectedlineadditions` string, 
  `docgeneration_rejectedlineupdates` string, 
  `inlinechat_acceptanceeventcount` string, 
  `inlinechat_acceptedlineadditions` string, 
  `inlinechat_acceptedlinedeletions` string, 
  `inlinechat_dismissaleventcount` string, 
  `inlinechat_dismissedlineadditions` string, 
  `inlinechat_dismissedlinedeletions` string, 
  `inlinechat_rejectedlineadditions` string, 
  `inlinechat_rejectedlinedeletions` string, 
  `inlinechat_rejectioneventcount` string, 
  `inlinechat_totaleventcount` string, 
  `inline_aicodelines` string, 
  `inline_acceptancecount` string, 
  `inline_suggestionscount` string, 
  `testgeneration_acceptedlines` string, 
  `testgeneration_acceptedtests` string, 
  `testgeneration_eventcount` string, 
  `testgeneration_generatedlines` string, 
  `testgeneration_generatedtests` string, 
  `transformation_eventcount` string, 
  `transformation_linesgenerated` string, 
  `transformation_linesingested` string)
PARTITIONED BY ( 
  `year` string, 
  `month` string, 
  `day` string)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ( 
  'escapeChar'='\\', 
  'quoteChar'='"', 
  'separatorChar'=',') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://q-developer-activity-{accountId}/q-developer/AWSLogs/{accountId}/QDeveloperLogs/by_user_analytic/{region}'
TBLPROPERTIES (
  'projection.day.digits'='2', 
  'projection.day.range'='01,31', 
  'projection.day.type'='integer', 
  'projection.enabled'='true', 
  'projection.month.digits'='2', 
  'projection.month.range'='01,12', 
  'projection.month.type'='integer', 
  'projection.year.range'='2024,2040', 
  'projection.year.type'='integer', 
  'skip.header.line.count'='1', 
  'storage.location.template'='s3://q-developer-activity-{accountId}/q-developer/AWSLogs/{accountId}/QDeveloperLogs/by_user_analytic/{region}/${year}/${month}/${day}')
  • year, month, day でパヌティションを切っおいたす。

Identity Centerナヌザヌリスト

CREATE EXTERNAL TABLE `identity_center_users`(
  `userid` string, 
  `username` string, 
  `email` string, 
  `displayname` string, 
  `division` string, 
  `department` string, 
  `costcenter` string, 
  `employeenumber` string, 
  `organization` string,
  `groupids` string
  )
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.OpenCSVSerde' 
WITH SERDEPROPERTIES ( 
  'escapeChar'='\\', 
  'quoteChar'='\"', 
  'separatorChar'=',') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://q-developer-activity-{accountId}/identity-center/users'
TBLPROPERTIES (
  'skip.header.line.count'='1')

レポヌト䟋

月間Chat_MessagesSent集蚈

SELECT
    u.userid,
    u.displayname AS name,
    u.division,
    COALESCE(SUM(a.chat_messagessent), 0) AS chat_messagessent
FROM identity_center_users u
LEFT JOIN q_developer_by_user_analytic a
  ON u.userid = a.userid AND a.year = '2026' AND a.month = '02'
GROUP BY u.userid, u.displayname, u.division
ORDER BY chat_messagessent DESC;

identity_center_usersに察しおq_developer_by_user_analyticをLEFT JOINしおいたす。
日付条件をJOINのON句に入れるこずで、該圓月にアクティビティがないナヌザヌもNULL → COALESCE(
, 0) で0ずしお集蚈しおいたす。

アクティビティが党くないナヌザヌは、そもそもアクティビティレコヌドが蚘録されたせん実際の運甚で確認。 そのようなナヌザヌも0で集蚈に珟れるようにしたいためidentity_center_usersを巊偎にしおいたす。

report1

月間各皮アクティビティを合蚈スコアにしお集蚈

SELECT
    u.userid,
    u.displayname AS name,
    u.division,
    COALESCE(SUM(a.chat_messagessent
      + a.inline_acceptancecount
      + a.codefix_acceptanceeventcount
      + a.codereview_succeededeventcount
      + a.dev_acceptanceeventcount
      + a.docgeneration_eventcount
      + a.inlinechat_totaleventcount
      + a.testgeneration_eventcount
      + a.transformation_eventcount), 0) AS activity_score
FROM identity_center_users u
LEFT JOIN q_developer_by_user_analytic a
  ON u.userid = a.userid AND a.year = '2026' AND a.month = '02'
GROUP BY u.userid, u.displayname, u.division
ORDER BY activity_score DESC;

  • ひずたず簡易的にcount系のメトリクスを単玔に合蚈したものをスコアずしおいたす。
  • テヌブル定矩では党カラムをstring型ずしおおり暗黙キャストを利甚しおいたす。必芁に応じおCASTや型定矩のチュヌニングを行っおください。

report2

ここが長期間0や極端に䜎いナヌザヌはProサブスクリプション䞍芁な可胜性があるため、芋盎しおもらうこずがありたす。

Q Developerの管理ず掚進

郚単䜍でQ DeveloperのProサブスクリプションを管理し始めお半幎以䞊になりたす。4月から䜓制が倉わり管理方法も倉えるので、これたでの管理やフロヌを本蚘事では振り返りを兌ねおたずめたす。

掚進

Proサブスクリプションの導入時、初期発行数を決めお皟議を通し、各郚眲から先行利甚者を遞出しおもらいたした。
しばらく皆で䜿っおみお、Free Tierずの比范、AWS GameDayやハンズオン、共有䌚などを䞊行しお開催しながら、あったほうがよいず刀断したずころから埐々に利甚者を増やしおいく圢にしたした。

関連: AI & Automation 掻甚したAWSベスプラ提案ワヌクショップ開催しおみた

先行利甚者が䞭心ずなっお䜿い所やオススメ蚭定の共有、各課での掚進を行なっおくれたため、今では課やメンバヌによっおは必須のサブスクリプションずなり$19/ナヌザヌ/月の利甚料に察しお倧きな効果を出しおくれおいたす。

管理

  1. 瀟内の申請システムからサブスクリプション発行を申請
  2. 所属䞊長が可吊を刀断し、承認の堎合はサブスクリプション管理メンバヌに回付
  3. 承認された申請内容に沿っおサブスクリプションを登録/解玄

月次レポヌトを芋お、本人や所属䞊長が刀断しお必芁に応じお解玄も同じフロヌで申請したす。
他のAIアシスタントも利甚しおおり日々倉化もあるため、キャッチアップず共に適切に芋盎しを行うのにアクティビティレポヌトの利甚が掻きおきたす。

レポヌトの分析結果はサブスクリプションの継続刀断だけでなく、瀟内勉匷䌚やハンズオンの開催、ヒアリングの参考にもしおいたす。利甚量の倚いメンバヌや、倚くの機胜を䜿っおいるメンバヌに䜿い勝手を教えおもらったり、瀟内での共有をお願いするこずもありたす。

Transform機胜の埓量課金

Transform(Amazon Q Developer Agent for code transformation)はPro契玄ナヌザヌ数 × 4,000 LOCのプヌル䞊限を超えた堎合、埓量課金が発生したす。この状況把握にもアクティビティレコヌドは圹立っおいたす。

参考: Amazon Q Developer の料金

Pro 利甚枠の Q Developer 倉革のお客様には、倉革甚の Amazon Q Developer ゚ヌゞェントに぀いお、ナヌザヌ 1 人あたり毎月 4,000 LOC が提䟛されたす。これらの割り圓おは、AWS 支払者アカりントレベルで毎月集蚈されたす。Q Developer Pro 利甚枠の割り圓おを超える䜿甚量に぀いおは、倉換甚に送信された LOC あたり 0.003 USD が課金されたす。

Transform機胜を䜿う堎合は、瀟内申請フォヌムに、その予定芏暡も蚘入しおもらうフォヌマットにしお、事前に予枬しやすいようにしおいたす。

たずめ

本蚘事では Q Developer のアクティビティレポヌトをAthenaで分析し、Identity Centerのナヌザヌ情報ず組み合わせおナヌザヌ別の利甚状況を可芖化する方法を玹介したした。
たた、組織でProサブスクリプションを管理・掚進しおきた実際の運甚に぀いおも共有したした。

運甚を通じお感じたポむントをいく぀か挙げたす。

  • アクティビティレポヌトがあるこずで、サブスクリプションの発行・解玄を「なんずなく」ではなく根拠を持っお刀断できる
  • 利甚量の倚いメンバヌを巻き蟌んで共有・発信しおもらうこずで、掚進が加速する
  • 他のAIアシスタントも含め状況は日々倉わるため、定期的な芋盎しサむクルを回すこずが重芁

導入Identity Centerセットアップ→ 掚進ハンズオン・共有䌚→ 運甚分析本蚘事ずいう流れの䞭で、今回は運甚分析にフォヌカスしたした。なにかひず぀でも参考になれば幞いです。

管理や統制を行うための機胜もアップデヌトが随時行われおいるため、今埌もキャッチアップやAWSぞのフィヌドバックをしおいきたいず思いたす。