Отправлять уведомления SNS в Slack

#amazon-web-services #aws-lambda #amazon-sns #slack-api

#amazon-веб-сервисы #aws-lambda #amazon-sns #slack-api

Вопрос:

Я хотел бы отправлять уведомления SNS в Slack. Я получаю уведомления на свою электронную почту. Это выглядит как:

 Instance: i-0f9606e41cd6f1e8e has changed state
State: running
Type: c5.4xlarge
Public IP Address: 52.32.193.26
Private IP Address: 10.10.75.168
Region: us-west-2a
Name: VOSaaS-Cluster-SaaS-Longevity-055ba27d-f7c4-b70a-0954-a08ae21ccb2d-vos-node-i-0f9606e41cd6f1e8e
  

Но я также хочу получать тот же вывод на свой канал Slack. Я уже настроил входящие веб-ссылки и могу получать простые сообщения, но у меня проблема с отправкой выходных данных.

 MY_SNS_TOPIC_ARN = 'arn:aws:sns:us-west-2:421572644019:CloudWatchAlarmsForSpotInstances'
sns_client = boto3.client('sns')
ec2_spot_info = sns_client.publish(
    TopicArn = MY_SNS_TOPIC_ARN,
    Subject = 'EC2 Spot Instances Termination Notifications',
    Message =   'Instance: '   instance_id   ' has changed staten'  
                'State: '   instance['State']['Name']   'n'  
                'Type: '   instance['InstanceType']   'n'  
                'Public IP Address: '   instance['PublicIpAddress']   'n'  
                'Private IP Address: '   instance['PrivateIpAddress']   'n'  
                'Region: '   instance['Placement']['AvailabilityZone']   'n'  
                'Name: '   name
)

slack_url='https://hooks.slack.com/services/ token'
slack_msg = {
                "attachments": [
                    {
                        "title": "EC2 Spot Instance Info",
                        "pretext": "EC2 Spot Instances Termination Notifications",
                        "color": "#ed1717",
                        "text": ec2_spot_info
                    }
                ]
            }
output = json.dumps(slack_msg)
r = requests.post(slack_url, data = output)
  

Ответ №1:

sns_client.publish() Вызов возвращает ответ:

 {
    'MessageId': 'string'
}
  

Тем не менее, ваша команда slack отправляет это в виде сообщения:

 "text": ec2_spot_info
  

Это означает, что вместо отправки сообщения в slack вы отправляете словарь, содержащий MessageId .

Вместо этого вам следует:

  • Сконструировать message как переменную
  • Вызов sns_client.publish() с Message = message
  • Вызовите slack с помощью "text": message

Ответ №2:

При подписке на Slack wehbook с помощью SNS возникает проблема. Slack не может преобразовать / прочитать полезную нагрузку, поступающую из SNS. Вам придется немного поднапрячься, чтобы прочитать SubscribeURL/Message . Сначала попробуйте использовать чисто раздел SNS с каналом slack.

Вы можете использовать SLACK workflow вместе с SNS.

Смотрите видео, в котором наглядно показаны все шаги. https://www.youtube.com/watch?v=CszzQcPAqN

Шаги, которые необходимо выполнить:

  • Создайте канал slack или используйте существующий канал
  • Создайте рабочий процесс, выбрав Webhook
  • Создайте имя переменной как «SubscribeURL». Название очень важно
  • Добавьте указанную выше переменную в текст сообщения рабочего процесса
  • Опубликуйте рабочий процесс и получите URL
  • Добавьте указанный выше URL-адрес в качестве подписки на SNS
  • Вы увидите URL подписки в канале slack
  • Перейдите по URL-адресу и завершите подписку
  • Вернитесь к рабочему потоку и измените переменную на «Сообщение»
  • Опубликовать сообщение в SNS. вы увидите сообщение в канале slack.