Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Lambdaで社内AWS環境のリソース棚卸を効率化してみた

武田麻奈
July 27, 2024
200

 Lambdaで社内AWS環境のリソース棚卸を効率化してみた

武田麻奈

July 27, 2024
Tweet

Transcript

  1. 自己紹介 名前:武田 麻奈(たけだ まな) 社会人歴:3年目 業務: • OSSを使用した認証、ID管理システム構築支援 • API

    Gateway(OSS)の調査 • 部内の検証環境のAWSを整備 その他: • 2024 Japan AWS Jr. Champions
  2. リソースごとの棚卸方法 リソース 棚卸方法 EC2インスタンス 利用者に以下を依頼: • 使用中のもの → 使用しない期間(夜間や休日)は自動停止などを検討 •

    直近で使用しないもの → AMI化 • 不要なもの → 削除 AMI 利用者に以下を依頼: • 不要なもの → 削除 EBSボリューム EC2インスタンス棚卸後に、 • 不要のもの → 管理者が削除 ※今回はNameタグが付いていないものを不要とする EBSスナップショット AMI棚卸後に、 • 不要なもの → 管理者が削除 ※今回はNameタグが付いていないものを不要とする RDS 利用者に以下を依頼: • 不要なもの → 削除 • 直近で使用しないもの → 自動停止
  3. EC2インスタンスとEBSボリューム、 AMIとEBSスナップショットの棚卸について • EC2インスタンスとEBSボリュームの関係 • EC2インスタンス作成時に、EBSボリュームが自動作成される。 • 基本的にEC2インスタンスの削除時にEBSボリュームは自動削除されるが、 自動削除しない設定にしたものは残り続ける。 •

    AMIとEBSスナップショットの関係 • AMI作成時に、EBSスナップショットが自動作成される。 • AMIを削除しても関連付けられているEBSスナップショットは削除されない。 →自動作成後、自動削除されないものは、 本人すら分からない管理者不明のボリュームやスナップショットとなってしまう。 →誰も削除する判断ができないので、管理者が消してしまおう。 ↑管理コンソールから見ても、自動作成されたものは、どこで何のために利用されているリソースか分かりづらい。
  4. ソースコード # =============================EC2インスタンス============================= # 棚卸条件:最終起動日が180日以上前。 ec2 = boto3.client('ec2') ec2_instances_response =

    ec2.describe_instances() ec2_instances = [] for reservation in ec2_instances_response["Reservations"]: for instance in reservation["Instances"]: launch_time = instance["LaunchTime"] if (now - launch_time).days > 180 or instance["State"]["Name"] == "running": ec2_instances.append({ "name": get_tag_value("Tags", instance, "Name"), "id": instance["InstanceId"], "project": get_tag_value("Tags", instance, "Project"), "state" : instance["State"]["Name"], "launch_time": instance["LaunchTime"], }) instances_sorted = sorted(ec2_instances, key=lambda x: (x['project'], x['name'])) ec2_instances_table = ( "| インスタンス名 | インスタンスID | プロジェクトタグ | 状態 | 最終起動日時 | ¥¥n" "| --- | --- | --- | --- | --- | ¥¥n " ) for i in instances_sorted: link_id = "[" + i["id"] + "](https://ap-northeast-1.console.aws.amazon.com/ec2/home?#InstanceDetails:instanceId=" + i["id"] +")" ec2_instances_table += "| {} | {} | {} | {} | {} | ¥¥n ".format(i["name"], link_id, i["project"], i["state"], i["launch_time"]) message = ( "#### EC2インスタンス棚卸のお願い【neutral-7022】 ¥¥n" + “〇〇環境(neutral-7022)の不要なEC2インスタンスの棚卸をお願いいたします! ¥¥n" + "特に、起動中のインスタンスと最終起動日が180日以上前のインスタンスをリストアップしたので、各自以下の対応をお願いいたします。 ¥¥n" + "* 使用している場合 → 使用していない期間(夜間や休日)の停止を検討(参考:自動起動・停止機能の設定))¥¥n" + "* 直近で使用予定が無い場合 → AMI化してインスタンスは削除 ¥¥n" + "* 不要な場合 → 削除 ¥¥n" + ec2_instances_table ) response = client.invoke( FunctionName='mattermost-bot', InvocationType='RequestResponse', Payload='{¥"message¥":¥"' + message + '¥",¥"webhook¥":¥"' + os.environ['WEBHOOK_URL'] + '¥"}' ) AWSのEC2インスタンスの情報を条件に基づい てフィルタリングし、必要な情報を取得。 取得した情報から、 チャットへ送信するメッセージを作成。 チャットへメッセージを送信してくれるLambda へ、メッセージを含んだリクエストを送る。