Как отправить электронное письмо с уведомлением из AWS в SlackPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как отправить электронное письмо с уведомлением из AWS в Slack

Сообщение Anonymous »

Вот наше требование: если какой-либо пользователь останавливает работающий экземпляр EC2, создает новый экземпляр или завершает работу любого экземпляра, он должен отправить уведомление в канал Slack.
Чтобы протестировав этот сценарий, мы создали новый канал Slack. Когда я запускаю команду Curl из локального компьютера, она отправляет сообщение в канал Slack.

Код: Выделить всё

curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/XXXXX/XXXXX/XXXXX
Чтобы протестировать тот же сценарий, который был опробован на локальном компьютере, он работает нормально.

Код: Выделить всё

import requests
import os

# Define the data to send in the Slack message
data = {
"text": "Hi, This is a test from Local"
}

# Get the Slack webhook URL from environment variables
webhook = os.environ.get("webhook_slack")

# Send the POST request to Slack
response = requests.post(webhook, json=data)

# Check and print the response status for debugging
print(f"Slack Response Status: {response.status_code}")
print(f"Slack Response Text: {response.text}")
Но когда мы пробуем это из Lambda, это не работает.
Мост событий AWS будет вызывать функцию Lambda, это работает нормально, Однако из Lambda не отправляется никаких уведомлений в Slack.

Код: Выделить всё

import json
import os
import urllib3

SLACK_WEBHOOK_URL = os.environ['SLACK_WEBHOOK_URL']
http = urllib3.PoolManager()

def lambda_handler(event, context):
# Log the entire event for debugging
print("Received event:", json.dumps(event))

# Extract details from EventBridge event
detail = event.get("detail", {})
instance_id = detail.get("instance-id")
state = detail.get("state")
region = event.get("region")

# Log extracted details
print(f"Instance ID: {instance_id}, State: {state}, Region: {region}")

# Define message based on instance state
if state == "running":
message = f"🚀 EC2 Instance {instance_id} has been created and is now running in {region}."
elif state == "stopped":
message = f"🛑 EC2 Instance {instance_id} has been stopped in {region}."
elif state == "terminated":
message = f"💥 EC2 Instance {instance_id} has been terminated in {region}."
else:
print("State does not match expected values. Exiting.")
return  # Exit if the state is not relevant

# Send notification to Slack
slack_message = {
"text": message
}
response = http.request(
"POST",
SLACK_WEBHOOK_URL,
body=json.dumps(slack_message),
headers={"Content-Type": "application/json"}
)

# Log the HTTP response status and data for debugging
print(f"Slack Response Status: {response.status}")
print(f"Slack Response Data: {response.data}")

if response.status != 200:
raise ValueError(
f"Request to Slack returned an error {response.status}, response is: {response.data}"
)

return {"status": "Notification sent successfully"}

Не знаю, в чем мы ошиблись, предоставили разрешение роли Lambda как доступ только для чтения EC2 и роль исполнения Lambda. даже не удалось найти сообщения об ошибках в журналах лямбда.
Мы сохраняем значения env в конфигурациях лямбда

Подробнее здесь: https://stackoverflow.com/questions/791 ... s-to-slack
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»