千家信息网

Lambda,AWS和Python的自动化管理操作 - 自动开机和关机

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,上一篇豆子已经配置在PyCharm里面添加了boto3和pyboto3,因此写脚本的时候可以直接在自己的PyCharm里面编写。下面是一个例子遍历所有的region查找EC2,如果状态是开机,那就关掉
千家信息网最后更新 2025年02月01日Lambda,AWS和Python的自动化管理操作 - 自动开机和关机

上一篇豆子已经配置在PyCharm里面添加了boto3和pyboto3,因此写脚本的时候可以直接在自己的PyCharm里面编写。

下面是一个例子遍历所有的region查找EC2,如果状态是开机,那就关掉;或者倒过来也可以写成 如果是关机状态,就开机。

import boto3def lambda_handler(event, context):    # Get list of regions    ec2_client = boto3.client('ec2')    regions = [region['RegionName']               for region in ec2_client.describe_regions()['Regions']]    # Iterate over each region    for region in regions:        ec2 = boto3.resource('ec2', region_name=region)        print("Region:", region)        # Get only running instances        instances = ec2.instances.filter(            Filters=[{'Name': 'instance-state-name',                      'Values': ['running']}])        #Stop the instances        for instance in instances:            instance.stop()            print('Stopped instance: ', instance.id)        # instances = ec2.instances.filter(        #     Filters=[{'Name': 'instance-state-name',        #               'Values': ['stopped']}])        #        # for instance in instances:        #     instance.start()        #     print('Start instance: ', instance.id)if __name__ == '__main__':    lambda_handler(0,0)

执行一下是工作的

C:\Users\yuan\PycharmProjects\aws\venv\Scripts\python.exe C:/Users/yuan/PycharmProjects/aws/StopInstance.pyRegion: eu-north-1Region: ap-south-1Region: eu-west-3Region: eu-west-2Region: eu-west-1Region: ap-northeast-2Region: ap-northeast-1Region: sa-east-1Region: ca-central-1Region: ap-southeast-1Region: ap-southeast-2Stopped instance:  i-0bb70cc9666ce2af3Region: eu-central-1Region: us-east-1Stopped instance:  i-00e9dc7c254dbe497Region: us-east-2Region: us-west-1Region: us-west-2

然后我们在aws的Lambda里创建一个新的函数, 这里我已经自定义了一个role了,确保这个role可以对ec2有开机和关机的权限

IAM的权限如下所示:

{  "Version": "2012-10-17",  "Statement": [    {      "Effect": "Allow",      "Action": [        "logs:CreateLogGroup",        "logs:CreateLogStream",        "logs:PutLogEvents"      ],      "Resource": "arn:aws:logs:*:*:*"    },    {      "Effect": "Allow",      "Action": [        "ec2:DescribeInstances",        "ec2:DescribeRegions",        "ec2:StartInstances",        "ec2:StopInstances"      ],      "Resource": "*"    }  ]}

拷贝函数上来

接下来 在cloudwatch里面添加一个新的rule

创建向导,这里选择schedule,这里使用 cron的表达式,注意他是GMT的时间,因此需要自己和本地时间转换一下

写好之后他会有个友好的提示界面

完成创建

回到Lambda的界面, 可以看见他的触发器多了一个CloudWatch Events

等待执行之后,可以查看日志

也可以确认EC2 服务 的确关机了

0