目次
ごあいさつ
こんにちは。
今日もお忙しい中、ブログにお立ち寄りいただきありがとうございます。
私はもに倉と申します。これまで様々なIT技術に触れてきましたが、まだまだ未熟な部分も多く、日々学びの姿勢で取り組んでおります。
今回は「特定タグが付いているRDS以外を、終了」というテーマで記事を書かせていただきました。皆様のお役に立てるよう、精一杯努めてまいりますので、どうぞよろしくお願いいたします。
シン・ごあいさつ
こんばんは。
AIで遊びまくっているもに倉です。
今回は、以前特定タグが付いているEC2インスタンス以外を終了させるlambdaを作成したので、RDSバージョンをやっていこうと思います。
コトの始まり
実は、EC2を消してくれるlambdaのブログを完成させたころにはすでに
RDSを消してくれるlambda作り始めていたのですが、どうにもうまくいかずに放置していました。
もうそんなlambdaの存在は忘れ始めていた今日この頃、元メンター様がChat GPTにいろいろお願いしていることを知ります。
どうやら、lambda関数もお願いしたら作ってもらえるらしいじゃないですか。
じゃあ、ほったらかしていたRDS削除lambdaを作ってもらおう!
――そんなこんなで、今回紹介する関数は100% Chat GPT産です。
ちなみに、冒頭の「ごあいさつ」も下記の通り注文してChat GPTに書いてもらいました。
長いのはともかく、「こんばんは」統一すら無視するなんて……。
お願いしまくる
さて、このブログを書くためにChat GPTをいじっていたら全履歴を削除してしまったので(最悪)、これから先は再現VTRです。
~再現VTRここから~
まず、ざっくりと要件を伝えます。
Pythonを使ったlambda関数で、Using:YesタグのついているRDS以外を削除するコードを書いてください。
こんなかんじでOKです。
これを送信すると、すぐに答えを書き出してくれます。
以下のようなPythonのコードで、"Using:Yes"タグが付いていないRDSインスタンスを削除できます。
import boto3
# AWSクライアントを初期化
client = boto3.client('rds')
# RDSのインスタンスを取得
response = client.describe_db_instances()
# インスタンスごとにタグをチェックして、Using:Yesタグがない場合は削除
for instance in response['DBInstances']:
instance_id = instance['DBInstanceIdentifier']
tags = client.list_tags_for_resource(ResourceName=instance['DBInstanceArn'])['TagList']
if not any(tag['Key'] == 'Using' and tag['Value'] == 'Yes' for tag in tags):
client.delete_db_instance(DBInstanceIdentifier=instance_id, SkipFinalSnapshot=True)
注意点:
・boto3 ライブラリがインストールされている必要があります。
・SkipFinalSnapshot パラメータを True に設定しているため、最終スナップショットは作成されません。スナップショットが必要な場合は、このパラメータを False に設定してください。
・インスタンスを削除する操作は、非常に重要なため慎重に実行してください。必要に応じて、コードを変更してください。
コードだけでなく、ちゃんと注意点すらも書き出してくれました。
~再現VTR終わり~
さて、これだけでたぶん使えるはずですが(↑の再現VTRぶんは未検証)、もっとこだわっていきましょう。
前回私が作成したEC2削除のコードは、下記にこだわりました。
・Usingタグの値は「Yes」でも「yes」でもOKにする
・終了保護を無効化
・エラーが出てもlambdaが停止しないようにする
今回も上記の動きを取り入れてもらえるようお願いをしていき、最終的に出てきたコードがこちらです(動作確認済み)。
完成品
import boto3
from botocore.exceptions import ClientError
def lambda_handler(event, context):
rds = boto3.client('rds')
response = rds.describe_db_instances()
instances = response['DBInstances']
for instance in instances:
try:
tags = rds.list_tags_for_resource(ResourceName=instance['DBInstanceArn'])['TagList']
using_yes = False
for tag in tags:
if tag['Key'] == 'Using' and tag['Value'].lower() == 'yes':
using_yes = True
break
if not using_yes:
db_instance_identifier = instance['DBInstanceIdentifier']
db_instance = rds.describe_db_instances(DBInstanceIdentifier=db_instance_identifier)['DBInstances'][0]
if db_instance.get('DeletionProtection', False):
rds.modify_db_instance(DBInstanceIdentifier=db_instance_identifier, DeletionProtection=False)
print(f"Deletion protection has been disabled for {db_instance_identifier}")
rds.delete_db_instance(DBInstanceIdentifier=db_instance_identifier, SkipFinalSnapshot=True)
print(f"{db_instance_identifier} has been deleted")
except ClientError as e:
print(f"Error deleting instance {instance['DBInstanceIdentifier']}: {e}")
pass
先ほどの再現VTRのものとはちょっとずつ違いがありますね。
やはりAIが作っているので、過去の出力結果と同様の出力結果を出そうとしても難しかったです(たぶん無理)。
疑ってみる
さて、こちらのコードは私からのお願いをすべて満たしているのでしょうか。
お願い一覧は以下の通りです。
メイン:「Using:Yes(yes)」タグが付いているRDS以外を消すlambdaを作ってほしい
:
サブ :終了保護が付いている場合は無効化してほしい(何が何でも削除したい)
:エラーが出たとしても、そこで止まらずに動ききってほしい
:
もちろん、最終的には自分の目で見て確認するのがよいですが、一旦別のChatGPTにこのコードをどう思うか訊いてみましょう。
先ほどのコードを貼り付けて、「これがどんなコードか教えてください」と訊いてみました。
chatGPTからのお返事は以下の通りでした。
このコードはAWS Lambda関数として設定されたスクリプトで、AWS RDS(Relational Database Service)インスタンスを削除するためのものです。このスクリプトは、RDSクライアントを作成し、すべてのRDSインスタンスを取得し、それぞれのインスタンスに対して以下の処理を行います。
インスタンスのリソース名からタグを取得し、"Using"タグが"yes"に設定されているかどうかを確認します。
"Using"タグが設定されていない場合、インスタンスのDeletionProtection設定を解除し、SkipFinalSnapshotオプションを使用してインスタンスを削除します。
このスクリプトは、AWS Lambdaを使用して自動実行できるため、定期的に不必要なRDSインスタンスを削除するなど、RDS管理に役立ちます。
おいおい、わかっとるやんけ……。
かなりわかっとるし、使い方も記載されていて優しいです。
こんなお返事がものの数秒で来るので、本当にすごいですね、chatGPT。
きもち
結構長い時間悩んで投げたRDS削除コードがものの数分で完成していく様を見るのは
言葉にしがたい感情を呼び起こしました!
ただ、うまく使いこなせば間違いなく業務効率化が可能だと思います。すごいです。
注意点
コードを出力させるのはとくに問題なくできたのですが、なにかしらの質問
(○○という芸能人について教えて など)に対してはめっちゃくちゃ嘘をついてきます。
chatGPTはあくまで自分の持っている知識の範囲で、補完として使うのがよいかと思います。
たまごのひび割れから身が見え始めたエンジニア。