Ich habe ChatOps mit Slack x API Gateway x Lambda (Python) x RDS ausprobiert

Hintergrund

Technologie-Stack verwendet

Annahme

Der Kürze halber wurde bereits Folgendes getan, und wir werden fortfahren.

--Seed-Datei ist bereits in S3 vorhanden

Gesamtbild

Durch Ausführen eines Befehls von Slack zu Bot mit dem folgenden Gefühl werden die Daten in der Verifizierungsumgebung wiedergegeben und eine Abschlussbenachrichtigung wird an Slack zurückgegeben. スクリーンショット 2019-12-18 11.29.36.png

Implementierung

① Machen Sie Lambda

Erstellen Sie eine Funktion

--Öffnen Sie Create Function von Lambda, um eine neue Funktion zu erstellen --Wählen Sie "Von Grund auf neu erstellen" --Erstellen Sie eine neue Ausführungsrolle

スクリーンショット 2019-12-18 11.54.17.png

Schreiben Sie Python-Code

Als Prozess sieht es so aus. Der konstante Teil ist wie das Lesen des Wertes, der in der Umgebungsvariablen von Lambda eingestellt ist.

lambda_function.py


import json
import logging
import os
import psycopg2
import boto3
import re
import urllib.request

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

#PostgreSQL-Verbindungseinstellungen
def get_pg_con():
  return psycopg2.connect(
    host=os.getenv('DB_HOST'),
    database=os.getenv('DB_NAME'),
    port=os.getenv('DB_PORT'),
    user=os.getenv('DB_USER'),
    password=os.getenv('DB_PASSWORD'))

#Seed-Datei von S3 abrufen
def get_seed_file_from_s3():
  bucket_name = os.getenv('S3_BUCKECT_NAME')
  file_name = os.getenv('S3_TARGET_FILE_NAME')
  s3 = boto3.client('s3')
  response = s3.get_object(Bucket=bucket_name, Key=file_name)
  return response['Body'].read().decode('utf-8')

#Führen Sie die Seed-Datei zu RSD aus
def exec_seed():
  str_sql = get_seed_file_from_s3()
  conn = get_pg_con()
  cur = conn.cursor()
  cur.execute("BEGIN")
  #Wenn Sie die von S3 erhaltene Datei einfügen, wird die SQL in der Datei von oben ausgeführt.
  cur.execute(str_sql)
  conn.commit()
  cur.close()
  conn.close()

#Antworte auf locker
def post_message_to_channel(channel, message):
  url = "https://slack.com/api/chat.postMessage"
  headers = {
    "Content-Type": "application/json",
    "Authorization": "Bearer {0}".format(os.getenv('SLACK_BOT_USER_ACCESS_TOKEN'))
  }

  data = {
    "token": os.getenv('SLACK_BOT_USER_ACCESS_TOKEN'),
    "channel": channel, #Benachrichtigen Sie den Kanal, der Seed ausgeführt hat
    "text": message,
  }
  req = urllib.request.Request(url, data=json.dumps(data).encode("utf-8"), headers=headers, method="POST")
  with urllib.request.urlopen(req) as response:
    #Schreiben Sie das Ausführungsergebnis in das Protokoll
    response_body = response.read().decode("utf-8")
    logger.info(response_body)

#Überprüfen Sie die Token, die Slack sendet, wenn Sie Lambda treffen
def is_verified_token(event):
  token = event.get("token")
  if token != os.environ["SLACK_BOT_VERIFY_TOKEN"]:
    return False
  return True

#Überprüfen Sie, ob Sie das Schlüsselwort Seed Execution in Slack gesetzt haben
#Diesmal"run"Führen Sie Seed aus, wenn der Wortlaut enthalten ist
def is_mached_pattern(text):
  pattern = r"run"
  result = re.search(pattern, text)
  if result:
    return True
  return False

#Einstiegspunkt
def lambda_handler(event, context):
  #Tauchen Sie den Anforderungsinhalt vorerst in das Protokoll
  logging.info(json.dumps(event))

  #Slack Event API-Authentifizierung
  if "challenge" in event:
    return event["challenge"]

  #Token überprüfen
  if not is_verified_token(event):
    logger.info("token is not verified!!!")
    return "OK"

  target_channel = event.get("event").get("channel")
  #In der Nachricht von Slack empfangen"run"Gibt INFO-Informationen zurück, wenn kein Wortlaut vorhanden ist
  request_text = event.get("event").get("text")
  if not is_mached_pattern(request_text):
    post_message_to_channel(target_channel, "*[INFO]*Schreiben Sie, wie man leicht benutzt:muscle:")
    return

  post_message_to_channel(target_channel, "Ich werde es tun!")

  try:
    exec_seed()
    post_message_to_channel(target_channel, "Hat vervollständigt!:rocket:")
  except Exception as e:
    logger.info(e)
    post_message_to_channel(event.get("event").get("channel"), e)

② API-Gateway erstellen

③ Machen Sie eine lockere App

--Erstellen Sie eine App für Bot unter https://api.slack.com/apps

④ Überprüfen Sie den Betrieb

――Wenn Sie das folgende Gefühl haben, schlagen Sie den Bot aus der Ruhe und erhalten Sie eine Antwort, und Sie sind fertig!

スクリーンショット 2019-12-18 11.17.53.png

Impressionen

andere Referenzen

Um psycopg2 (wo Seed von Python zu RDS ausgeführt wird)

Zusammenarbeit zwischen Slack und Lambda

Recommended Posts

Ich habe ChatOps mit Slack x API Gateway x Lambda (Python) x RDS ausprobiert
LINE BOT mit Python + AWS Lambda + API Gateway
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
Nehmen Sie schnell eine Abfragezeichenfolge mit API Gateway-> Lambda (Python)
Ich habe versucht, Follow Management mit Twitter API und Python (einfach)
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
[AWS] API mit API Gateway + Lambda erstellen
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe einen Twitter-Bot mit Go x Qiita API x Lambda erstellt
Ich habe versucht, alle Bemerkungen von Slack mit Wordcloud (Python) zusammenzufassen.
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Wrangle x Python Buch Ich habe es versucht [2]
Einfacher Slack API-Client mit Python
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe versucht, die UnityCloudBuild-API von Python zu verwenden
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Wrangle x Python Buch Ich habe es versucht [1]
Einfache REST-API mit API Gateway / Lambda / DynamoDB
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, schlechte Tweets regelmäßig mit der AWS Lambda + Twitter API zu löschen
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, die Mastodon-API mit Ruby (Faraday) / Python (Pycurl) / PHP (Curl) zu erreichen.
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
[AWS SAM] Erstellen Sie eine API mit DynamoDB + Lambda + API Gateway
Zeigen Sie Bilder in S3 mit API Gateway + Lambda an
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe "License OCR" mit der Google Vision API ausprobiert
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Beispiel für eine Slack-Benachrichtigung mit Python Lambda
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
[AWS] Versuchen Sie, API Gateway + Lambda mit X-Ray zu verfolgen
Exportieren Sie den RDS-Snapshot mit Lambda (Python) nach S3.
Ich habe versucht, AWS Lambda mit anderen Diensten zu verbinden
Ich habe "Receipt OCR" mit der Google Vision API ausprobiert
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Amazon API Gateway und AWS Lambda Python-Version
[Python] Erwähnen Sie mit der Slack-API mehrere Personen
Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python optimiert werden kann
Ich habe untersucht, wie der Arbeitsablauf mit Excel x Python ④ optimiert werden kann
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen