はじめに:検証環境が「魔境」になっていませんか?

自由な検証ができるAWS環境はエンジニアにとって楽園ですが、いつの間にか以下のような「魔境」になりがちかなと思います。
「誰が・何の目的で作ったか不明」な高額リソースの放置。
「これ、消しても大丈夫ですか?」という確認がSlackのあちこちで発生。
気づけば、使っていないリソースのために毎月数万〜数十万円のコストが発生。
こうした「確認のコスト」と「心理的な消しにくさ」を解決するために、サーバーレスで動くお掃除ツール「すっきりん」を開発してみました!!!

ツール概要:リソース掃除機「すっきりん」

「すっきりん」は、aws-nukeを核に、LambdaとSlackを組み合わせた自動クリーニングツールです!
主なルール(動き)
・利用期限の管理: ExpirationDate タグをチェックし、期限を過ぎたものは削除対象へ。
・いきなり消さない: 事前にSlackへ通知し、人間が「削除実行」ボタンを押して初めて実行されます。
aws-nukeとは、AWSアカウント内のリソースを全削除するためのOSSツールになります。

◾️システム構成

⚒️使用技術

AWS Lambda: 実行基盤。削除用Lambdaは aws-nuke を含めたコンテナイメージ(ECR)を使用。
EventBridge: 定期実行のトリガー。
API Gateway: Slackからの承認ボタンのレスポンスを受信。
Slack API: 通知およびインタラクティブボタンの提供。

◾️動作の流れ:スキャンから削除まで

1. スキャン & 自動タグ付け(Python Lambda)
EventBridgeをトリガーに、まずはリソースの状態をチェックします。
ExpirationDate(利用期限)を現在時刻と比較。
削除対象と判定されたものに target: true というタグを付与します。

2. Slackへの「予告」通知
スキャン結果をSlackに通知します。ここでは「Dry Run(削除シミュレーション)」の結果を表示するのがポイントです。

3. 承認と実行(aws-nuke on Lambda)
管理者がSlackの「削除実行」ボタンを押すと、API Gateway経由で削除用Lambdaが起動。 強力な削除ツールである aws-nuke が、タグフィルタリングに基づいて対象リソースを一気にクリーンアップします。

◾️こだわり

通常、EC2やS3、RDSなどのリソースを操作する場合、それぞれのサービス固有のAPI(describe_instances や list_buckets など)を個別に呼び出す必要があります。しかし、これでは対象サービスが増えるたびにコードが肥大化してしまいます。
そこで「すっきりん」では、AWS Resource Groups Tagging API を活用しています。

# タグ操作用のクライアントを生成
tagging_client = boto3.client('resourcegroupstaggingapi', region_name=target_region)

# 1. ExpirationDate タグが付いているリソースを全サービスから検索
response = tagging_client.get_resources(
    TagFilters=[{'Key': 'ExpirationDate'}],
    ResourcesPerPage=100
)

# 2. 日付判定を行い、期限切れならリストに追加
for resource in response['ResourceTagMappingList']:
    resource_arn = resource['ResourceARN']
    tags = {t['Key']: t['Value'] for t in resource['Tags']}

    exp_date = tags.get('ExpirationDate') # 例: 20251127
    if exp_date and int(exp_date) < today:
        resources_to_tag.append(resource_arn)

# 3. 最大20件ずつバッチで一括タグ付け
tagging_client.tag_resources(
    ResourceARNList=batch_arns,
    Tags={'target': 'true'}
)

ResourceGroupsTaggingAPIを参考にしました!

◾️実際にSlackに届く通知

削除対象のリソース一覧

削除実施後の結果通知