J'ai essayé ChatOps avec Slack x API Gateway x Lambda (Python) x RDS

Contexte

Pile technologique utilisée

supposition

Par souci de brièveté, ce qui suit a déjà été fait et nous allons continuer.

Vue d'ensemble

En exécutant une commande de slack à bot avec la sensation suivante, les données sont reflétées dans l'environnement de vérification et une notification d'achèvement est renvoyée à slack. スクリーンショット 2019-12-18 11.29.36.png

la mise en oeuvre

① Faire du lambda

Créer une fonction

--Ouvrez Create Function depuis lambda pour créer une nouvelle fonction --Sélectionnez Créer à partir de zéro --Créer un nouveau rôle d'exécution --Je veux accéder à S3, donc j'accorderai des droits d'accès S3 après la création (comme Amazon S3 FullAccess)

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

Ecrire du code Python

En tant que processus, cela ressemble à ceci. La partie constante est comme lire la valeur définie dans la «variable d'environnement» de lambda.

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)

#Paramètres de connexion PostgreSQL
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'))

#Obtenir le fichier de base de S3
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')

#Exécuter le fichier d'amorçage vers RSD
def exec_seed():
  str_sql = get_seed_file_from_s3()
  conn = get_pg_con()
  cur = conn.cursor()
  cur.execute("BEGIN")
  #Si vous insérez le fichier obtenu à partir de S3, le SQL dans le fichier sera exécuté par le haut.
  cur.execute(str_sql)
  conn.commit()
  cur.close()
  conn.close()

#Répondre à slack
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, #Notifier le canal qui a exécuté Seed
    "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:
    #Ecrire le résultat de l'exécution dans le journal
    response_body = response.read().decode("utf-8")
    logger.info(response_body)

#Vérifiez les jetons que Slack envoie lorsque vous appuyez sur lambda
def is_verified_token(event):
  token = event.get("token")
  if token != os.environ["SLACK_BOT_VERIFY_TOKEN"]:
    return False
  return True

#Vérifiez si vous mettez le mot-clé d'exécution Seed dans Slack
#Cette fois"run"Exécuter Seed si le libellé est inclus
def is_mached_pattern(text):
  pattern = r"run"
  result = re.search(pattern, text)
  if result:
    return True
  return False

#Point d'accès
def lambda_handler(event, context):
  #Pour le moment, plongez le contenu de la requête dans le journal
  logging.info(json.dumps(event))

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

  #Vérifier le jeton
  if not is_verified_token(event):
    logger.info("token is not verified!!!")
    return "OK"

  target_channel = event.get("event").get("channel")
  #Dans le message reçu de slack"run"Renvoie les informations INFO s'il n'y a pas de libellé
  request_text = event.get("event").get("text")
  if not is_mached_pattern(request_text):
    post_message_to_channel(target_channel, "*[INFO]*Ecrire comment utiliser légèrement:muscle:")
    return

  post_message_to_channel(target_channel, "Je vais le faire!")

  try:
    exec_seed()
    post_message_to_channel(target_channel, "A completé!:rocket:")
  except Exception as e:
    logger.info(e)
    post_message_to_channel(event.get("event").get("channel"), e)

② Créer une passerelle API

③ Créez une application Slack

--Créez une application pour bot à partir de https://api.slack.com/apps

④ Vérifiez le fonctionnement

――Avec le sentiment suivant, frappez le bot de mou et obtenez une réponse et vous avez terminé! --Invitez le bot sur le canal cible et tapez la commande (cette fois, j'ai créé un bot nommé @ genkan-dev-seed)

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

Impressions

Autres références

Autour de psycopg2 (où Seed est exécuté de Python vers RDS)

Coopération entre slack et lambda

Recommended Posts

J'ai essayé ChatOps avec Slack x API Gateway x Lambda (Python) x RDS
LINE BOT avec Python + AWS Lambda + API Gateway
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé de gratter avec du python
J'ai essayé de frapper l'API avec le client python d'echonest
Prenez rapidement une chaîne de requête avec API Gateway-> Lambda (Python)
J'ai essayé la gestion du suivi avec l'API Twitter et Python (facile)
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
[AWS] Créer une API avec API Gateway + Lambda
J'ai essayé webScraping avec python.
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai créé un bot Twitter avec Go x Qiita API x Lambda
J'ai essayé de résumer les remarques de tout le monde sur le slack avec wordcloud (Python)
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
Livre Wrangle x Python Je l'ai essayé [2]
Client API Slack simple réalisé avec Python
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé d'utiliser l'API UnityCloudBuild de Python
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
Livre Wrangle x Python Je l'ai essayé [1]
API REST facile avec API Gateway / Lambda / DynamoDB
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé de supprimer régulièrement les mauvais tweets avec l'API AWS Lambda + Twitter
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé de frapper l'API Mastodon avec Ruby (Faraday) / Python (Pycurl) / PHP (Curl)
J'ai essayé de "lisser" l'image avec Python + OpenCV
[AWS SAM] Créer une API avec DynamoDB + Lambda + API Gateway
Afficher les images sur S3 avec API Gateway + Lambda
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé "License OCR" avec l'API Google Vision
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
Exemple de notification Slack avec python lambda
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
[AWS] Essayez de tracer API Gateway + Lambda avec X-Ray
Exporter un instantané RDS vers S3 avec Lambda (Python)
J'ai essayé de connecter AWS Lambda à d'autres services
J'ai essayé "Receipt OCR" avec l'API Google Vision
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'envoyer un email avec SendGrid + Python
Version Amazon API Gateway et AWS Lambda Python
[Python] Mention à plusieurs personnes avec l'API de Slack
Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ②
J'ai étudié comment rationaliser le flux de travail avec Excel x Python ④
J'ai essayé d'implémenter Mine Sweeper sur un terminal avec python
J'ai essayé de démarrer avec le script python de blender_Part 01