
GuardDuty Runtime MonitoringをEC2のタグ指定で有効化し、タグの付け外しでの挙動を確かめてみた
はじめに
かつまたです。
GuardDuty Runtime Monitoring で EC2 を監視する際に、監視したい台だけを選べるようにタグ(GuardDutyManaged:true)を付けた台だけを対象にする方式で有効化することがあるかと思います。
ドキュメントを読んだ範囲では、タグを外したときや、タグの値の大文字小文字が違うときにどうなるかは見つけられませんでした。そこで、検証用の AWS アカウントで実際にタグを付け外しして、挙動を確かめてみました。
やりたいこと
次の点を確かめます。
- タグを付けてから、監視が始まるまでの時間
- タグを外したときの挙動(エージェントやカバレッジの状態はどうなるか)
- タグを付けていない台が、カバレッジ(Runtime Monitoring で監視できている台と、その状態(HEALTHY / UNHEALTHY)の一覧)にどう見えるか
- タグの値を大文字の
Trueにしたときに、対象になるか - 監視対象の台を削除したとき、Runtime Monitoring を無効にしたときに、GuardDuty が自動で作ったリソース(AWS Systems Manager の関連付け、VPC エンドポイント、セキュリティグループ)がどうなるか
前提条件
仕様確認
検証の前に、公式ドキュメントに書かれていることを整理しました。
| 項目 | ドキュメントの記載(要約) |
|---|---|
| 対象の選び方 | 全インスタンス、包含タグを付けた台だけ、除外タグを付けた台以外、の 3 つ |
| タグ | キーは GuardDutyManaged。包含は値 true、除外は値 false |
| 包含タグ方式の設定 | Runtime Monitoring を有効にし、EC2 の自動エージェント設定は無効のままにする。GuardDutyManaged:true の台だけを GuardDuty が管理する |
| エージェントの導入方法 | GuardDuty が SSM の関連付け GuardDutyRuntimeMonitoring-do-not-delete を作って入れる。包含タグ方式では、関連付けの対象が tag:GuardDutyManaged になる |
| 除外タグの条件 | 起動前に付ける必要があり、インスタンスメタデータでタグを参照できるようにしておく必要がある。付けても、導入済みのエージェントは削除されない |
| 自動エージェント設定を無効にしたとき | エージェントは削除されず、ランタイムイベントは届き続ける |
| 台の条件 | GuardDuty にエージェントを管理させる場合は、SSM の管理下にあること。OS・カーネルは、検証済みの組み合わせが表で示されている |
| タグの保護 | GuardDutyManaged タグを変更できる人を、SCP か IAM ポリシーで絞ることが推奨されている |
タグを外したときの扱い、値の大文字小文字、タグのない台のカバレッジ上の見え方、監視対象の台を削除したときの自動作成リソースの扱いは、読んだ範囲では見つけられませんでした。これらを今回の検証項目にしています。無効にしたときの扱いはドキュメントに説明があるため、記載どおりに消えるかを確かめます。
検証環境
| 台 | AMI | カーネル(uname -r) |
GuardDutyManaged タグ |
|---|---|---|---|
| A | al2023-ami-2023.12.20261102.0-kernel-6.12-x86_64 | 6.12.113-138.209.amzn2023.x86_64 | true を付け、あとで外す |
| B | 同上 | 6.12.113-138.209.amzn2023.x86_64 | 最初は付けず、あとで True(大文字)を付ける |
| C | al2023-ami-2023.12.20261102.0-kernel-6.18-x86_64 | 6.18.56-125.164.amzn2023.x86_64 | true を付ける |
やってみた
事前準備
EC2 を作る
3 台とも、GuardDutyManaged タグを付けずに作りました。A・B はカーネル 6.12、C はカーネル 6.18 の AMI です。
AMI_ID="<AMI ID>" # A・B はカーネル 6.12、C はカーネル 6.18 の AL2023 AMI
SUBNET_ID="<サブネットID>"
SG_ID="<デフォルトSGのID>"
PROFILE_NAME="<SSM用インスタンスプロファイル名>"
NAME=gd-rm-test-A # B・C は名前を変えて同じコマンドで作成
aws ec2 run-instances --image-id "$AMI_ID" --instance-type t3.micro \
--subnet-id "$SUBNET_ID" --security-group-ids "$SG_ID" \
--iam-instance-profile Name="$PROFILE_NAME" \
--metadata-options HttpTokens=required,InstanceMetadataTags=enabled \
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${NAME}}]" \
--count 1 --query 'Instances[0].InstanceId' --output text
作成から約 40 秒で、3 台とも SSM の管理下(Online)に入りました。この時点では、3 台ともエージェントは入っていません。
Runtime Monitoring を有効にする
RUNTIME_MONITORING を有効にし、EC2 の自動エージェント設定は無効のままにしました。
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty update-detector --detector-id "$DETECTOR_ID" \
--features '[{"Name":"RUNTIME_MONITORING","Status":"ENABLED","AdditionalConfiguration":[{"Name":"EC2_AGENT_MANAGEMENT","Status":"DISABLED"},{"Name":"EKS_ADDON_MANAGEMENT","Status":"DISABLED"},{"Name":"ECS_FARGATE_AGENT_MANAGEMENT","Status":"DISABLED"}]}]'
aws guardduty get-detector --detector-id "$DETECTOR_ID" \
--query 'Features[?Name==`RUNTIME_MONITORING`]'
get-detector の結果で、RUNTIME_MONITORING が ENABLED、3 つの自動エージェント設定が DISABLED になったことを確かめました。
検証手順
観測に使ったコマンド
タグを付けたあとは、次のコマンドをまとめておおむね 30 秒ごとに実行し、状態の変化を追いました。以降の所要時間は、この 30 秒間隔で観測した時刻を基準にしています。
観測に使ったコマンド
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty list-coverage --detector-id "$DETECTOR_ID"
aws guardduty get-coverage-statistics --detector-id "$DETECTOR_ID" \
--statistics-type COUNT_BY_COVERAGE_STATUS
一覧で見たいときは --query で絞りました。EC2 の項目は ResourceDetails.Ec2InstanceDetails の下にあります。
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty list-coverage --detector-id "$DETECTOR_ID" \
--query 'Resources[].[ResourceDetails.Ec2InstanceDetails.InstanceId,CoverageStatus,Issue,ResourceDetails.Ec2InstanceDetails.ManagementType,ResourceDetails.Ec2InstanceDetails.AgentDetails.Version]' \
--output table
GuardDuty が作る SSM の関連付けと、その実行状況です。
aws ssm list-associations \
--association-filter-list key=AssociationName,value=GuardDutyRuntimeMonitoring
ASSOCIATION_ID=$(aws ssm list-associations \
--association-filter-list key=AssociationName,value=GuardDutyRuntimeMonitoring \
--query 'Associations[0].AssociationId' --output text)
aws ssm describe-association --association-id "$ASSOCIATION_ID"
aws ssm describe-association-executions --association-id "$ASSOCIATION_ID"
EXECUTION_ID=$(aws ssm describe-association-executions --association-id "$ASSOCIATION_ID" \
--query 'AssociationExecutions[0].ExecutionId' --output text)
aws ssm describe-association-execution-targets \
--association-id "$ASSOCIATION_ID" --execution-id "$EXECUTION_ID"
GuardDuty が作る VPC エンドポイントとセキュリティグループです。
aws ec2 describe-vpc-endpoints \
--filters Name=service-name,Values=com.amazonaws.ap-northeast-1.guardduty-data
aws ec2 describe-security-groups --filters Name=tag-key,Values=GuardDutyManaged
インスタンスの中は、SSM Run Command でカーネル、エージェントのサービスの状態、パッケージを確かめました。
INSTANCE_ID=i-0aaaaaaaaaaaaaaaa
COMMAND_ID=$(aws ssm send-command --document-name AWS-RunShellScript \
--instance-ids "$INSTANCE_ID" \
--parameters 'commands=["uname -r","systemctl is-active amazon-guardduty-agent","rpm -qa | grep -i guardduty"]' \
--query 'Command.CommandId' --output text)
# 実行が終わるまで数秒待ってから結果を表示する
aws ssm get-command-invocation --command-id "$COMMAND_ID" --instance-id "$INSTANCE_ID" \
--query '[Status,StandardOutputContent]' --output text
1. A と C にタグを付ける
Runtime Monitoring を有効にしたあと、A と C に GuardDutyManaged:true を付けました。
タグを付けると、約 40 秒後の観測で SSM の関連付け、VPC エンドポイント、セキュリティグループが見えるようになりました。関連付けの主な項目は次のとおりです。
{
"AssociationName": "GuardDutyRuntimeMonitoring-do-not-delete",
"Targets": [{"Key": "tag:GuardDutyManaged", "Values": ["true"]}],
"ScheduleExpression": "rate(1 day)",
"MaxConcurrency": "10%"
}
A と C の進み方の違いは、結果で後述します。
2. A からタグを外す
A と C がカバレッジで HEALTHY になったのを確かめてから、A のタグを外しました。
3. B に大文字の True を付ける
タグのない B に GuardDutyManaged:True(先頭が大文字)を付けました。
ID_A=i-0aaaaaaaaaaaaaaaa
ID_B=i-0bbbbbbbbbbbbbbbb
ID_C=i-0cccccccccccccccc
aws ec2 create-tags --resources "$ID_B" --tags Key=GuardDutyManaged,Value=True
aws ec2 describe-tags \
--filters "Name=resource-id,Values=${ID_A},${ID_B},${ID_C}" Name=key,Values=GuardDutyManaged \
--output text
TAGS GuardDutyManaged i-0cccccccccccccccc instance true
TAGS GuardDutyManaged i-0bbbbbbbbbbbbbbbb instance True
A が HEALTHY になるまでにかかった時間の約 2 倍にあたる 8 分間観測し、打ち切りました。
4. 3 台を削除する
3 台を削除(terminate)し、そのあとも Runtime Monitoring は有効のまま、自動作成のリソースが残るかを観測しました。
ID_A=i-0aaaaaaaaaaaaaaaa
ID_B=i-0bbbbbbbbbbbbbbbb
ID_C=i-0cccccccccccccccc
aws ec2 terminate-instances --instance-ids "$ID_A" "$ID_B" "$ID_C" \
--query 'TerminatingInstances[].[InstanceId,CurrentState.Name]' --output text
aws ec2 wait instance-terminated --instance-ids "$ID_A" "$ID_B" "$ID_C"
5. Runtime Monitoring を無効にする
最後に Runtime Monitoring を無効に戻し、自動作成のリソースが消えるかを観測しました。
DETECTOR_ID=$(aws guardduty list-detectors --query 'DetectorIds[0]' --output text)
aws guardduty update-detector --detector-id "$DETECTOR_ID" \
--features '[{"Name":"RUNTIME_MONITORING","Status":"DISABLED","AdditionalConfiguration":[{"Name":"EC2_AGENT_MANAGEMENT","Status":"DISABLED"},{"Name":"EKS_ADDON_MANAGEMENT","Status":"DISABLED"},{"Name":"ECS_FARGATE_AGENT_MANAGEMENT","Status":"DISABLED"}]}]'
最終確認で、GuardDuty の Runtime Monitoring の設定、SSM の関連付け、VPC エンドポイント、セキュリティグループ、カバレッジが、すべて開始前と同じ状態に戻ったことを確かめました。手動で削除したリソースはありません。
結果
時系列
確認できた挙動を、3 台を作成した時点を 0:00 とした経過時間で並べてみます。
| 経過 | 操作 / 確認できた挙動 |
|---|---|
| 0:00 | 3 台を作成(タグなし) |
| 0:55 | Runtime Monitoring を有効化 |
| 3:12 観測 | タグのない A だけがカバレッジに出る(UNHEALTHY / No Agent Reporting / MANUAL)。B・C は出ない |
| 6:29 観測 | 関連付け・VPC エンドポイント・セキュリティグループなし |
| 6:48 | A と C に GuardDutyManaged:true を付与 |
| 7:27 観測 | 関連付け、VPC エンドポイント、セキュリティグループを確認 |
| 7:57 観測 | VPC エンドポイントが available。A の ManagementType が AUTO_MANAGED に変わる |
| 8:28 観測 | A の Issue が VPC Endpoint Creation In Progress になる |
| 8:58 観測 | A でエージェント稼働確認。C が初めてカバレッジに出る(UNHEALTHY / No Agent Reporting : Waiting for SSM notification / AUTO_MANAGED) |
| 10:28 観測 | A が HEALTHY(エージェント v1.17.3) |
| 11:53 | 関連付けの実行対象のうち、A は Success、C は Pending |
| 12:15 観測 | C でエージェント稼働確認 |
| 13:15 観測 | C の Issue が No Agent Reporting に変わる |
| 13:52 観測 | C が HEALTHY(エージェント v1.17.3) |
| 14:08 | A のタグを削除 |
| 14:48 観測 | A は HEALTHY のまま、ManagementType が MANUAL に変わる |
| 15:49 観測 | タグのない B が初めてカバレッジに出る(UNHEALTHY / No Agent Reporting / MANUAL) |
| 14:08〜34:41 | A は HEALTHY / MANUAL のまま。エージェントは動き続け、パッケージも残る |
| 34:41 | B に GuardDutyManaged:True(大文字)を付与 |
| 34:41〜42:50 | B はカバレッジの UpdatedAt が更新されただけで、UNHEALTHY / MANUAL のまま。エージェントは入らない |
| 43:22 | 3 台を削除 |
| 45:07 観測 | C がカバレッジから消える |
| 46:07 観測 | A がカバレッジから消える |
| 47:08 観測 | B も消え、カバレッジは 0 件。関連付け・VPC エンドポイント・セキュリティグループは残る |
| 47:36 観測 | 関連付け・VPC エンドポイント・セキュリティグループは残ったまま |
| 47:42 | Runtime Monitoring を無効化 |
| 47:55 観測 | 関連付けがバージョン 2 になり、対象が InstanceIds = * に変わる(Pending / Creating)。VPC エンドポイントは deleting |
| 48:25 観測 | 関連付けが消える |
| 50:25 観測 | VPC エンドポイントが deleted |
| 50:55 観測 | VPC エンドポイントが一覧から消え、セキュリティグループも消える |
① タグを付けてから監視開始までの時間
| 段階 | A | C |
|---|---|---|
| 関連付け・セキュリティグループが見える | 39 秒 | 同左(共通のリソース) |
VPC エンドポイントが available |
1 分 9 秒 | 同左(VPC に 1 つ) |
| エージェント稼働開始 | 2 分 10 秒 | 5 分 27 秒 |
| カバレッジが HEALTHY | 3 分 40 秒 | 7 分 4 秒 |
A は 4 分以内、C は約 7 分で HEALTHY になりました。
② タグを外したときの挙動
タグを外しても、A の監視は止まりませんでした。
| InstanceId | CoverageStatus | Issue | ManagementType | AgentDetails.Version |
|---|---|---|---|---|
| i-0aaaaaaaaaaaaaaaa(A) | HEALTHY | (空) | MANUAL | v1.17.3 |
| i-0cccccccccccccccc(C) | HEALTHY | (空) | AUTO_MANAGED | v1.17.3 |
| i-0bbbbbbbbbbbbbbbb(B) | UNHEALTHY | No Agent Reporting | MANUAL | (なし) |
タグを外した台は、手エージェントを止めるにはアンインストールが別に必要になると考えていますが、その手順は今回試していません。
エージェントを入れた台と同じ扱い(MANUAL)になり、監視は続きます。
③ タグのない台の見え方
- Runtime Monitoring を有効にすると、タグのない台もカバレッジに UNHEALTHY /
No Agent Reporting/MANUALで出てきました - タグのない台には、エージェントは入りませんでした(B は最後まで入らず)
④ タグの値の大文字小文字
GuardDutyManaged:True を付けた B は対象になりませんでした。
- エージェントは入らず、カバレッジは UNHEALTHY /
MANUALのままでした - 関連付けの実行は増えず(
{Success=2}のまま)、B の関連付けの状態も空でした
関連付けの対象は tag:GuardDutyManaged の値 true なので、値は小文字の true と完全に一致する必要があると読み取りました。
⑤ EC2を削除したとき・Runtime Monitoring を無効にしたとき
| リソース | 3 台を削除したあと | Runtime Monitoring を無効にしたあと |
|---|---|---|
| カバレッジ | 削除から 4 分以内に 3 台とも消えた(C → A → B の順) | 0 件のまま |
| SSM の関連付け | 残った | 43 秒以内に消えた |
| VPC エンドポイント | available のまま残った |
deleting を経て、約 3 分で一覧から消えた |
| セキュリティグループ | 残った | VPC エンドポイントのあとに消えた |
削除してから観測できた約 4 分間、関連付け・VPC エンドポイント・セキュリティグループは残ったままでした。監視対象の台がなくなっても、Runtime Monitoring が有効な間は、これらのリソースはすぐには消えませんでした。
Runtime Monitoring を無効にすると、3 つとも自動削除され、手動の削除は不要でした。
参考資料
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました








