【AWS】環境削除時のリソース消し忘れについて

## はじめに
環境を削除する時、作成した関連リソースを漏れなく削除できていますか。
EC2は削除したけど、AMIは保持し続けたまま課金されてしまうことがあるかと思います。
また、課金されなくともリソースを削除しきれない場合、
利用用途が不明瞭かつ後から削除できなくなり、
アカウント内に不要リソースが残り続けることになります。
本記事では削除の観点から漏れやすいサービスを記載した記事になります。

## 対象環境
以下のようなシステム構成を想定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/fe824156-6487-ac53-fd3c-04c35ee62095.png)

## 削除し忘れやすいサービス(課金サービス)
### EBSボリューム
EC2作成時に「終了時に削除する」オプションを設定していない場合、
EC2を削除しても残り続けるため手動でのボリューム削除が必要となる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/b26fbc85-2c54-a89b-17ef-1efb9220b37e.png)

#### サービス有無確認/削除コマンド
1.削除したEC2インスタンスのインスタンスIDを確認
```bash
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が不可
```bash
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の存在を確認
```bash
aws ec2 describe-volumes --volume-ids {ボリュームID}
```
4.EBSが存在していた場合削除
```bash
aws ec2 delete-volume --volume-id {ボリュームID}
```

### EBSスナップショット
特別設定を行わないと取得されないが、
構築したリソースでスナップショットを取得していた場合は要削除となる。
※AMIと一緒に取得していた場合、AMIの削除を先に実施する必要がある。
#### サービス有無確認/削除コマンド
1.「3.EBSの存在を確認」を参考にEBSのボリュームIDを取得

2.削除対象のスナップショットIDを確認
```bash
aws ec2 describe-snapshots --filters Name=volume-id,Values={ボリュームID} --query 'Snapshots[].SnapshotId' --output table
```
3.スナップショットが存在していた場合削除
```bash
aws ec2 delete-snapshot --snapshot-id {2で確認したスナップショットID}
```

## 削除し忘れやすいサービス(非課金サービス)
### AMI
特別設定を行わないと取得されないが、
構築したリソースのAMIを取得していた場合は要削除となる。

#### サービス有無確認/削除コマンド
1.「1.削除したEC2インスタンスのインスタンスIDを確認」を参考にインスタンスIDを取得

2.取得元インスタンスから削除対象のAMI情報を確認
```bash
aws ec2 describe-images --query 'Images[?SourceInstanceId==`{インスタンスID}`].ImageId' --output table
```

3.AMIが存在していた場合削除
```bash
aws ec2 deregister-image --image-id {2で確認したAMIのイメージID}
```

### キーペア
EC2構築にあたって構築が必要となるサービスにつき、要手動削除
#### サービス有無確認/削除コマンド
1.「1.削除したEC2インスタンスのインスタンスIDを確認」を参考にインスタンスIDを取得

2.削除対象インスタンスにて利用していたキーペア名を取得
```bash
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.存在していた場合削除
```bash
aws ec2 delete-key-pair --key-name {2で確認したキーペア名}
```
### パラメータグループ/サブネットグループ
RDSやRedshift用パラメータ設定。
デフォルトとしてAWS側が用意しているパラメータグループを利用することができるが、基本的には利用しないので要削除対象
※今回はRDSを対象に実施
#### サービス有無確認/削除コマンド
1.RDSの削除アクションより各リソースの名称確認
```bash
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.各リソースを削除
```bash:パラメータグループ削除
aws rds delete-db-parameter-group --db-parameter-group-name {1で確認したパラメータグループ名}
```

```bash:サブネットグループ削除
aws rds delete-db-subnet-group --db-subnet-group-name {1で確認したサブネットグループ名}
```

## 削除忘れ確認方法
上記の観点に併せて、削除忘れ防止のために以下方法での確認も可能です。
ただし、前提として作成したリソースにはタグを付与する必要があります。

### タグ付与とTagEditor
AWSのTagEditorという機能を利用して、
アカウント単位で該当タグが付与されているサービスを洗い出すことが可能です。
#### 利用方法
1.コンソールより「Resource Groups & Tag Editor」を選択し、タグエディタを押下する。
![2024-05-03_10h14_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/ba6572f2-d5ca-7c66-ffa7-112e6f3d859e.png)

2.検索対象としたいタグのKey/Valueを入力し追加。その後「リソース検索」を押下
![2024-05-03_10h18_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/2dc9b4d2-5b38-4333-cbb6-120699a4776a.png)

3.存在していて検索対象としたタグが付与されているリソースが出力される
![2024-05-03_10h19_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/86a47483-7633-90cb-cfe2-be96e0001fb0.png)

#### 利用の注意点
全てのサービスに対して洗い出せるわけではありません。
洗い出し対象サービスは「[AWS Resource Groups およびタグエディタで使用できるリソースタイプ](https://docs.aws.amazon.com/ja_jp/ARG/latest/userguide/supported-resources.html)」内の「タグエディタのタグ付け」参照

## 終わりに
「本記事が環境削除時に漏れなくリソースを削除したい」
と考えている方の助けになれば幸いです。