Как показано на консоли 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