Назад | Перейти на главную страницу

Как настроить таргетинг на экземпляр с чем-то другим, кроме instanceID

Цель, которую я пытаюсь достичь, - у меня есть около 8 тестовых экземпляров, которые я хочу остановить, когда я не на работе, чтобы сэкономить деньги. затем запустите их снова, когда я вернусь к работе.

У меня есть функция, которая выполняет именно то, что мне нужно

import boto3
region = 'cn-north-1'
instances = ['i-xxxxxx', 'i-xxxxxxx', 'i-xxxxxx', 'i-xxxxxx', 'i-xxxxxxxx']
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    ec2.stop_instances(InstanceIds=instances)
    print('stopped your instances: ' + str(instances))

Проблема в том, что у меня есть неизменная политика развертывания на всех моих экземплярах, поэтому instances постоянно меняется, и мне придется обновлять функцию каждый день.

Есть ли способ настроить таргетинг по тегу или чему-то более универсальному, чтобы мне не приходилось обновлять функцию каждый день?

Я просмотрел документацию, но мне она непонятна https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ec2.html

Большинству людей следует использовать планировщик экземпляров, но вы не можете использовать его в регионе Китая.

Альтернативное решение

В Интернете есть десятки образцов, которые помогут вам в этом. Один из них является Вот. По сути, вместо жесткого кодирования идентификаторов экземпляров вы используете boto3 API для поиска экземпляров по тегам.

Эта функция также позволяет изменять время начала / окончания с помощью тегов. Вы можете взять части этого кода и изменить свой (полученный из Вот Думаю) включить его.

import boto3
import time

##
# First function will try to filter for EC2 instances that contain a tag named `Scheduled` which is set to `True`
# If that condition is meet function will compare current time (H:M) to a value of the additional tags which defines the trigger `ScheduleStop` or `ScheduleStart`.
# Value of the `ScheduleStop` or `ScheduleStart` must be in the following format `H:M` - example `09:00`  
# 
# In order to trigger this function make sure to setup CloudWatch event which will be executed every minute. 
# Following Lambda Function needs a role with permission to start and stop EC2 instances and writhe to CloudWatch logs.
# 
# Example EC2 Instance tags: 
# 
# Scheduled     : True
# ScheduleStart : 06:00
# ScheduleStop  : 18:00
##

#define boto3 the connection
ec2 = boto3.resource('ec2')

def lambda_handler(event, context):

    # Get current time in format H:M
    current_time = time.strftime("%H:%M")

    # Find all the instances that are tagged with Scheduled:True
    filters = [{
            'Name': 'tag:Scheduled',
            'Values': ['True']
        }
    ]

    # Search all the instances which contains scheduled filter 
    instances = ec2.instances.filter(Filters=filters)

    stopInstances = []   
    startInstances = []   

    # Locate all instances that are tagged to start or stop.
    for instance in instances:

        for tag in instance.tags:

            if tag['Key'] == 'ScheduleStop':

                if tag['Value'] == current_time:

                    stopInstances.append(instance.id)

                    pass

                pass

            if tag['Key'] == 'ScheduleStart':

                if tag['Value'] == current_time:

                    startInstances.append(instance.id)

                    pass

                pass

            pass

        pass

    print current_time

    # shut down all instances tagged to stop. 
    if len(stopInstances) > 0:
        # perform the shutdown
        stop = ec2.instances.filter(InstanceIds=stopInstances).stop()
        print stop
    else:
        print "No instances to shutdown."

    # start instances tagged to stop. 
    if len(startInstances) > 0:
        # perform the start
        start = ec2.instances.filter(InstanceIds=startInstances).start()
        print start
    else:
        print "No instances to start."

Стандартное решение

Это лучшее решение для большинства людей.

Использовать Планировщик экземпляров AWS, согласно этот учебник. Он запускает и останавливает экземпляры на основе тегов по заданному вами расписанию.

Я не собираюсь копировать и вставлять здесь статью, поскольку информация время от времени меняется, а AWS довольно хорошо поддерживает свою документацию в актуальном состоянии.