Lambda无法用于具有自动缩放功能的ec2 [英] Lambda not working for ec2 with auto-scaling

查看:53
本文介绍了Lambda无法用于具有自动缩放功能的ec2的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

AWS Lambda之后的工作按预期进行[即ec2实例的"ec2实例停止和启动",它们不属于任何自动伸缩组,但不适用于属于自动伸缩组的ec2实例.

Following AWS Lambda is working as expected [i.e. ec2 instance stop and start] for ec2 instances, which are not part of any auto-scaling group, but it is not working for ec2 instances which are part of auto-scaling group.

对于属于自动扩展组的ec2实例,将重新启动ec2实例,再次运行.

For ec2 instances, which are part of auto-scaling group, ec2 instances are re-launched & running again.

AWS Lambda代码如下;

AWS Lambda code is as follows;

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实例也必须停止和启动.

Could you please assist to resolve this issue? I would like to make sure that ec2 instances which are part of auto-scaling must also stop and start as well.

推荐答案

以下是一种解决方法.您可能需要根据设置重新分解一些代码.

Following is kind of work-around. You might need to re-factor some code as per your setup.

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
        )

这篇关于Lambda无法用于具有自动缩放功能的ec2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆