Попытка инициировать действие SSM: Выполнить команду, когда мой сигнал Cloudwatch переходит в состояние «ТРЕВОГА» - PullRequest
0 голосов
/ 25 июня 2019

Попытка активировать SSM: действие «Выполнить команду», когда мой будильник в облаке переходит в состояние «ТРЕВОГА». Я пытаюсь добиться этого с помощью правила Cloudwatch - шаблона событий и загрузки журналов API-интерфейса AWS Cloud Trail.

Пробовал с Мониторингом и именем события как "DescribeAlarms" и stateValue как "ALARM". Просто попытался добавить мою тему SNS (вместо SSM: RunCommand), чтобы убедиться, что она вызывает мне электронное письмо, когда он переходит в состояние ALARM, но не повезло.

```{
  "source": [
    "aws.monitoring"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "monitoring.amazonaws.com"
    ],
    "eventName": [
      "DescribeAlarms"
    ],
    "requestParameters": {
      "stateValue": [
        "ALARM"
      ]
    }
  }
}```

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

UPDATE:

Спасибо @Джон за разъяснения. Как вы предложили, я пытаюсь перейти с SNS-> Lambda-> SSM Run Command. Но я не могу получить идентификатор экземпляра из события SNS. Там написано [Records - Keyerror]. Прочитайте некоторые из ваших постов и перепробовал все. Но не в состоянии пройти. Не могли бы вы помочь?

Received event: {
"Records": [
{
"EventSource": "aws:sns",
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:eu-west-1:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"Sns": {
"Type": "Notification",
"MessageId": "********************c",
"TopicArn": "arn:aws:sns:eu-west-1:*******************************",
"Subject": "ALARM: \"!!! Critical Alert !!! Disk Space is going to be full in Automation Testing\" in EU (Ireland)",
"Message": "{\"AlarmName\":\"!!! Critical Alert !!! Disk Space is going to be full in Automation Testing\",\"AlarmDescription\":\"Disk Space is going to be full in Automation Testing\",\"AWSAccountId\":\"***********\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 out of the last 1 datapoints [**********] was less than or equal to the threshold (70.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"******************\",\"Region\":\"EU (Ireland)\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"disk_used_percent\",\"Namespace\":\"CWAgent\",\"StatisticType\":\"Statistic\",\"Statistic\":\"AVERAGE\",\"Unit\":null,\"Dimensions\":[{\"value\":\"/\",\"name\":\"path\"},{\"value\":\"i-****************\",\"name\":\"InstanceId\"},{\"value\":\"ami-****************\",\"name\":\"ImageId\"},{\"value\":\"t2.micro\",\"name\":\"InstanceType\"},{\"value\":\"xvda1\",\"name\":\"device\"},{\"value\":\"xfs\",\"name\":\"fstype\"}],\"Period\":300,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"LessThanOrEqualToThreshold\",\"Threshold\":70.0,\"TreatMissingData\":\"- TreatMissingData: missing\",\"EvaluateLowSampleCountPercentile\":\"\"}}",
"Timestamp": "2019-06-29T19:23:43.829Z",
"SignatureVersion": "1",
"Signature": "XXXXXXXXXXXX",
"SigningCertUrl": "https://sns.eu-west-1.amazonaws.com/XXXXXXXX.pem",
"UnsubscribeUrl": "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:eu-west-1XXXXXXXXXXXXXXXXXXXXX",
"MessageAttributes":
{}

}
}
]
}

Ниже моя лямбда-функция:

from __future__ import print_function
import boto3
import json
ssm = boto3.client('ssm')
ec2 = boto3.resource('ec2')

print('Loading function')

def lambda_handler(event, context):
    # Dump the event to the log, for debugging purposes
    print("Received event: " + json.dumps(event, indent=2))

    message = event['Records']['Sns']['Message']
    msg = json.loads(message)
    InstanceId = msg['InstanceId']['value']
    print ("Instance: %s" % InstanceId)

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Можно достичь с помощью следующих изменений:

from __future__ import print_function
import boto3
import json
ssm = boto3.client('ssm')
ec2 = boto3.resource('ec2')

print('Loading function')

def lambda_handler(event, context):
    # Dump the event to the log, for debugging purposes
    print("Received event: " + json.dumps(event, indent=2))
    message = json.loads(event['Records'][0]['Sns']['Message'])
    instance_id = message['Trigger']['Dimensions'][1]['value']
    print ("Instance: %s" % instance_id)
0 голосов
/ 26 июня 2019

Это, вероятно, не сработает, потому что AWS CloudTrail перехватывает только вызовы API для AWS , а перевод сигнала тревоги CloudWatch в состояние ALARM является внутренним изменением, равным не , вызванный вызовом API.

Я бы порекомендовал:

  • Тревога Amazon CloudWatch запускает функцию AWS Lambda
  • Функция Lambda вызывает команду запуска SSM (например, send_command())
...