python-3.x - Lambda 不适用于具有自动缩放功能的 ec2
问题描述
AWS Lambda 对不属于任何自动扩展组的 ec2 实例按预期工作 [即 ec2 实例停止和启动],但它不适用于属于自动扩展组的 ec2 实例。
对于属于自动扩展组的 ec2 实例,ec2 实例将重新启动并再次运行。
AWS Lambda 代码如下;
import boto3
ec2 = boto3.client('ec2')
def lambda_handler(event, context):
action_handler(event['action'])
def get_ec2_instances():
ec2_int = ec2.describe_instances(
Filters=[{
'Name': 'ops',
'Values': [
'cost-save'
]
}]
)
return ec2_int
def action_handler(action):
ec2_instances = get_ec2_instances()
for reservation in ec2_instances['Reservations']:
for ec2_instance in reservation['Instances']:
if action == "stop":
stop_ec2(ec2_instance)
elif action == "start":
start_ec2(ec2_instance)
def stop_ec2(ec2_int):
if ec2_int['State']['Name'] == 'running':
ec2.stop_instances(InstanceIds=[ec2_int['InstanceId']])
def start_ec2(ec2_int):
if ec2_int['State']['Name'] == 'stopped':
ec2.start_instances(InstanceIds=[ec2_int['InstanceId']])
你能帮忙解决这个问题吗?我想确保作为自动缩放一部分的 ec2 实例也必须停止和启动。
解决方案
以下是一种解决方法。您可能需要根据您的设置重构一些代码。
import boto3
ec2 = boto3.client('ec2')
auto_scaling_group_client = boto3.client('autoscaling')
# TODO Refactor auto_scaling_group_processes list as per your setup
auto_scaling_group_processes = ['Launch',
'Terminate',
'HealthCheck',
'ReplaceUnhealthy',
'ScheduledActions',
'AddToLoadBalancer',
'AlarmNotification',
'AZRebalance']
def lambda_handler(event, context):
action_handler(event['action'])
def get_ec2_instances():
ec2_int = ec2.describe_instances(
Filters=[{
'Name': 'ops',
'Values': [
'cost-save'
]
}]
)
return ec2_int
def action_handler(action):
ec2_instances = get_ec2_instances()
auto_scaling_groups_to_resume = set()
# TODO Can refactor logic added related to auto_scaling
for reservation in ec2_instances['Reservations']:
for ec2_instance in reservation['Instances']:
auto_scaling_group_name = get_auto_scaling_group_name(ec2_instance['InstanceId'])
if action == "stop":
suspend_processes(auto_scaling_group_name)
stop_ec2(ec2_instance)
elif action == "start":
auto_scaling_groups_to_resume.add(auto_scaling_group_name)
start_ec2(ec2_instance)
resume_auto_scaling_group_processes(auto_scaling_groups_to_resume)
def stop_ec2(ec2_int):
if ec2_int['State']['Name'] == 'running':
ec2.stop_instances(InstanceIds=[ec2_int['InstanceId']])
def start_ec2(ec2_int):
if ec2_int['State']['Name'] == 'stopped':
ec2.start_instances(InstanceIds=[ec2_int['InstanceId']])
def resume_processes(auto_scaling_group_name):
if auto_scaling_group_name is not None:
auto_scaling_group_client.resume_processes(
AutoScalingGroupName=auto_scaling_group_name,
ScalingProcesses=auto_scaling_group_processes
)
# TODO Can refactor
def get_auto_scaling_group_name(ec_int_id):
auto_scaling_group = auto_scaling_group_client.describe_auto_scaling_instances(
InstanceIds=[
ec_int_id
]
)
for auto_scaling_int in auto_scaling_group['AutoScalingInstances']:
return auto_scaling_int['AutoScalingGroupName']
# TODO Can refactor
def resume_auto_scaling_group_processes(auto_scaling_groups):
for auto_scaling_group in auto_scaling_groups:
resume_processes(auto_scaling_group)
def suspend_processes(auto_scaling_group_name):
if auto_scaling_group_name is not None:
auto_scaling_group_client.suspend_processes(
AutoScalingGroupName=auto_scaling_group_name,
ScalingProcesses=auto_scaling_group_processes
)
推荐阅读
- excel - 如何将价格乘以正确的货币价值
- python - 动态调整 QListView 项的图标大小
- node.js - 如何让 pm2 进程在停止/重新启动后观看?
- airflow - 使用参数调用函数并从 bashoperator 返回
- azure-cognitive-search - Azure 搜索自动完成模糊
- java - 在payara服务器域中,我应该如何配置不同的java版本
- android - 如何在android中将文本居中对齐?线性布局
- c# - 刚体圆周运动
- r - 如何在终端的脚本中显示 r 中的绘图
- c# - 无法正确绑定 Kendo Multi Select 以读取和写入多对多剃须刀模型