長期間停止しているEC2インスタンスのチェックと削除について

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、SecurifyHubで検出される「[EC2.4] 停止した EC2 インスタンスは、指定した期間後に削除する必要があります」について解説します。

ポリシーの説明
[EC2.4] 停止した EC2 インスタンスは、指定した期間後に削除する必要があります
https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/ec2-controls.html#ec2-4
許可されている日数よりも長く停止している Amazon EC2 インスタンスがあるかどうかをチェックします。EC2 インスタンスが最大許容期間よりも長く停止すると、コントロールは失敗します。最大許容期間に対してカスタムパラメータ値を指定しない限り、Security Hub はデフォルト値の 30 日を使用します
リスク: 長期間停止しているEC2インスタンスが存在することは、以下のような潜在的なリスクとコストの増加につながる可能性があります。
- コストの増大: 停止しているEC2インスタンスであっても、アタッチされているEBSボリュームに対しては料金が発生し続けます。長期間停止しているインスタンスが多いほど、不要なコストが増加します。
- セキュリティリスクの増大: 停止しているインスタンスは、OSやアプリケーションのセキュリティパッチが適用されないまま放置される可能性があり、将来的に再起動された際に脆弱性を抱えているリスクがあります。また、意図しない復活や設定ミスによる公開状態になるリスクも考えられます。
- リソース管理の複雑化: 長期間停止しているインスタンスが多数存在すると、アクティブなリソースと非アクティブなリソースの区別がつきにくくなり、リソース管理が煩雑になります。
- 構成ドリフトのリスク: 長期間停止している間に、インフラストラクチャの他の部分の設定が変更され、再起動時に予期せぬ問題が発生する可能性があります。
対策: 停止しているEC2インスタンスを適切に管理し、不要なインスタンスは削除することが重要です。
- 停止期間の定義とポリシー策定: 組織内で許容されるEC2インスタンスの最大停止期間を定義し、ポリシーとして明確化します。例えば、「停止後30日を超えたインスタンスは削除する」といったルールを設けます。
- 定期的な棚卸しと確認: 定期的に停止しているEC2インスタンスのリストを抽出し、その必要性を確認します。不要なインスタンスは削除または終了(terminate)します。
- 自動化の検討: 一定期間を超えて停止しているインスタンスを自動的に削除または終了する仕組みの導入を検討します。AWS Systems Manager AutomationやLambda関数などを活用できます。
- スナップショットの活用: 後で再利用する可能性があるインスタンスの場合は、インスタンスを停止する前にEBSボリュームのスナップショットを作成し、インスタンス自体は終了させることを検討します。スナップショットから新しいインスタンスを起動することで、コストを削減し、リソース管理を効率化できます。
- Auto Scaling Groupの活用: スケーラビリティとコスト最適化が重要なワークロードには、Auto Scaling Groupの利用を検討します。Auto Scaling Groupは、需要に応じて自動的にインスタンスを起動・終了するため、手動で停止したままのインスタンスが残るリスクを低減できます。
修復方法
AWSコンソールを用いて、長期間停止しているEC2インスタンスを確認し、不要なインスタンスを削除します。
- AWSコンソールにログインします。
- ナビゲーションペインから EC2 を選択します。
- 左側のメニューから インスタンス を選択します。
- ステータスフィルターで 停止済み を選択し、停止しているインスタンスの一覧を表示します。
- 各インスタンスの起動時間や停止期間を確認し、不要なインスタンスを選択します。
- アクション ドロップダウンメニューから インスタンスの状態 を選択し、終了 をクリックします。
- 確認ダイアログが表示されるので、終了 をクリックします。

Terraformでの修復手順
TerraformでEC2インスタンスを管理している場合、不要になった停止中のインスタンスを削除するには、該当する aws_instance
リソースを Terraform の設定から削除し、terraform apply
を実行します。
resource "aws_instance" "example" {
ami = "ami-xxxxxxxxxxxxxxxxx"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
# 長期間停止しており不要になったインスタンスの定義を削除
# resource "aws_instance" "old_stopped_instance" {
# ami = "ami-yyyyyyyyyyyyyyyyy"
# instance_type = "t2.micro"
# tags = {
# Name = "old-stopped-instance"
# }
# # ... その他の設定 ...
# }
上記の例では、aws_instance.old_stopped_instance
の定義を削除し、terraform apply
を実行することで、対応するAWS上のインスタンスが終了します。
また、Terraformのライフサイクル設定 (lifecycle
) を使用して、インスタンスの削除を制御することも可能です。ただし、停止状態に基づいて自動的に削除する機能は直接的には提供されていません。
Terraform
resource "aws_instance" "example" {
ami = "ami-xxxxxxxxxxxxxxxxx"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
lifecycle {
prevent_destroy = false # デフォルトは false
}
}
長期間停止したインスタンスを自動的に削除する仕組みをTerraformで実装する場合は、外部のスクリプトやAWS Lambda関数と連携し、停止状態と経過時間に基づいてインスタンスを終了させる処理を記述する必要があります。
最後に
今回は、長期間停止しているEC2インスタンスが存在することによるコストやセキュリティのリスク、そしてそれらを是正するための対策について解説しました。停止しているインスタンスを定期的に確認し、不要なものは削除または終了することで、AWS環境のコスト効率とセキュリティを向上させることができます。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。