はじめに
環境を削除する時、作成した関連リソースを漏れなく削除できていますか。
EC2は削除したけど、AMIは保持し続けたまま課金されてしまうことがあるかと思います。
また、課金されなくともリソースを削除しきれない場合、
利用用途が不明瞭かつ後から削除できなくなり、
アカウント内に不要リソースが残り続けることになります。
本記事では削除の観点から漏れやすいサービスを記載した記事になります。
対象環境
削除し忘れやすいサービス(課金サービス)
EBSボリューム
EC2作成時に「終了時に削除する」オプションを設定していない場合、
EC2を削除しても残り続けるため手動でのボリューム削除が必要となる。
サービス有無確認/削除コマンド
1.削除したEC2インスタンスのインスタンスIDを確認
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=TerminateInstances --query 'Events[].{resources:Resources[0].ResourceName,time:EventTime}' --output table
2.AWSConfigより削除したインスタンスに付与されていたボリュームIDを確認
※EC2削除後はEBSからEC2インスタンス情報が削除されるため、
インスタンスIDを元にDescribeが不可
aws configservice get-resource-config-history --resource-type AWS::EC2::Instance --resource-id {インスタンスID} --query 'configurationItems[].relationships[?resourceType==`AWS::EC2::Volume`]' --output json
3.EBSの存在を確認
aws ec2 describe-volumes --volume-ids {ボリュームID}
4.EBSが存在していた場合削除
aws ec2 delete-volume --volume-id {ボリュームID}
EBSスナップショット
特別設定を行わないと取得されないが、
構築したリソースでスナップショットを取得していた場合は要削除となる。
※AMIと一緒に取得していた場合、AMIの削除を先に実施する必要がある。
サービス有無確認/削除コマンド
1.「3.EBSの存在を確認」を参考にEBSのボリュームIDを取得
2.削除対象のスナップショットIDを確認
aws ec2 describe-snapshots --filters Name=volume-id,Values={ボリュームID} --query 'Snapshots[].SnapshotId' --output table
3.スナップショットが存在していた場合削除
aws ec2 delete-snapshot --snapshot-id {2で確認したスナップショットID}
削除し忘れやすいサービス(非課金サービス)
AMI
特別設定を行わないと取得されないが、
構築したリソースのAMIを取得していた場合は要削除となる。
サービス有無確認/削除コマンド
1.「1.削除したEC2インスタンスのインスタンスIDを確認」を参考にインスタンスIDを取得
2.取得元インスタンスから削除対象のAMI情報を確認
aws ec2 describe-images --query 'Images[?SourceInstanceId==`{インスタンスID}`].ImageId' --output table
3.AMIが存在していた場合削除
aws ec2 deregister-image --image-id {2で確認したAMIのイメージID}
キーペア
EC2構築にあたって構築が必要となるサービスにつき、要手動削除
サービス有無確認/削除コマンド
1.「1.削除したEC2インスタンスのインスタンスIDを確認」を参考にインスタンスIDを取得
2.削除対象インスタンスにて利用していたキーペア名を取得
aws configservice get-resource-config-history --resource-type AWS::EC2::Instance --resource-id {インスタンスID} --output text --query 'configurationItems[?configurationItemStatus==`ResourceDiscovered`].configuration' | grep -o '"keyName":"[^"]*"'
3.存在していた場合削除
aws ec2 delete-key-pair --key-name {2で確認したキーペア名}
パラメータグループ/サブネットグループ
RDSやRedshift用パラメータ設定。
デフォルトとしてAWS側が用意しているパラメータグループを利用することができるが、基本的には利用しないので要削除対象
※今回はRDSを対象に実施
サービス有無確認/削除コマンド
1.RDSの削除アクションより各リソースの名称確認
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=DeleteDBInstance --query 'Events[].{DBInstance:Resources[?ResourceType==`AWS::RDS::DBInstance`].ResourceName,DBParameterGroup:Resources[?ResourceType==`AWS::RDS::DBParameterGroup`].ResourceName,DBSubnetGroup:Resources[?ResourceType==`AWS::RDS::DBSubnetGroup`].ResourceName,time:EventTime}' --output table
2.各リソースを削除
aws rds delete-db-parameter-group --db-parameter-group-name {1で確認したパラメータグループ名}
aws rds delete-db-subnet-group --db-subnet-group-name {1で確認したサブネットグループ名}
削除忘れ確認方法
上記の観点に併せて、削除忘れ防止のために以下方法での確認も可能です。
ただし、前提として作成したリソースにはタグを付与する必要があります。
タグ付与とTagEditor
AWSのTagEditorという機能を利用して、
アカウント単位で該当タグが付与されているサービスを洗い出すことが可能です。
利用方法
1.コンソールより「Resource Groups & Tag Editor」を選択し、タグエディタを押下する。
2.検索対象としたいタグのKey/Valueを入力し追加。その後「リソース検索」を押下
3.存在していて検索対象としたタグが付与されているリソースが出力される
利用の注意点
全てのサービスに対して洗い出せるわけではありません。
洗い出し対象サービスは「AWS Resource Groups およびタグエディタで使用できるリソースタイプ」内の「タグエディタのタグ付け」参照
終わりに
「本記事が環境削除時に漏れなくリソースを削除したい」
と考えている方の助けになれば幸いです。