Уведомление по электронной почте через SNS и Lambda - PullRequest
0 голосов
/ 06 сентября 2018

Я столкнулся с проблемой. Мой основной мотив - отправлять электронную почту всякий раз, когда происходит изменение состояния экземпляров ec2.

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

Я ожидал имя сервера и его IP-адрес в шаблоне электронной почты, который SNS не дает мне возможности изменить его. Так что я думаю о том, чтобы задействовать лямбду, чтобы

  • события cloudwatch для мониторинга изменения состояния экземпляров EC2 и
  • введите данные в Lambda, для которой будет настроен шаблон электронной почты
  • затем вызовите SNS для отправки электронной почты получателям.

Дайте мне знать, если вы считаете, что это правильный метод для того, что я ожидаю или нет. и дать некоторое представление о том, как получить Lambda между Cloud watch и SNS

Спасибо и всего наилучшего

1 Ответ

0 голосов
/ 06 сентября 2018

Как показано на консоли Amazon CloudWatch Events , пример события, вызванного изменением состояния экземпляра:

{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "EC2 Instance State-change Notification",
  "source": "aws.ec2",
  "account": "123456789012",
  "time": "2015-11-11T21:29:54Z",
  "region": "us-east-1",
  "resources": [
    "arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
  ],
  "detail": {
    "instance-id": "i-abcd1111",
    "state": "pending"
  }
}

События CloudWatch могут затем напрямую вызывать функцию AWS Lambda , передавая эту информацию.

Функция Lambda может использовать идентификатор экземпляра для получения дополнительной информации об экземпляре (например, имя сервера, IP-адрес).

Функция может затем:

  • Отправить текст в Amazon SNS Topic , который может пересылать информацию подписчикам (по электронной почте или SMS), ИЛИ
  • Отправка писем через Amazon Simple Email Service (SES) , который может отправлять письма со сложным форматированием

Использование SNS будет самым простым , если вы не возражаете против текстового контента.

Вот пример кода, который будет получать событие от Amazon CloudWatch Events , когда экземпляр изменяет состояние, а затем отправляет сообщение в тему Amazon SNS с дополнительной информацией:

import boto3

def lambda_handler(event, context):

    # Extract Instance ID from event
    instance_id = event['detail']['instance-id']

    # Obtain information about the instance
    ec2_client = boto3.client('ec2')
    instance_info = ec2_client.describe_instances(InstanceIds=[instance_id])
    instance = instance_info['Reservations'][0]['Instances'][0]

    # Extract name tag
    name_tags = [t['Value'] for t in instance['Tags'] if t['Key']=='Name']
    name = name_tags[0] if name_tags is not None else ''

    # Send message to SNS
    MY_SNS_TOPIC_ARN = 'arn:aws:sns:ap-southeast-2:123456789012:foo'
    sns_client = boto3.client('sns')
    sns_client.publish(
        TopicArn = MY_SNS_TOPIC_ARN,
        Subject = 'Instance Change State: ' + instance_id,
        Message = 'Instance: ' + instance_id + ' has changed state\n' +
                  'State: ' + instance['State']['Name'] + '\n' +
                  'IP Address: ' + instance['PublicIpAddress'] + '\n' +
                  'Name: ' + name
    )

Для настройки:

  • Создайте тему SNS для получения сообщения и вставьте тему ARN в код
  • Создать подписчика на тему SNS (проще всего через SMS при тестировании)
  • Создание функции AWS Lambda (показано выше)
  • Создайте событие Amazon CloudWatch для запуска изменения состояния экземпляра EC2 и установите целевое значение для функции Lambda
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...