Der Kürze halber wurde bereits Folgendes getan, und wir werden fortfahren.
--Seed-Datei ist bereits in S3 vorhanden
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.
--Ö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
** [Stolperpunkt] ** Da Lambda auf RDS zugreift, öffnen Sie den Bearbeitungsbildschirm und geben Sie die gleiche VPC wie RDS über "Netzwerk" unten an.
Auch wenn Sie von Lambda aus auf RDS zugreifen, ohne dies einzustellen, tritt eine Zeitüberschreitung auf ...
** [Stolperpunkt] ** Ich habe Lambda in derselben VPC wie RDS installiert, um auf RDS oben zuzugreifen. Da ich jedoch standardmäßig nicht von diesem Status aus auf S3 zugreifen kann, endet die VPC für S3 wie folgt Punkte machen
** [Stolperpunkt] ** Wenn das Ausführungsergebnis von Lambda an Slack zurückgegeben wird, gibt Lambda eine Nachricht über das Internet zurück. Zu diesem Zweck ist die angegebene VPC jedoch ein NAT-Gateway (oder eine NAT-Instanz) zum öffentlichen Subnetz. Sie müssen haben, also setzen Sie dies bitte unter Bezugnahme auf das Folgende
Wie erlaube ich den Internetzugang zu den Lambda-Funktionen von VPC?
Wenn Sie dies nicht tun, können Sie von Lambda aus nicht auf das Internet zugreifen und das Verarbeitungsergebnis nicht melden (es tritt eine Zeitüberschreitung in Lambda auf.)
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)
Dieses Mal möchte ich auf RDS zugreifen (unter der Annahme von PostgreSQL), daher benötige ich eine Bibliothek namens psycopg2. Anders als in der Standardbibliothek von Python ist es erforderlich, sie in eine Zip-Datei umzuwandeln und in Lambda hochzuladen. Lesen Sie daher die folgenden Informationen und komprimieren Sie die obige Python-Datei und psycopg2 in der lokalen Umgebung und laden Sie sie in Lambda hoch.
No module named 'psycopg2._psycopg': ModuleNotFoundError in AWS Lambda
Es ist einfach, die psycopg2-Bibliothek zu erhalten, indem Sie hier verweisen (in der Antwort eingeführt).
So erstellen Sie eine Zip-Datei zum Hochladen auf Lambda
Geben Sie beim Hochladen mit zip den Einstiegspunkt an, der beim Lambda-Start in handler
mit file name.method name
ausgeführt werden soll.
Sie können sehen, dass die hochgeladene Datei psycopg2
enthält.
Um Lambda von Slack aus ausführen zu können, muss über das API-Gateway zugegriffen werden. Erstellen Sie daher das API-Gateway.
Zu diesem Zeitpunkt werden auch API Gateway und Lambda miteinander verbunden. ―― Insbesondere denke ich, dass es sehr leicht zu verstehen ist, wenn Sie sich auf Folgendes beziehen
[ChatOps mit Slack und Lambda ausprobieren Schritt 2: API-Gateway erstellen](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)
Das erstellte API-Gateway testet das Lambda und gibt eine Antwort zurück, die bereit ist.
--Erstellen Sie eine App für Bot unter https://api.slack.com/apps
――Wenn Sie das folgende Gefühl haben, schlagen Sie den Bot aus der Ruhe und erhalten Sie eine Antwort, und Sie sind fertig!