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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for 武田麻奈 武田麻奈
July 27, 2024
430

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

Avatar for 武田麻奈

武田麻奈

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 へ、メッセージを含んだリクエストを送る。