2016-06-03 4 views
0

Как создать будильник, когда 1) Оповещение, когда экземпляр EC2 работает слишком долго (скажите в течение 1 часа). 2) Предупреждение, когда количество экземпляров EC2 достигает порогового значения (например, по 5 экземпляров за раз)Создание аварийного сигнала в AWS для экземпляров EC2

Еще одно предположение состоит в том, что эти экземпляры EC2 являются конкретными. Рассматривайте эти предупреждения применительно к экземплярам EC2, где их имя экземпляра начинается с «теста ».

Когда я пытаюсь создать будильник, я не вижу эту логику в метриках. Стандартные показатели включают использование ЦП, сетевое подключение, сетевой выход и т. Д.

Есть ли способ создать этот аварийный сигнал либо путем определения наших пользовательских показателей, либо некоторых других параметров?

+1

Вы изучили документацию по облачным наблюдениям? Их apis, которые позволяют вам публиковать показатели – Shibashis

+0

@Shibashis просмотрел публичные показатели. Но я не уверен, где определены логики показателей. Eg: http://docs.aws.amazon.com/cli/latest /reference/cloudwatch/put-metric-data.html, я использую только метрическое имя, статистические выходы и единицы измерения. Но я хочу, предположим, что метрическое имя - EC2InstanceHealthDuration (означает, как долго экземпляры EC2 запускались до его запуска). Должны быть некоторые скрипты unix о логике, которую выполняет имя метрики. Пожалуйста, дайте мне знать, где я могу найти то же самое. – Vasanth

+0

cloudwatch только собирает статистику и позволяет создавать оповещения на них. Вам нужно будет создать скрипты для просмотра того, как долго экземпляр был вставлен, а затем нажмите эту метрику в cloudwatch. Если вы не хотите разрабатывать такую ​​логику, вам может потребоваться рассмотреть другое программное обеспечение, такое как datadog, новая реликвия, nagios и т. Д. – Shibashis

ответ

0

Для автоматически развернутых экземпляров невозможно установить CloudWatch Alarm, поскольку вы не знаете идентификатор экземпляра. Единственный способ настроить будильник состоял в том, чтобы создать функцию AWS Lambda, которая проверяет все запущенные экземпляры и сравнивает их время запуска с заданным таймаутом.

Функция лямбда периодически запускается с помощью CloudWatch - Event – Rule.

Используйте tags, чтобы указать различные длительности прогона на разные машины. Например, ваш инструмент запуска должен пометить экземпляр значением ключа «Тест»

Обратите внимание, что этот код поставляется с NO гарантий вообще! Это скорее пример.

import boto3 
import datetime 
import json 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 

ec2_client = boto3.client('ec2') 

INSTANCE_TIMEOUT = 24 
MAX_PERMITTED_INSTANCES = 5 
MAILING_LIST = "[email protected], [email protected]" 

def parse_tag(tags, keyValuePair): 
    for tag in tags: 
     if tag['Key'] == keyValuePair[0] and tag['Value'] == keyValuePair[1]: 
      return True 
    return False 

def runtimeExceeded(instance, timeOutHours): 
    # Working in to UTC to avoid time-travel during daylight-saving changeover 
    timeNow = datetime.datetime.utcnow() 
    instanceRuntime = timeNow - instance.launch_time.replace(tzinfo=None) 
    print instanceRuntime 
    if instanceRuntime > datetime.timedelta(hours=timeOutHours): 
     return True 
    else: 
     return False 

def sendAlert(instance, message): 
    msg = MIMEMultipart() 
    msg['From'] = '[email protected]' 
    msg['To'] = MAILING_LIST 
    msg['Subject'] = "AWS Alert: " + message 
    bodyText = '\n\nThis message was sent by the AWS Monitor ' + \ 
     'Lambda. For details see AwsConsole-Lambdas. \n\nIf you want to ' + \ 
     'exclude an instance from this monitor, tag it ' + \ 
     'with Key=RuntimeMonitor Value=False' 

    messageBody = MIMEText(message + '\nInstance ID: ' + 
        str(instance.instance_id) + '\nIn Availability zone: ' 
        + str(instance.placement['AvailabilityZone']) + bodyText) 
    msg.attach(messageBody) 

    ses = boto3.client('ses') 
    ses.send_raw_email(RawMessage={'Data' : msg.as_string()}) 

def lambda_handler(event, context): 
    aws_regions = ec2_client.describe_regions()['Regions'] 
    for region in aws_regions: 
     runningInstancesCount = 0 
     try: 
      ec2 = boto3.client('ec2', region_name=region['RegionName']) 
      ec2_resource = boto3.resource('ec2', 
          region_name=region['RegionName']) 
      aws_region = region['RegionName'] 

      instances = ec2_resource.instances.all() 

      for i in instances: 
       if i.state['Name'] == 'running': 
        runningInstancesCount +=1 
        if i.tags != None: 
         if parse_tag(i.tags, ('RuntimeMonitor', 'False')): 
          # Ignore these instances 
          pass 
         else: 
          if runtimeExceeded(i, INSTANCE_TIMEOUT): 
           sendAlert(i, "An EC2 instance has been running " + \ 
           "for over {0} hours".format(INSTANCE_TIMEOUT)) 
        else: 
         print "Untagged instence" 
         if runtimeExceeded(i, UNKNOWN_INSTANCE_TIMEOUT): 
           sendAlert(i, "An EC2 instance has been running " + \ 
           "for over {0} hours".format(UNKNOWN_INSTANCE_TIMEOUT)) 

     except Exception as e: 
      print e 
      continue 

     if runningInstancesCount > MAX_PERMITTED_INSTANCES: 
      sendAlert(i, "Number of running instances exceeded threshold " + \ 
        "{0} running instances".format(runningInstancesCount)) 

    return True 
0

Вы можете использовать специальный показатель для публикации событий в CloudWatch, а затем вы можете использовать это событие, чтобы установить сигнал.