はじめに
カケハシで BI ツールを開発している横田です。 AWS のリソース、いつの間にか増えていませんか? 今回は、ChatGPT を使って AWS のリソースを簡単に可視化することができたので、紹介したいと思います。
今回の課題と工夫したこと
我々のチームでは、半期に一回大掃除会を開催しています。 今回は、我々が管理している AWS Glue の job のうち使っていないものを削除することにしました。 使っていないリソースを調べるには AWS のコンソールを開いて一つ一つ確認する必要がありますが、これは非常に手間がかかります。 そこで、ChatGPT に Python スクリプトを書かせて、使っていないリソースを調べることにしました。
ChatGPT とのやりとり紹介
まずは、雑に ChatGPT に聞いてみます。
- Q
pythonでboto3を使って、直近1ヶ月実行されていない、glue jobを抽出するためのスクリプトを書いてください
- A
import boto3
from datetime import datetime, timedelta
# AWS Glueクライアントを作成
glue = boto3.client('glue')
# 現在の日時から1ヶ月前の日時を取得
one_month_ago = datetime.now() - timedelta(days=30)
# Glueジョブを取得
glue_jobs = glue.get_jobs()
for job in glue_jobs['Jobs']:
job_name = job['Name']
# 最後のジョブ実行の詳細を取得
job_run_response = glue.get_job_runs(JobName=job_name)
job_runs = job_run_response['JobRuns']
if job_runs:
last_run_date = job_runs[0]['StartedOn']
# 最後の実行日時が1ヶ月以上前であれば、ジョブ名を表示
if last_run_date < one_month_ago:
print(f'ジョブ {job_name} は1ヶ月以上実行されていません。')
無事、Python スクリプトを生成してくれました。
これを見たところ、ChatGPT が生成してくれたコードを見ると、get_jobsを使ってコードを書いてくれているのですが、Job の数が MaxResults の最大値を超えてしまうと一部しか取得できないです。
我々のケースでは job の数が多いので、NextToken を使って次のページを取得する必要があったので、修正をお願いしました。
- Q
get_jobsは最大で一定数のjobしか返してくれないと思うので、NextTokenを考慮して全てのjobをイテレートできるように修正してください
- A
import boto3
from datetime import datetime, timedelta
# AWS Glueクライアントを作成
glue = boto3.client('glue')
# 現在の日時から1ヶ月前の日時を取得
one_month_ago = datetime.now() - timedelta(days=30)
# NextTokenを使用して全てのジョブをイテレート
next_token = None
while True:
if next_token:
glue_jobs = glue.get_jobs(NextToken=next_token)
else:
glue_jobs = glue.get_jobs()
for job in glue_jobs['Jobs']:
job_name = job['Name']
# 最後のジョブ実行の詳細を取得
job_run_response = glue.get_job_runs(JobName=job_name)
job_runs = job_run_response['JobRuns']
if job_runs:
last_run_date = job_runs[0]['StartedOn']
# 最後の実行日時が1ヶ月以上前であれば、ジョブ名を表示
if last_run_date < one_month_ago:
print(f'ジョブ {job_name} は1ヶ月以上実行されていません。')
next_token = glue_jobs.get('NextToken')
if not next_token:
break
意図通りに NextToken を使って全ての job をリストアップできるように修正してくれました。
これで、全てのジョブを取得することができそうです。
ということで、list_jobs.py という名前で保存して実際に動かしてみると、次のような結果が得られました。
$ python list_jobs.py ... TypeError: can't compare offset-naive and offset-aware datetimes
タイムゾーンを考慮不足によるエラーが出てしまいました。すぐにはうまくいきませんね・・。
そこで、タイムゾーンを考慮したコードを書いてもらえるように、修正を依頼しました。
- Q
上記を実行すると、下記のエラーが出ます。修正してみてください
> TypeError: can't compare offset-naive and offset-aware datetimes
- A
import boto3
from datetime import datetime, timedelta
import pytz
# AWS Glueクライアントを作成
glue = boto3.client('glue')
# 現在の日時から1ヶ月前の日時を取得(UTCタイムゾーンを使用)
one_month_ago = datetime.now(pytz.utc) - timedelta(days=30)
# NextTokenを使用して全てのジョブをイテレート
next_token = None
while True:
if next_token:
glue_jobs = glue.get_jobs(NextToken=next_token)
else:
glue_jobs = glue.get_jobs()
for job in glue_jobs['Jobs']:
job_name = job['Name']
# 最後のジョブ実行の詳細を取得
job_run_response = glue.get_job_runs(JobName=job_name)
job_runs = job_run_response['JobRuns']
if job_runs:
last_run_date = job_runs[0]['StartedOn']
# 最後の実行日時が1ヶ月以上前であれば、ジョブ名を表示
if last_run_date < one_month_ago:
print(f'ジョブ {job_name} は1ヶ月以上実行されていません。')
next_token = glue_jobs.get('NextToken')
if not next_token:
break
これで、タイムゾーンを考慮したコードが生成されました。
実行してみると、無事、全てのジョブを取得することができました。
3 回のやりとりは必要でしたが、10 分もかからずスクリプトを作ることができました!
まとめ
今回は、ChatGPT を使って、AWS Glue のジョブを一ヶ月以上実行していないジョブを取得するコードを生成してもらいました。 このような、AWS の API を使って使っていないリソースを削除するようなユースケースでは、一時的なスクリプトを作ることが多くあると思います。 そのような時に ChatGPT を使うと、簡単にコードを生成することができるので工数削減に繋がりそうです。 もし、仕事で ChatGPT を使えないよという方は、このような工数削減メリットを伝えてみると良いかもしれません。
今回の件を応用する際には、上記のようにエラーが想定される事項についてはあらかじめ伝えておくのが良さそうです。(タイムゾーンの件など)
今後、似たようなケースで参考になれば幸いです。
ちなみに、こちらの記事は VSCode で書いているのですが、VSCode に Github Copilot プラグインを有効化しておくと、markdown の文章も生成してくれます。 今回の記事も、一部 Github Copilot によって生成された文章が含まれています。
ChatGPT や Github Copilot はスクリプトや記事を書く際にとても便利なツールなので、 今後も様々な場面で活用していきたいと思います。