クラウドのIAMユーザーのアクセスキーの最終利用日を毎週取得し、長く使われていないキーの持ち主に確認を送って、無効化の候補をまとめる
AWSの認証情報レポートを毎週取り、長く使われていないアクセスキーを拾います。エージェントが持ち主を調べて確認を送り、回答と照らして無効化の候補を情報システムの担当者にまとめます。
- 生成AI
- ChatGPT/Claude/Gemini
- 連携・自動化
- Make/n8n/Power Automate/Zapier
- 対象業界
- EC/IT・SaaS/広告/金融
- 対象部門
- 情報システム
- 対象業務
- 内容確認・チェック/台帳・マスタ管理
- 主な課題
- 人手が足りない/属人化している/期限・対応漏れが起きる
- AIで行う処理
- エージェント
- 主な効果
- 対応スピード向上/属人化解消/工数削減
- 導入難易度
- ★★★★☆
- 実装レベル
- 本格構成
- 費用感
- API連携(中)
- 人間の確認
- 条件付き
01導入前 / 導入後の業務フロー
- 月初に、12のアカウントへ順にサインインし、IAMのコンソールで認証情報レポートをダウンロードする
- CSVを1つの表にまとめ、アクセスキーの最終利用日が90日より前のもの、一度も使われていないものに印を付ける
- IAMユーザーの名前、作成日、最後に使われたサービスを見て、持ち主の見当を付ける
- 見当が付かなければ、そのアカウントを使うチームのチャンネルで「このユーザーに心当たりのある方」と尋ねる
- 持ち主が分かれば、本人にSlackで「まだ使うか」を聞く。返事が無ければ数日おきに催促する
- 不要と返ってきたキーを、担当者がコンソールで無効化し、記録の表に書く
- 無効化して1か月何も起きなければ、削除する
- 自動毎週月曜の朝、ワークフローが12のアカウントで認証情報レポートの作成を頼み、できたレポートを取得する
- 自動レポートのCSVを読み、90日より前に使われたキーと一度も使われていないキーを拾う。キーが3本以上のユーザーは別に一覧で全キーを取る
- 自動拾ったキーを確認の記録と突き合わせ、新しく拾ったもの、確認中のもの、回答済みのものに分ける
- 自動エージェントが、新しく拾ったキーと期限が過ぎた確認中のキーについて、タグ・社員名簿・過去の記録を引いて、誰に聞くかを決める
- 自動エージェントが確認の文面を作り、ワークフローが持ち主へSlackで送る
- 人持ち主が「止めてよい」「まだ使う」を Slack のボタンで答える
- 自動エージェントが回答と使われ方を照らして、無効化の候補を理由付きでまとめる
- 人情報システムの担当者が候補を確かめ、無効化の道具の呼び出しを Slack で承認する
- 自動承認されたキーだけを無効化し、結果を記録する
各工程の詳しい説明を読む
- 月初に、12のアカウントへ順にサインインし、IAMのコンソールで認証情報レポートをダウンロードする
- CSVを1つの表にまとめ、アクセスキーの最終利用日が90日より前のもの、一度も使われていないものに印を付ける
- IAMユーザーの名前、作成日、最後に使われたサービスを見て、持ち主の見当を付ける
- 見当が付かなければ、そのアカウントを使うチームのチャンネルで「このユーザーに心当たりのある方」と尋ねる
- 持ち主が分かれば、本人にSlackで「まだ使うか」を聞く。返事が無ければ数日おきに催促する
- 不要と返ってきたキーを、担当者がコンソールで無効化し、記録の表に書く
- 無効化して1か月何も起きなければ、削除する
(a)持ち主探しに時間が消える。 IAMユーザーの名前が ci-deploy や test-user2 だと、名前からは誰のものか分かりません。チャンネルで尋ねても、数日誰も答えないことがあります。 その間、キーは有効なまま残ります。
(b)異動・退職で持ち主が途切れる。 作った人がすでに別の部署にいる、退職している、ということがあります。本人に聞いても「もう分からない」と返り、誰に聞き直すかを担当者がその場で考えます。
(c)返事の追いかけが漏れる。 60件を2名で追いかけると、どのキーに誰へいつ聞いたかが、担当者のSlackの履歴にしか残りません。 担当者が休むと、催促が止まり、キーは翌月へ持ち越されます。
(d)レポートの見落としがある。 認証情報レポートは、1ユーザーにつき最初の2本のアクセスキーしか載りません。3本目以降を持つユーザーは、レポートだけでは漏れます。
- 【自動】 毎週月曜の朝、ワークフローが12のアカウントで認証情報レポートの作成を頼み、できたレポートを取得する
- 【自動】 レポートのCSVを読み、90日より前に使われたキーと一度も使われていないキーを拾う。キーが3本以上のユーザーは別に一覧で全キーを取る
- 【自動】 拾ったキーを確認の記録と突き合わせ、新しく拾ったもの、確認中のもの、回答済みのものに分ける
- 【自動】 エージェントが、新しく拾ったキーと期限が過ぎた確認中のキーについて、タグ・社員名簿・過去の記録を引いて、誰に聞くかを決める
- 【自動】 エージェントが確認の文面を作り、ワークフローが持ち主へSlackで送る
- 【人】 持ち主が「止めてよい」「まだ使う」を Slack のボタンで答える
- 【自動】 エージェントが回答と使われ方を照らして、無効化の候補を理由付きでまとめる
- 【人】 情報システムの担当者が候補を確かめ、無効化の道具の呼び出しを Slack で承認する
- 【自動】 承認されたキーだけを無効化し、結果を記録する
8番目が、この設計の分かれ目です。 エージェントが出すのは、誰に聞いたか、何と返ってきたか、なぜ止めてよいと考えたかまでです。キーを止めるかどうかは、担当者が承認のボタンで決めます。
6番目で持ち主に答えてもらうのは、年に一度の処理のためのキーかもしれないからです。
02今回想定するシステム構成
12のAWSアカウント(各アカウントに読み取りと無効化の権限を持つロール) │ ▼【トリガー】Schedule Trigger(毎週月曜 8時、Asia/Tokyo) n8n のワークフロー ├──▶ HTTP Request(AWSの認証情報)で認証情報レポートの作成と取得 ├──▶ XML ノード → Convert to File(Base64 から CSV のファイルへ) ├──▶ Extract From File(CSV を行に分ける) ├──▶ 90日の判定と、確認の記録との突き合わせ ▼ AI Agent ノード(Tools Agent)+ Anthropic Chat Model │ キーごとに道具を選んで使う │ ・IAMユーザーのタグを引く ・キーの一覧と最終利用を引く │ ・社員名簿を引く ・過去の確認の記録を引く │ ・キーを無効化する(Slack での人の承認をはさむ) │ Structured Output Parser で決まった形のJSONを返す ▼ 確認の記録(スプレッドシート)→ Slack で持ち主へ確認、担当者へ候補の通知 ▼【人】持ち主の回答・担当者の承認
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| ワークフロー | n8n | Make、Zapier、Power Automate |
| 生成AI | Claude API(n8n の Anthropic Chat Model ノード) | OpenAI API、Gemini API |
| 連携 | AWS IAM のAPI(n8n の HTTP Request ノード) | IAM Access Analyzer の未使用アクセスの検出 |
新しく足すのは、n8n のワークフロー、各アカウントのロール、確認の記録の表だけです。 IAMユーザーには、持ち主を表すタグ(例:owner に社員のメールアドレス)を付ける運用を、この構成と同時に始めます。
n8n には AWS IAM のノードがありますが、ユーザーとグループの操作に限られます。 公式のページでは、ユーザーの作成・取得・更新とグループの操作が並び、アクセスキーと認証情報レポートの操作はありません。 そこで、HTTP Request ノードの Authentication を Predefined Credential Type にして AWS の認証情報を選び、IAMのAPIを直接呼びます。ページ自体が、載っていない操作にはこの方法を案内しています。
認証情報は、アカウントごとに AWS (Assume Role) で作ります。 n8n の AWS の認証情報には、アクセスキーで認証する方式と、STS でロールを引き受ける方式があります。長期のアクセスキーを減らすための仕組みが、長期のキーを12本抱えては本末転倒です。 ロールの信頼ポリシーには External ID を設定し、認証情報ごとに別の値にします。
代替の道として、IAM Access Analyzer の未使用アクセスの検出があります。 使われていないIAMユーザーのアクセスキーとパスワードを検出の種類に持ちますが、分析するロールとユーザーの数に応じた料金がかかります。
03どうやって実装するのか
処理の起点を決める
毎週月曜の朝8時に、Schedule Trigger で動かします。 Schedule Trigger はワークフローのタイムゾーンを使い、無ければインスタンスのタイムゾーンを使います。セルフホストの既定は America/New York なので、ワークフローのタイムゾーンを Asia/Tokyo にします。 保存して公開しないと動きません。
月1回ではなく週1回にしているのは、確認の追いかけのためです。 新しく90日を超えるキーは月に数十本でも、返事の無い確認を1週間で拾い直せば、聞く相手の変更が月をまたがずに済みます。 週ごとに、新しく拾ったキーへの確認と、期限の過ぎた確認の催促を同じ実行で行います。
持ち主の回答は、確認を送った別の実行が受け取ります。月曜の実行は送るところまでで終わり、回答は届いた時点で記録に書かれます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 認証情報レポート | ユーザー名、ARN、作成日時、アクセスキー1・2の有効/無効、作成・更新日時、最終利用日時、最終利用のリージョンとサービス | 各アカウントのIAM |
| キーの一覧と最終利用 | アクセスキーID、状態、最終利用日時(3本目以降を持つユーザーと、無効化に要るID) | 各アカウントのIAM |
| IAMユーザーのタグ | owner、team、purpose などのキーと値 | 各アカウントのIAM |
| 社員名簿 | メールアドレス、氏名、所属、上長、在籍の状態 | 人事のシステムから毎日書き出す表 |
| 確認の記録 | キーごとに、聞いた相手、送った日時、回答、催促の回数、無効化の日時 | スプレッドシート |
質を決めるのは、タグと社員名簿です。 タグが無ければ、エージェントはユーザー名と使われ方から推し量るしかなく、推し量った持ち主に確認を送ることになります。 推し量りで送った確認は、相手に「心当たりが無い」と返されて1週間を失います。
認証情報レポートには、アクセスキーIDが載りません。 載るのは1本目・2本目という番号と状態だけです。無効化には ID が要るので、候補になったユーザーについて別にキーの一覧を取ります。
データの取得方法を決める
レポートは、作成の依頼と取得の2回に分けて呼びます。 HTTP Request ノードで、IAMのAPIの GenerateCredentialReport を呼んだあと、GetCredentialReport で取ります。レポートは4時間に1回まで作られ、4時間以内に作られたものがあれば、それが返ります。 週1回の実行なら、毎回新しいレポートになります。
取得したときにまだ作成中なら、ReportInProgress が返ります。 Wait ノードで数十秒待ってから取り直し、3回続けば「取得できず」として記録します。レポートが古くなっていれば ReportExpired、無ければ ReportNotPresent が返るので、どちらも作成の依頼からやり直します。
返ってくるレポートは Base64 で符号化されたCSVです。 IAMのAPIの応答はXMLなので、XML ノードで JSON にし、Content を Convert to File の Move Base64 String to File でCSVのファイルにして、Extract From File の Extract From CSV で行に分けます。1行が1ユーザーで、2本のキーが同じ行に並びます。 ここでキーごとの行に組み替えます。
タグは ListUserTags、キーの一覧は ListAccessKeys、最終利用は GetAccessKeyLastUsed で取ります。 これらはエージェントが道具として呼ぶサブワークフローにします。ListUserTags は既定で100件まで返し、IsTruncated が true なら Marker で続きを取ります。
AIへ渡す前に整形する
- キーごとの行に組み替える … レポートの1行を、アクセスキー1とアクセスキー2の2行に分けます。状態が無効(
access_key_N_activeが FALSE)のキーは対象から外します - 日付の種類を分ける … 最終利用日時が日付なら「最後に使われた日」、
N/Aなら「一度も使われていない」と分けます。一度も使われていないキーは、作成日時から何日たったかで見ます - 90日の判定をする … 最後に使われた日、または作成日時から90日を超えたものを拾います
- 3本目以降を持つユーザーを分ける …
additional_credentials_infoに値があるユーザーは、キーの一覧を別に取り、すべてのキーで同じ判定をします - 確認の記録と突き合わせる … アカウントID、ユーザー名、キーの番号で記録を引き、新しく拾ったもの、確認中のもの、回答済みのもの、除外の届けがあるものに分けます
- 除外を外す … 「年1回の処理で使う」と回答があり、次の確認日を記録したキーは、その日まで渡しません
2番目を省くと、作ったばかりのキーまで拾います。 レポートでは、一度も使われていないキーの最終利用日時は N/A になります。N/A をそのまま「古い」と扱うと、先週作ったキーに確認が飛びます。
AIに処理させる
させるのは、キーごとに「誰に聞くか」を決め、確認の文面を作り、回答が来たら無効化の候補とその理由をまとめることです。
| 手順 | エージェントがすること | 使う道具 |
|---|---|---|
| 1 | IAMユーザーのタグから持ち主の候補を探す | タグを引く |
| 2 | 候補を社員名簿で引き、在籍・所属・上長を確かめる | 社員名簿を引く |
| 3 | 同じユーザーの過去の確認と回答を確かめる | 確認の記録を引く |
| 4 | 聞く相手(本人/上長/チーム/情報システム)を決め、確認の文面を作る | なし |
| 5 | 回答と最終利用のサービスを照らして、無効化の候補と理由をまとめる | キーの一覧と最終利用を引く |
| 6 | 担当者の承認を得て、無効化を実行する | キーを無効化する(承認をはさむ) |
手順4の聞く相手は、次の順で決めさせます。 タグの持ち主が在籍していれば本人、退職・休職していれば名簿の上長、タグが無くチームのタグだけあればチームのチャンネル、どれも無ければ情報システムが自分で調べる(investigate)。手がかりの無いキーを、それらしい人に送らせないためです。
手順6の無効化の道具には、n8n の人の確認をはさみます。 AI Agent の道具の接続口で Human review を設定し、承認の経路を Slack にします。承認されれば、AIが指定した入力のまま道具が動き、却下されれば動かずにエージェントへ却下が伝わります。
| させないこと | 理由 |
|---|---|
| 承認なしに無効化する | 止めた瞬間に連携が止まる恐れがある |
| キーの削除 | 無効化なら戻せるが、削除は戻せない |
| 持ち主を推し量って本人として扱う | 外れると確認の1週間を失う |
| 回答の無いキーを「不要」とみなす | 返事が無いことは、使っていないことではない |
| シークレットアクセスキーを扱う | 判断に要らない。道具からも返さない |
4行目がいちばん起きやすい失敗です。 催促を2回しても返事が無いと、エージェントは「不要と判断」と書きたがります。返事が無いキーは、聞く相手を上長に替えるか、情報システムへ回すかのどちらかにさせます。
指示内容を固定する
あなたはSaaS企業の情報システム部で、長く使われていないAWSの
アクセスキーについて、持ち主を探して確認し、無効化の候補を
まとめる担当です。道具で確かめた事実だけで判断してください。
【入力】
- キー:{account_id} / {user_name} / キー{key_no}
- 作成日時・最終利用日時・最終利用のサービス:{usage}
- 確認の状態:{status}(new / waiting / answered)
【使える道具】
- get_user_tags:アカウントIDとユーザー名で、タグを返す
- get_employee:メールアドレスで、在籍・所属・上長を返す
- get_history:アカウントIDとユーザー名で、過去の確認を返す
- get_key_usage:キーIDの一覧と最終利用を返す
- deactivate_key:キーを無効化する(担当者の承認が要る)
【聞く相手の決め方】
1. owner タグの人が在籍していれば owner
2. owner が退職・休職なら、名簿の上長を manager
3. owner タグが無く team タグがあれば team
4. どれも無ければ investigate(送らない)
【厳守事項】
- タグや名簿で確かめられない人を持ち主として扱わないでください。
ユーザー名から人の名前を推し量らないでください。
- 返事が無いことを「不要」とみなさないでください。
催促が2回を超えたら、聞く相手を替えるか investigate に
してください。
- deactivate_key は、回答が「止めてよい」で、最終利用から
90日を超えているキーにだけ使ってください。
却下されたら、理由を記録し、もう一度呼ばないでください。
- キーを削除しないでください。削除の道具はありません。
- 確認の文面には、アカウント名、ユーザー名、最後に使われた日と
サービス、回答の期限を書いてください。キーIDは末尾4文字だけ。
- 分からない項目は「不明」と書いてください。
「ユーザー名から人の名前を推し量らない」を明記しないと、tanaka-test を田中さんのキーとして扱います。 社内に田中さんは何人もいます。禁じるのは、名前の一致を根拠にすることそのものです。
「却下されたら、もう一度呼ばない」も明記します。 却下を受けたエージェントは、理由を変えて同じ道具を呼び直すことがあります。担当者に同じ承認が何度も届くと、承認そのものが流し見になります。
出力形式を固定する
Structured Output Parser で、次の形のJSONを受け取ります。
{
"account_id": "123456789012",
"user_name": "ci-deploy",
"key_no": 1,
"key_id_suffix": "7QXA",
"last_used": "2026-05-02",
"last_used_service": "s3",
"never_used": false,
"owner": {
"email": "",
"source": "tag | none",
"employment": "active | left | leave | unknown"
},
"ask_to": "owner | manager | team | investigate",
"ask_to_email": "",
"message_draft": "",
"answer": "stop_ok | still_used | no_answer | not_asked",
"proposal": "deactivate | keep | ask_again | investigate",
"reason": "",
"needs_human": false
}
1つ目の理由は、ask_to と owner.source で、送る前に根拠が分かることです。 タグから決めたのか、手がかりが無かったのかが項目に出るので、investigate のものだけを担当者が先に片付けられます。
2つ目は、answer と proposal を分けて持てることです。 回答は持ち主の言葉、提案はエージェントの判断です。「止めてよい」と返ってきても、先週使われていれば ask_again にする、といった食い違いが一覧で見えます。
3つ目は、キーIDを末尾4文字だけにしていることです。 無効化の道具は、ワークフローの側で記録から完全なIDを引いて渡します。Slackの文面にIDの全体が残りません。
システムへ連携する
| つなぎ先 | 方式 | 内容 |
|---|---|---|
| 各アカウントのIAM | HTTP Request ノード(AWS の認証情報) | レポートの作成と取得、タグ・キーの一覧・最終利用、無効化 |
| Claude API | Anthropic Chat Model ノード | 聞く相手の判断、文面、候補のまとめ |
| 社員名簿 | Google Sheets ノード | 在籍・所属・上長を引く |
| 確認の記録 | Google Sheets ノード | キーごとの確認の状態を読み書きする |
| Slack | Slack ノード(Send and Wait for Response) | 持ち主への確認と、無効化の承認 |
Slack で承認を受けるには、n8n が公開されたHTTPSで届く場所にある必要があります。 Slack のアプリで Interactivity を有効にし、Request URL を https://<n8nのホスト>/webhook-waiting-slack にして、署名のシークレットを認証情報に入れます。Restrict Who Can Approve に情報システムの2名だけを入れます。 空のままだと、メッセージを見られる人なら誰でも承認できます。
Capture Who Responded を有効にすると、誰が承認したかが出力に残ります。 無効化の記録には、この承認者を必ず書きます。
人が確認する
人が見るのは、proposal が deactivate と investigate のもの、needs_human が立ったものです。 keep と ask_again は件数を流し見ます。
investigateを先に見る … 持ち主の手がかりが無いキーです。最後に使われたサービスとリージョンから、どのシステムのキーかを自分で調べますdeactivateの根拠を確かめる … 回答者が持ち主本人か上長か、最終利用が90日を超えているかを見ます- 無効化を承認する … Slack に届く承認の依頼で、道具の名前と入力(アカウント、ユーザー、キーの末尾)を確かめて承認します
- 無効化から1か月後に削除を決める … 何も止まらなかったことを確かめ、削除は担当者が自分で行います
2番目で、回答者が上長だったものは特に丁寧に見ます。 上長は、部下が作ったキーの使われ方を知らないことが多く、「たぶん要らない」で止めてよいと答えがちです。
目標は、60件をならして1件8分です。 investigate は30分近くかかり、keep は数十秒で終わります。
例外に対処する
| 起きること | 対応 |
|---|---|
| レポートが作成中 | ReportInProgress。数十秒待って取り直し、3回で「取得できず」 |
| レポートが古い・無い | ReportExpired/ReportNotPresent。作成の依頼からやり直す |
| ロールを引き受けられない | そのアカウントを「取得できず」として、毎回の通知に名前を出す |
| キーが3本以上 | レポートに載らない分をキーの一覧で取る |
| 持ち主のタグの人が名簿に無い | 退職か入力の誤り。上長が引けなければ investigate |
| 回答が「まだ使う」なのに長く使われていない | keep にし、次の確認日を回答者に書いてもらう |
| 回答が「止めてよい」なのに最近使われた | ask_again。別の人が使っている恐れを担当者へ |
| 無効化の承認が却下された | 理由を記録し、そのキーは翌週の対象から外す |
| 無効化のあとで問い合わせが来た | 担当者が UpdateAccessKey で Active に戻す。記録に残す |
| Claude API が応答しない | キーを未処理のまま残し、次の実行で再び渡す |
3行目を黙って飛ばすと、そのアカウントだけ見回りが止まります。 ロールの信頼ポリシーが変えられた、アカウントが組織から外れた、という理由で起きます。取れなかったアカウントは、件数が0件のときでも毎回の通知に出します。
8行目と9行目のために、無効化と削除を分けています。 UpdateAccessKey は状態を Active と Inactive の間で変える操作なので、無効化なら戻せます。
記録を残す
- 実行の日時と、アカウントごとのレポートの作成日時(
GeneratedTime)と取得の結果 - 拾ったキーと、拾った理由(最終利用日、または一度も使われていないこと)
- エージェントの入力と、道具の呼び出しの記録(どのタグ、どの名簿の行を見たか)
- 送った確認の文面、送り先、送った日時、催促の回数
- 回答と回答者、
proposalとreason - 無効化の承認者と承認の日時、無効化の実行の結果
3つ目は、聞く相手の決め方を見直すために残します。 Tools Agent の Return Intermediate Steps を有効にすると、途中の手順を出力に含められます。
最後の行は、監査のときに問われる記録です。 誰の判断で、いつ、どのキーを止めたかが、Slack の承認と結び付いて残ります。
04実装レベルの3段階
半自動化で、第4章の①がほぼ無くなります。 12のアカウントにサインインしてCSVをまとめる手間が消えます。本格構成で②〜④が確認の作業に変わり、この段階が本記事の想定です。 差が大きいのは、②の持ち主探しと③の追いかけが、1件ずつの手作業だからです。 段階を飛ばさないでください。 半自動化を1か月回すと、タグの無いユーザーと、ロールを引き受けられないアカウントが分かります。そこを片付けてからエージェントを足します。
05工数削減シミュレーション
導入後 60件 × 8分 ÷ 60 = 8 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 複数のAWSアカウントを持ち、開発・検証・連携のためにIAMユーザーのアクセスキーが各チームで発行されてきたIT・SaaS企業、金融、EC、広告会社。長く使われていないキーを見つけても、持ち主が誰か、まだ使う予定があるかを確かめる作業が情報システムの担当者の手作業になっている場合。IAMユーザーに持ち主のタグを付ける運用を始められる場合。
- AWSアカウントが1つで、アクセスキーが数本しかない場合。すでにIAMユーザーの長期のアクセスキーを使わない運用(一時的な認証情報への切り替え)を終えている場合。n8n を社外に公開できる場所で動かせず、Slack からの承認の受け取りができない場合。なお、どのキーを止めてよいかの最終判断と、止めたことで業務のシステムが止まったときの責任は、この構成では代替できません。
07最小構成で試す方法
- AWSアカウントを1つ選び、IAMのコンソールで認証情報レポートをダウンロードする
- 表計算のソフトで、アクセスキーの最終利用日が90日より前のもの、
N/Aのものに印を付ける - 印を付けたユーザーのタグを、コンソールで確かめて書き写す
- 手元のAIサービスに、レポートの該当行(キーの番号、日付、サービス)、タグ、社員名簿の該当行を貼る
- 「誰に確認を送るべきかを、タグと名簿で確かめられる事実だけで決めてください。決められなければ investigate としてください」と指示する
- 担当者が自分で決めた送り先と見比べる
1つのアカウントは必ず試してください。 ワークフローを組む前に、「タグと名簿から聞く相手が決められるのか」を確かめます。
| 出てきた内容 | 判断 |
|---|---|
| 担当者と同じ送り先を選んだ | ワークフローの構築に進む |
investigate が半分を超えた | タグの整備が先。 AIの問題ではない |
| ユーザー名から持ち主を推し量った | 指示の書き方で直る。構成は有効 |
2行目が出ることは珍しくありません。 失敗ではなく、持ち主探しに時間がかかっていた理由が分かったということです。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 先週作ったキーに確認が飛ぶ | N/A は一度も使われていないこと。作成日時から日数を数える |
| 3本目のキーが漏れる | レポートは最初の2本だけ。additional_credentials_info を見てキーの一覧を取る |
| 無効化しようとしてIDが無い | レポートにIDは載らない。キーの一覧でIDを取る |
| ユーザー名から持ち主を決める | タグと名簿で確かめられない人を持ち主にしない |
| 返事が無いキーを止める | 返事が無いことを不要とみなさない。相手を替える |
| 誰でも承認できてしまう | Restrict Who Can Approve に担当者だけを入れる |
| 却下のあとに同じ承認が何度も届く | 却下されたら同じキーで呼び直さないと指示する |
| n8n の長期のキーが増える | AWS (Assume Role) で認証する |
| 1つのアカウントが黙って抜ける | 取得できなかったアカウントを毎回の通知に出す |
上の3行が、拾い出しの失敗のほとんどです。 どれも認証情報レポートの仕様の読み違いから起きます。
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: IAMユーザーの名前、ARN、キーの状態と使われ方、タグ、社員の氏名・所属・上長・在籍の状態、確認の回答です。シークレットアクセスキーは扱いません。
- 無効化の権限を持つロールを絞る … 権限はレポートの作成と取得、タグとキーの一覧と最終利用の読み取り、
UpdateAccessKeyだけにします。削除の権限は与えません - 承認できる人を絞る … Restrict Who Can Approve に情報システムの担当者だけを入れ、Capture Who Responded で承認者を残します
- AIへ渡す範囲を絞る … 渡すのはキーの番号と日付、タグ、名簿の該当者の行だけです。名簿の全体や、キーIDの全体を渡しません
- Slack の文面にIDの全体を載せない … 末尾4文字にとどめ、完全なIDはワークフローの側で記録から引きます
- 在籍の状態を扱う … 退職・休職は個人の情報です。
employmentは担当者だけが見る記録に置き、確認の文面には書きません
誤りが起きた場合のリスクは、使われているキーを止めて連携を止めることと、使われていないキーを残し続けることの2つです。 前者は回答と最終利用の照合と人の承認で、後者は週ごとの追いかけと investigate の調査で防ぎます。
10まず何から始めるか
1週目:owner タグを付ける
アクセスキーの付いたIAMユーザーに、持ち主のメールアドレスを owner タグで付けます。 全部を一度に付ける必要はありません。本番のアカウントから始めます。
2週目:1つのアカウントで試す
レポートを手で落とし、手元のAIサービスに送り先を決めさせます。ユーザー名から推し量っていないか、investigate がどれだけ出るかを最優先で見ます。
3週目:レポートの取得と拾い出しをつなぐ
n8n で12のアカウントのレポートを取り、使われていないキーを記録の表に書き出すところまで作ります。この時点ではエージェントを入れず、拾い出しが合っているかだけを1週間見ます。
4週目:取れないアカウントとタグの無いユーザーを片付ける
ロールを引き受けられなかったアカウント、タグの無いユーザーを洗い出し、ロールを直すかタグを付けます。
2か月目: エージェントを足し、確認の文面と送信までを動かします。無効化の道具はまだつなぎません。 3か月目以降: 無効化の道具を人の承認付きで足し、1件28分が何分になったかを実測します。承認して止めたキーのうち、戻すことになったものが0件であることを確かめた時点で、この構成は完成です。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
レポートは4時間に1回まで作られること。CSVの列と、最終利用が N/A になる場合。最初の2本のキーしか載らないこと | AWS: 認証情報レポート | 2026-10-08 |
| 不要な認証情報の削除・無効化の考え方。ListAccessKeys と GetAccessKeyLastUsed | AWS: 使われていない認証情報を探す | 2026-10-08 |
| レポートが Base64 で返ること。ReportInProgress/ReportExpired/ReportNotPresent | AWS: GetCredentialReport | 2026-10-08 |
| 状態を Active と Inactive の間で変える操作であること | AWS: UpdateAccessKey | 2026-10-08 |
| 既定で100件、IsTruncated と Marker | AWS: ListUserTags | 2026-10-08 |
| 未使用のアクセスキーとパスワードの検出、料金がかかること | AWS: IAM Access Analyzer の検出 | 2026-10-08 |
| ユーザーとグループの操作だけで、他は HTTP Request を使うこと | n8n Docs: AWS IAM | 2026-10-08 |
| AWS (IAM) と AWS (Assume Role)、External ID | n8n Docs: AWS credentials | 2026-10-08 |
| Predefined Credential Type、Response の形式 | n8n Docs: HTTP Request | 2026-10-08 |
| Move Base64 String to File | n8n Docs: Convert to File | 2026-10-08 |
| タイムゾーンの扱いと、公開が要ること | n8n Docs: Schedule Trigger | 2026-10-08 |
| Return Intermediate Steps、Max Iterations | n8n Docs: Tools Agent | 2026-10-08 |
| 道具の呼び出しへの人の確認。承認・却下のときの動き | n8n Docs: Human-in-the-loop for AI tool calls | 2026-10-08 |
| Request URL、Restrict Who Can Approve、Capture Who Responded、公開されたHTTPSが要ること | n8n Docs: Approvals in Slack | 2026-10-08 |
例から作ったスキーマは全項目が必須、$ref が使えないこと | n8n Docs: Structured Output Parser | 2026-10-08 |
どのキーを止めてよいかは、情報システムとキーの持ち主で判断してください。 本記事は上記の公式ページで確認できた範囲だけを扱っています。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-1125)についてのご相談はこちらから。
