さくっとコピペでどうぞ
python
import json
import boto3
client = boto3.client('ec2')
def lambda_handler(event, context):
response = client.describe_instances(
Filters=[
{
'Name': 'instance-state-code',
'Values': [
'16',
]
},
]
)
targetInstances = []
for i in response['Reservations']:
targetInstances.append(i['Instances'][0]['InstanceId'])
if not targetInstances:
return "nothing target instances"
else:
response = client.stop_instances(
InstanceIds=targetInstances,
Force=True
)
return response
解説
desclibe_instancesで動作状態(Statuscode:16)のEC2インスタンスを全部取得して、そこからinstanceIDのみを配列にして、stop_instancesに渡して終わり。
環境に左右されない作りだと思うのでどこでも使えると思います。
強いて言うならEC2の台数が多くなると正常に動かないかも。(X>50?わかんない)
その場合はpagenatorとかで取得動作自体がループするAPIに差し替えれば行けるはず。
あと、LambdaからEC2のAPIを叩けるようなIAMの権限設定だけはお忘れなく。
EventBridgeでスケジューラ作って動かしたら幸せになれるかも。