はじめに
IAM Access Analyzer の「未使用のアクセス」アナライザーは、長期間使われていないアクセスキーや IAM ロールを可視化できる便利なサービスです。しかし、デフォルト設定のまま有効化すると、想定外にコストが高くなる場合があります。
この記事では、以下の 2 点を中心に解説します。
- 注意点: デフォルト設定ではすべての IAM ロールも課金対象になる
- 対策: 目的に不要な IAM ロールをタグで除外
- タグ付けを AWS Config と Guard Custom Policy で自動化する
IAM Access Analyzer「未使用のアクセス」とは
IAM Access Analyzer の「未使用のアクセス」アナライザーは、指定した 追跡期間 内に使用されていない IAM リソースを検出する機能です。
- 検出できるもの: 未使用のアクセスキー、未使用のパスワード、未使用の IAM ロール、未使用のロールへのアクセス許可
- 追跡期間: 指定した日数以内に使用されていない IAM リソースを検出する。アナライザー作成後は変更不可 (変更する場合は再作成が必要)
アクセスキーが一度も使用されていない場合はその旨が明示され、最終利用日が記録されているものは実際に使われていた可能性があることがわかります。削除前に「本当に使われていないか」を確認する手段として有効です。
IAM Access Analyzer「未使用のアクセス」アナライザーの料金
料金計算方法
| 料金表 | 料金 |
|---|---|
| 1 か月あたりに分析された IAM ロールとユーザーの数 | USD 0.20 / 分析された IAM ロールまたはユーザー / 月 |
「IAM ロール または ユーザー」が課金対象になります。デフォルト設定では IAM ロールもすべて分析対象に含まれるため、IAM ロールが多い環境では大幅にコストが上がります。
また、AWS でよくある時間単位の課金ではなく、月内に一度でも分析された IAM ロールとユーザーは USD 0.20/月 の課金が発生することも注意が必要です。
料金試算における前提とするサンプル環境
以降で料金試算をする際はサンプルとして以下の環境を前提とします。
| 項目 | 数量 |
|---|---|
| AWS アカウント数 | 67 |
| IAM ユーザー数 | 440 |
| IAM ロール数 (サービスリンクロールを除く) | 4,121 |
| うち IAM Identity Center の IAM ロール (タグ付け不可) | 587 |
| うちその他の IAM ロール (タグ付け可能) | 3,534 |
サービスリンクロールが「未使用のアクセス」アナライザーの対象にならないことは以下に記載されています。
https://docs.aws.amazon.com/IAM/latest/UserGuide/access-analyzer-concepts.html
Service-linked roles are not analyzed by unused access analyzers.
↓和訳
サービスに関連付けられたロールは、未使用のアクセスアナライザーでは分析されません。
IAM Identity Center の IAM ロールについては後述しますが、AWS の仕様によりタグ付けができないため、タグによる除外の対象外になります。
上記のサンプル環境にデフォルト設定で導入した場合
| リソース種別 | リソース数 | 料金 (USD/月) | 料金 (円/月) |
|---|---|---|---|
| IAM ユーザー | 440 | $88 | 14,029円 |
| IAM ロール | 4,121 | $824 | 145,411円 |
| 合計 | 4,561 | $912 | 159,440円 |
※ USD/円 159円換算
コスト全体の約 90% が IAM ロールによるものです。アクセスキー管理が目的であれば IAM ロールは分析不要なため、ここを削減できれば大幅なコスト削減になります。
対策: IAM ロールをタグで除外する
IAM Access Analyzer「未使用のアクセス」には、特定のタグを持つ IAM リソースを検出対象から除外する機能があります。
そのため今回は以下のタグを除外対象として設定する前提とします。
| タグキー | タグ値 |
|---|---|
UnusedAccessExclude |
true |
注意: IAM Identity Center の IAM ロールはタグ付けができない
AWS の仕様として、IAM Identity Center が管理する IAM ロール (AWSReservedSSO_*) にはタグ付けができません。そのため、これらのロールはタグによる除外の対象外となります。
今回のサンプル環境では 587 件の IAM Identity Center ロールがタグ付け不可のため、除外できるのは残り 3,534 件の IAM ロールになります。
AWS Config と Guard Custom Policy による自動タグ付け
IAM ロールが数千件規模になると手動でのタグ付けは現実的ではありません。そこで AWS Config のカスタムルール を使って、タグが付いていない IAM ロールを自動検出し、自動でタグを付ける仕組みを構築しました。
なぜ Lambda を使わなかったか
AWS Config のカスタムルールは、従来 Lambda 関数 で実装するのが一般的です。しかし Lambda を使うと、ランタイム (Python / Node.js 等) の EOL 対応が定期的に発生し、保守コストがかかります。
今回は Guard Custom Policy という方式を採用しました。Lambda を一切使わず、AWS CloudFormation Guard の DSL でルールを記述する方式です。
Guard ルールの実装
以下のルールで「IAM ロールに必須タグが付いているか」を評価します。
rule iam_role_required_tag when
resourceType == "AWS::IAM::Role"
configuration.roleName != /^AWSServiceRoleFor/
configuration.roleName != /^AWSReservedSSO_/
{
configuration.tags exists
let matching_tags = configuration.tags[*][ key == CONFIG_RULE_PARAMETERS.TagKey ]
%matching_tags !empty << IAM role must have the required tag key >>
%matching_tags[0].value == CONFIG_RULE_PARAMETERS.TagValue << IAM role tag value must match the required value >>
}
※ 以下の変数設定により除外対象のタグを指定しています。
| 変数 | 値 |
|---|---|
| CONFIG_RULE_PARAMETERS.TagKey | UnusedAccessExclude |
| CONFIG_RULE_PARAMETERS.TagValue | true |
Guard ルールでは 2 種類のロールを評価対象から除外しています。それぞれ除外理由が異なります。
AWSServiceRoleFor* (サービスリンクロール)
サービスリンクロールは IAM Access Analyzer が自動的に分析対象外とするため、タグを付ける必要がありません。Guard ルールでの評価もスキップします。
AWSReservedSSO_* (IAM Identity Center の IAM ロール)
前述のとおり、AWS の仕様によりタグ付けが不可です。タグを付けられないロールに対して評価しても修復できないため、Guard ルールの評価対象からも除外します。
その他のポイント:
- タグキー・値はパラメータで指定:
CONFIG_RULE_PARAMETERS経由で外部から渡せるため、CloudFormation パラメータとして管理できる
全体の構成図

AWS Config の料金
AWS Config の料金は「記録料金」と「ルール評価料金」の 2 つで構成されます。
| 料金区分 | 単価 (USD) | 単価 (円) |
|---|---|---|
| 記録方法 : 連続記録 (変更のたびに記録) | $0.003 / 記録 | 0.48円 |
| Config ルール評価 | $0.001 / 評価 | 0.16円 |
※ USD/円 159円換算
記録方法には「日次記録」もあります。こちらは単価が $0.012 です。
IAM ロールのような普段からあまり変更が加えられないようなものは連続記録の方が安くなりやすいため、今回は連続記録を採用しています。
今回の前提条件 (記録方法: 連続、記録対象: IAM ロールのみ、変更回数: 5 回/月) で試算すると以下のとおりです。
| 記録方法 | リソース数 | 記録 月間料金 (USD) | ルール評価 月間料金 (USD) | 合計 (USD) | 合計 (円) |
|---|---|---|---|---|---|
| 連続記録 5回/月 | 3,541 | $53.03 | $106.06 | $159.09 | 25,377円 |
※ 全メンバーアカウント (67) に導入した場合
※ USD/円 159円換算
コスト削減結果
タグ付け可能な IAM ロール (3,534 件) に UnusedAccessExclude: true タグを付与した場合のコスト比較です。
デフォルト
| リソース数 | 月額コスト | |
|---|---|---|
| IAM Access Analyzer | 4,561 | 159,440円 |
タグ付け可能な IAM ロールにタグ付け後
| リソース数 | 月額コスト | |
|---|---|---|
| (A) IAM Access Analyzer | 1,027 | 32,732円 |
| (B) AWS Config | 3,541 | 25,377円 |
| (A + B) 合計 | 58,109円 |
※ USD/円 159円換算
デフォルトの 159,440円/月 に対して、タグ付け後は 58,109円/月 となり、月額約 101,331円 (約 64%) のコスト削減となります。
IAM Access Analyzer 単体で見ると、タグ付け後は 32,732円/月 (約 80% 削減) です。ここに AWS Config の運用コスト 25,377円/月 を加えても、デフォルトより大幅に安く抑えられます。
活用シーン: 退職者 IAM ユーザーのアクセスキー管理
AWS 環境の運用では、退職者の IAM ユーザーを削除する際に「そのアクセスキーがシステムで使われていないか」の確認が重要です。把握できていないままアカウントを削除すると、そのアクセスキーに依存しているシステムが停止するリスクがあります。
IAM Access Analyzer「未使用のアクセス」を活用することで、削除前に「最後にいつ使われたか」「一度も使われていないか」をコンソール上で確認できるようになります。アクセスキーの使用履歴を可視化することで、削除の判断材料として活用できます。
まとめ
| 課題 | 対策 |
|---|---|
| デフォルト設定だと IAM ロールも課金対象で月額が高くなる | 目的に不要な IAM ロールをタグで除外する |
| IAM Identity Center のロールはタグ付け不可 | Guard ルールで評価対象外とする |
| 数千件の IAM ロールへの手動タグ付けは非現実的 | AWS Config と Guard Custom Policy と SSM Document で自動化 |
| Lambda カスタムルールはランタイム EOL の保守が必要 | Guard Custom Policy により Lambda 不要 |
IAM Access Analyzer「未使用のアクセス」は、有効化する前にコストの試算と除外設計をしておくことをお勧めします。特に IAM ロールが多い環境では、今回紹介したタグによる除外と AWS Config の自動化を組み合わせることで、コストを抑えながら安定して運用できます。