Par souci de brièveté, ce qui suit a déjà été fait et nous allons continuer.
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.
--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)
** [Stumbling point] ** Puisque lambda accède à RDS, ouvrez l'écran d'édition et spécifiez le même VPC que RDS depuis Network
en bas.
Même si vous accédez au RDS à partir de lambda sans régler cela, il expirera ...
** [Stumbling point] ** J'ai installé Lambda dans le même VPC que RDS pour accéder à RDS ci-dessus, mais comme je ne peux pas accéder à S3 à partir de cet état par défaut, le VPC se termine pour S3 en faisant référence à ce qui suit Faire des points
** [Stumbling point] ** Lors du renvoi du résultat de l'exécution de lambda vers slack, lambda renvoie un message via Internet, mais à cette fin, le VPC spécifié est une passerelle NAT (ou une instance NAT) vers le sous-réseau public. Vous devez avoir, veuillez donc définir en vous référant à
Comment autoriser l'accès Internet aux fonctions Lambda de VPC?
Si vous ne le faites pas, vous ne pourrez pas accéder à Internet depuis lambda et vous ne pourrez pas notifier à slack le résultat du traitement (il expirera dans lambda ..)
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)
Cette fois, je veux accéder à RDS (en supposant PostgreSQL), j'ai donc besoin d'une bibliothèque appelée psycopg2. À l'exception de la bibliothèque standard de Python, il est nécessaire de la transformer en fichier zip et de le télécharger sur lambda, alors reportez-vous à ce qui suit et zippez le fichier Python ci-dessus et psycopg2 dans l'environnement local et téléchargez-le sur lambda.
No module named 'psycopg2._psycopg': ModuleNotFoundError in AWS Lambda
Il est facile d'obtenir la bibliothèque psycopg2 en se référant ici (introduit dans la réponse)
Charger le module externe dans lambda --Comment créer un fichier zip pour le téléchargement vers lambda
Lors du téléchargement avec zip, spécifiez le point d'entrée à exécuter au démarrage de lambda dans handler
avec nom de fichier.nom de méthode
.
Vous pouvez voir que le fichier téléchargé contient psycopg2
.
Pour exécuter lambda à partir de slack, il est nécessaire d'accéder via API Gateway, alors créez API Gateway.
À ce stade, API Gateway et lambda seront également liés. ―― Plus précisément, je pense qu'il est très facile à comprendre si vous vous référez à ce qui suit
[Essayez ChatOps avec Slack et Lambda Étape 2: Créer une passerelle API](https://qiita.com/yasuabe2613/items/6219d243ffcfe7690e78#%E3%82%B9%E3%83%86%E3%83%83 % E3% 83% 97% EF% BC% 92-api-gateway-% E4% BD% 9C% E6% 88% 90)
La passerelle API créée teste le lambda et renvoie une réponse, qui est prête.
--Créez une application pour bot à partir de https://api.slack.com/apps
――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)
Recommended Posts