ちょっと話題の記事

AWSのリソースを棚卸してみた

2022.04.21

こんにちは、CX事業本部IoT事業部の高橋雄大です。

AWSで開発やテストを行っていると、消し忘れや使われなくなったリソースが出てきます。これらを放置しておくと、余分なコストが発生したり作業のミスに繋がることもあるため、定期的にリソースを棚卸することが大切です。

また、開発や運用保守の引き継ぎを行う際にも、引き継がれる人のことを考えて、しっかりとリソースの整理をしておきましょう。

本記事のゴール

AWSのリソース一覧を取得して、エクセルやスプレッドシートで棚卸を実施します。

AWSリソース棚卸し

環境情報

項目 内容
OS macOS Monterey 12.3 (21E230)
AWS CLI 2.2.16

AWSリソース一覧を作成

AWSのリソース一覧を取得にはAWS CLIを利用します。AWS CLIを利用するためには、セキュリティ認証情報などの初期設定が必要です。

次のコマンドを実行してAWSのリソース一覧を取得します。--regionで対象のリージョンを切り替えます。

コマンドライン

aws resourcegroupstaggingapi get-resources --region ap-northeast-1 --query 'ResourceTagMappingList[*].ResourceARN' --output text | tr '\t' '\n'

実行結果

arn:aws:ec2:ap-northeast-1:000000000000:instance/i-xxxxxxxxxxxxxxxxx
arn:aws:lambda:ap-northeast-1:000000000000:function:itg-xxxxxxx-xxxx-iot-platform-authentication
arn:aws:lambda:ap-northeast-1:000000000000:function:itg-xxxxxxx-xxxx-iot-platform-create-certificate
arn:aws:lambda:ap-northeast-1:000000000000:function:itg-xxxxxxx-xxxx-iot-platform-create-error-report
arn:aws:lambda:ap-northeast-1:000000000000:function:itg-xxxxxxx-xxxx-iot-platform-create-health-status
arn:aws:lambda:ap-northeast-1:000000000000:function:itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file
arn:aws:lambda:ap-northeast-1:000000000000:function:itg-xxxxxxx-xxxx-iot-platform-get-device-info
〜〜〜〜〜

過去に一度もタグ付けされていないリソースは取得できない可能性があります。タグ付をしなくてもLambda等のサービスは取得できることを確認しています。また、グローバルリソースは取得できないので、IAMの棚卸などもする場合には次のようなサービス別のコマンドを実行します。

コマンドライン

aws iam list-users --query 'Users[*].Arn' --output text | tr '\t' '\n'
aws iam list-roles --query 'Roles[*].Arn' --output text | tr '\t' '\n'

実行結果

arn:aws:iam::000000000000:user/xxxxxxxxxxa
arn:aws:iam::000000000000:user/xxxxxxxxxxb
〜〜〜〜〜
arn:aws:iam::000000000000:role/AdminRole
arn:aws:iam::000000000000:role/audit-enable-securityhub
arn:aws:iam::000000000000:role/AWSCloudFormationStackSetExecutionRole
arn:aws:iam::000000000000:role/aws-service-role/guardduty.amazonaws.com/AWSServiceRoleForAmazonGuardDuty
〜〜〜〜〜

出力された内容をコピーしてエクセルやスプレッドシートへ貼り付けます。

AWSリソース一覧シート

棚卸の作業で使用する列「削除」「理由」を追加、必要に応じてデータの入力規則と条件付き書式を設定します。また、フィルター機能やソート機能を使うとリソースを絞り込みやすくなります。

AWSリソース棚卸シート

AWSリソース棚卸シート条件付き書式

CFnリソース一覧を作成

棚卸の作業をしていると、リソースがCloudFormationで管理されているかどうか調べることがあります。次のコマンドを実行してCloudFormationで管理されているリソースの一覧を取得しておくと検索がしやすいです。リソースがどのスタックに属しているのかも分かります。

コマンドライン

staks=$(aws cloudformation list-stacks --region ap-northeast-1 --stack-status-filter 'CREATE_COMPLETE' 'UPDATE_COMPLETE' 'ROLLBACK_COMPLETE' | jq '.StackSummaries')
len=$(echo $staks | jq length)
for i in $(seq 0 $(($len -1))); do
  aws cloudformation describe-stack-resources --region ap-northeast-1 \
  --stack-name $(echo $staks | jq -r ".[$i].StackName") \
  | jq -r '.StackResources[] | [.StackName,.ResourceType,.PhysicalResourceId] | @tsv'
  sleep 1
done

実行結果

itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::CDK::Metadata	xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::Events::Rule	itg-xxxxxxx-xxxx-iot-plat-CreateXxxxxxxXxxxListCsv-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::Lambda::Permission	itg-xxxxxxx-xxxx-iot-platform-create-xxxxxx-CreateXxxxxxxXxxxListCsvFileEventRuleAllow-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::Lambda::Function	itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	Custom::LogRetention	/aws/lambda/itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::IAM::Role	itg-xxxxxxx-xxxx-iot-plat-CreateXxxxxxxXxxxListCsv-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::IAM::Policy	itg-m-Crea-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::Lambda::Function	itg-xxxxxxx-xxxx-iot-plat-LogRetentionxxxxxxxxxxxx-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::IAM::Role	itg-xxxxxxx-xxxx-iot-plat-LogRetentionxxxxxxxxxxxx-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-create-xxxxxxx-xxxx-list-csv-file	AWS::IAM::Policy	itg-m-LogR-XXXXXXXXXXXXX
itg-xxxxxxx-xxxx-iot-platform-register-maintenance-history	AWS::CDK::Metadata	xxxxxxxx-xxxxxxxxx-xxxx-xxxxxxxxxxxx
itg-xxxxxxx-xxxx-iot-platform-register-maintenance-history	AWS::Lambda::Function	itg-xxxxxxx-xxxx-iot-plat-LogRetentionxxxxxxxxxxxx-XXXXXXXXXXXXX
〜〜〜〜〜

エクセルやスプレッドシートでシートを1つ追加します。出力された内容をコピーしてシートへ貼り付けます。タブ区切りになっているので Command+Shift+VCtrl+Shift+V で貼り付ければきれいに列へ収まります。

CloudFormationリソース一覧シート

リソースの棚卸を実施

AWSのリソースを棚卸していきます。削除対象のリソースは「削除する」にして理由を記入します。チームメンバーや顧客に確認が必要なリソースは「確認中」にしておきます。全てのリソースを確認できたら削除対象のリソースを削除しましょう。まずは開発環境から着手すると良いと思います。

AWSリソース棚卸し

まとめ

大規模なプロジェクトや長期間の開発では、何に使われているのかよくわからないリソースが放置されていることがあります。また、開発環境(開発用のAWSアカウント)では開発途中に手動で作成したテスト用のリソースや、CloudFormationのスタックを削除した際に自動で削除されなかったリソースなど、様々な理由で残されたリソースを見かけることも多いです。

このような不明確なリソースを棚卸によって減らすことで、効率よく開発に取り組むことができると思います。ぜひ、定期的な棚卸を取り入れてみてください。

参考資料