2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

100台超のEC2自動停止をAIに聞いて3分で実装してみた!

Last updated at Posted at 2023-07-15

EC2の自動停止(メンテ不要Version)

以前の執筆記事でLambdaでのEC2の自動停止について
ご紹介しました。
EC2の自動停止について

上記は超入門編で、AWSを初めて利用する方でも
行えるように記載しました。

さて、前回のコードでは課題にも記載した通りEC2の数が増減した場合にLambdaコードの修正が必要となってしまうため管理が煩雑になっています。

今回はメンテナンスフリー(EC2が増減してもLambdaの修正が不要!)な
コードでEC2の自動停止を実現します。

今回もAIに質問しながらコードを実装しました。

Q1)東京リージョンで稼働するすべてのEC2を日本時間の午前1時に停止したいです。LambdaでPythonコードを書くとどうなりますか

A1)EC2インスタンスを停止するPythonコードをLambdaで実行することができます。以下のコードは、東京リージョンで稼働するすべてのEC2インスタンスを日本時間の午前1時に停止します。

import boto3
import datetime

def lambda_handler(event, context):
    ec2 = boto3.resource('ec2', region_name='ap-northeast-1')
    instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    for instance in instances:
        instance.stop()
    print('stopped instances: ' + str([instance.id for instance in instances]))

上記を素直にLambdaに実装してDeployしてテストします。

すると、あらら、停止したEC2のインスタンスIDが最後の1つ分しかログに出力されないではないですか!?

Response
null

Function Logs
START RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd Version: $LATEST
stopped instances: ['i-xxxxxxxxxxxxxxxxx']
END RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd
REPORT RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd Duration: 4062.28 ms Billed Duration: 4063 ms Memory Size: 128 MB Max Memory Used: 84 MB Init Duration: 256.80 ms

これでは、どのEC2を停止したのかログから追えませんので
AIに文句(笑)を言ってみました。

Q2)ありがとう。教えてくれたコードだと最後に停止処理を行ったインスタンスIDしかログに表示されないみたいだけど、停止処理を行ったすべてのインスタンスIDをログに出力するには、コードをどのように修正すればいいですか

A2)ログにすべての停止したインスタンスIDを表示するには、以下のようにコードを修正できます。

import boto3
import datetime

def lambda_handler(event, context):
    ec2 = boto3.resource('ec2', region_name='ap-northeast-1')
    instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    stopped_instances = []
    for instance in instances:
        instance.stop()
        stopped_instances.append(instance.id)
    print('stopped instances: ' + str(stopped_instances))

素直にコードをコピペしてDeployとテストを行います。
するとどうでしょう!?

いとも簡単にやりたいことが実現できました。

Function Logs
START RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd Version: $LATEST
stopped instances: ['i-xxxxxxxxxxxxxxxxx', 'i-xxxxxxxxxxxxxxxxx', 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx, 'i-xxxxxxxxxxxxxxxxx]
END RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd
REPORT RequestId: a53c70fb-3bdf-435e-84fa-cbfe7d9d8dfd Duration: 4062.28 ms Billed Duration: 4063 ms Memory Size: 128 MB Max Memory Used: 84 MB Init Duration: 256.80 ms

ここまでの所要時間は3分です!

まとめ

今回学んだことは、コードの書き方を覚えるよりも

  • いかにAIに正確な情報を与えられるか?
  • テストした結果をAIにフィードバックして欲しい情報を導き出せるか

という点が重要になってくると筆者は確信しました!

皆さんはどのようなご意見でしょうか?
コメントやいいねをいただけると励みになりますのでお願いいたします。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?