Hallo. Wie geht es dir?
Wenn alte Videos im Internet verbreitet werden, Sie werden es mit Nostalgie sehen. Nostalgie ist nur Unterhaltung.
Es gab eine solche Beschreibung, was für ein Inhalt ist das? Wenn Sie Python hören, erinnert es Sie an einen muskulösen Black Boxer. Diese Person heißt in der Übersee-Version Barlog, nicht wahr?
handler.py
from util import logging_decorator, build_response_decorator, get_logger
import app
logger = get_logger('INFO')
@logging_decorator
def xxxx_handler(event, context):
return app._token(event)
from util import logging_decorator, build_response_decorator, get_logger
logging_decorator, build_response_decorator, get_logger
aus dem Modul util
(wörtlich übersetzte Assembly-Einheit: hier wird util.py im Voraus erstellt). Erklärtutil.py
in / layer / python /
gespeichert (der Inhalt von util.py wird weggelassen).
――Wenn sich util.py
in einer anderen Hierarchie als handler.py
befindet, warum können Sie es aufrufen, ohne den Pfad zur Datei zu schreiben?$ {self: custom.requirements_layer}
] geschrieben (https://qiita.com/han-aru/items/4fda3b471c0310edff1e#--selfcustomshared_layers)
――Die aufzurufende Bibliothek wurde in einer gemeinsamen Ebene gespeichert (wörtlich "Ebene" und "Hierarchie").
――Die Bereitstellung dauert anders als das Bereitstellen (Hochladen der für AWS erforderlichen Einstellungen und Dateien). Durch diese Unterteilung wird die Zeit verkürzt.import app
logger = get_logger('INFO')
@logging_decorator
--@
ist einDekorateur (die Person, die für die Dekoration der Verkaufsfläche, des Vitrinen und des Schaufensters verantwortlich ist)
und [eine Funktion zum Hinzufügen oder Ändern der Verarbeitung zu einer vorhandenen Funktion]( https://www.sejuku.net/blog/25130#:~:text=%E3%83%87%E3%82%B3%E3%83%AC%E3%83%BC%E3%82%BF% E3% 81% A8% E3% 81% AF% E3% 80% 81% E3% 81% 99% E3% 81% A7% E3% 81% AB% E3% 81% 82% E3% 82% 8B,% E5 % 87% BA% E6% 9D% A5% E3% 82% 8B% E3% 82% 88% E3% 81% 86% E3% 81% AB% E3% 81% AA% E3% 82% 8A% E3% 81 % BE% E3% 81% 99% E3% 80% 82)
def xxxx_handler(event, context):
--def ist eine Abkürzung für define in English
. Das ist richtig (es wurde mit Default verwechselt).
--xxxx_handler und die Argumente event und context werden in der definierten Funktion aufgerufen
return app._token(event)
_token
Warum wird hier _
vorangestellt?Es gab eine solche Beschreibung. Python für Serverless Framework. Ich habe es auch ziemlich versteckt gemacht (xxx), also tut es mir leid, wenn der Variablenfluss falsch ist. Verwenden Sie für den Verarbeitungsinhalt die angegebene ID und das angegebene Kennwort, rufen Sie die Token-Informationen (JSON-Format) vom angegebenen Speicherort ab und Es extrahiert nur die Token-Informationen und registriert sie im Parameterspeicher.
app.py
import json
import boto3
import requests
import os
def _token(event):
try:
# ===================================================================
#Token-Erfassungsprozess
# ===================================================================
#Verwenden Sie boto3 und verwenden Sie den Parameterspeicher
client = boto3.client('ssm')
#Holen Sie sich einen geheimen Schlüssel
# get_Holen Sie sich den Wert des Parameters mit Parameter
response_get = client.get_parameter(
Name = '/xxx/xxxx/xxxx',
WithDecryption = True
)
client_secret_get = response_get['Parameter']['Value']
#Liste der Schlüssel, die erforderlich sind, um Token zu erhalten
CLIENT_SECRET = xxxxx_xxxx_get
CLIENT_ID = os.environ['XXXX']
XXXX_URL = "https://xxxxx/xxxx"
#In diesem Sommer haben wir den Schlüssel bekommen
xxxx_xxxx_key = {
'xxxx_secret': XXXX_SECRET,
'xxxx_id': XXXX_ID,
}
#Greifen Sie auf Token-Informationen zu und geben Sie die erforderlichen Informationen ein
response_xxxx = requests.post(XXXX_URL, data=xxxx_xxxx_key)
#Token-Informationen ausgeben
#Das Ergebnis ist im JSON-Format, dekodieren Sie es also
xxxx_data = json.loads(response_xxxx.text)
#Extrahieren Sie nur den Wert des Zugriffstokens aus den Tokeninformationen
xxxx_xxxx_data = xxxx_data.get('access_token')
# ===================================================================
#Die oben erhaltenen Token-Informationen- AWS Systems Manager -An Parameterspeicher senden
# ===================================================================
# put_Aktualisieren Sie den Parameterwert mit dem Parameter
response_put = client.put_parameter(
Name = '/xxxx/xxxx',
Value = xxxx_xxxx_xxxx,
Type = 'SecureString',
Overwrite = True
)
import json
import boto3
import requests --Requests ist Pythons HTTP-Kommunikationsbibliothek, mit der Informationen auf Websites leicht abgerufen und Bilder gesammelt werden können Richtig. --Auch Python hat standardmäßig eine Bibliothek namens urllib, aber Requests ist einfacher als das, und Sie können Programme auf eine Weise schreiben, die für die Leute leicht zu sehen und zu verstehen ist / 19195) Das stimmt. Hmm! Es ist eine gute Sache
import os
def _token(event): ――Ich erinnere mich an def früher
Dies ist die Funktion, die handler.py aufzurufen versucht. --event ist ein formales Argument Name der Variablen, die beim Definieren der Funktion in Klammern gesetzt werden soll
try:
Es gibt eine "try-Except-Anweisung" und ["Ausnahmeverarbeitung: Verarbeitung, wenn zur Laufzeit ein Fehler auftreten kann, auch wenn Sie grammatikalisch korrekten Code schreiben"](https: // www.sejuku.net/blog/23044) Richtig
Tatsächlich wird nach der Beschreibung "try:" Folgendes als "Fehlerbehandlung" hinzugefügt (der Inhalt hier wird hier eines Tages weggelassen ...)
#Fehlerbehandlung
except Exception as error:
data = {'request': event}
logger.exception(error, extra=dict(data))
return_params = {
'message': 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.{}'.format(str(error))
}
return {
'statusCode': 500,
'body': return_params
}
Mit anderen Worten: Wenn eine Ausnahme in dem im try-Block geschriebenen Code auftritt, wird der im Except-Block geschriebene Prozess ausgeführt Scheint zu sein
client = boto3.client('ssm')
Der boto3.client
bedeutet hier [wenn Sie die Client-API verwenden, rufen Sie zuerst boto3.client auf ('service name = ssm: Amazon Simple Systems Manager')" (https: //dev.classmethod. jp / articles / boto3-client-api-und-resource-api /)
Die offizielle boto3-Dokumentation Ein Low-Level-Client, der Amazon Simple Systems Manager (SSM) repräsentiert:
Übrigens lautet die hier angezeigte "Low Level API" Low Level → Sie können feine Dinge angeben (= Sie müssen feine Zweige selbst steuern), High Level → Sie müssen nur angeben, was Sie tun möchten ( = Es wird verwendet, um zu bedeuten (Sie können keine Details angeben) Das ist richtig.
response_get = client.get_parameter(
――Zunächst ging ich im Voraus zum Parameter-Speicherbildschirm und registrierte den Schlüssel, den ich im Voraus erhalten hatte.
――Wir erstellen es auf einem solchen Bildschirm (der Name ist leicht zu verstehen, die Erklärung ist leicht zu verstehen und der Schlüssel wird mit einer standardmäßigen und sicheren Zeichenfolge in das Wertefeld geschrieben).
Danach wird der registrierte Schlüssel (JIjlksjdfaijklaIJ + IJ ... eine Zeichenfolge wie diese) mit der Funktion get_parameter abgerufen.
Name = '/xxx/xxxx/xxxx',
Schreiben Sie hier den registrierten Namen
――Der Grund, warum /
hier geschrieben wird, ist, dass Sie /
in den Namen einfügen, es überschneidet sich nicht mit anderen registrierten Schlüsseln und es ist eine Notation, dass dieser Schlüssel zu einer Hierarchie gehört. Zum leichteren Verständnis
WithDecryption = True
Dies ist [Rückgabe des Werts für den Parameternamen, der durch WithDecryption = True zusammengesetzt und im Parameterspeicher gespeichert wird](https://dev.classmethod.jp/articles/get-data-from-system-manager-parameter -store-using-boto3-ja /)
Da es bei der Registrierung verschlüsselt wurde, wird es hier entschlüsselt. "Entschlüsselung" ist ein Wort, das sich auf die Operation selbst bezieht, daher wird es nicht als "Entschlüsselung" bezeichnet. Tu es nicht
)
Geschlossene Klammern
client_secret_get = response_get['Parameter']['Value']
-Warum die Liste mit ['Parameter'] ['Wert'] teilen? ――Es gibt nicht viele Informationen (welche Art von Wort suchen Sie?), Aber [['Spam', 'Schinken'] + ['Ei'] # Liste kombinieren](https://pycamp.pycon.jp/textbook / 4_collections.html # use-list)
Ich habe es nicht ausprobiert, aber "[" Parameter "," Wert "]" Ich dachte, das wäre in Ordnung, aber hier bedeutet es "[" Parameter ", um den" Wert "-Teil von" in "Parameter" zu erhalten. ] ['Wert'] `und die Liste können getrennt werden
Andere ['Parameter'] [0] ['Wert']
Ich habe eine solche Beschreibung gefunden, aber dies ist ['Spam', 'Schinken', 'Ei'] [0] #Liste Holen Sie sich den 0. von
[Die Parameter sind hierarchisch organisiert, daher ist es für mich sinnvoll, wie ein Wörterbuch in einem Wörterbuch darauf zuzugreifen](https://medium.com/@nqbao/how-to-use-aws- Es sieht aus wie ssm-parameter-store-easy-in-python-94fda04fea84)
[Geben Sie den Schlüsselwert von Abschnitt 1 aus](https://qiita.com/kikuchiTakuya/items/53990fca06fb9ba1d8a7#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88 % E3% 81% 9A% E4% BD% 95% E3% 81% 8B% E5% 80% A4% E3% 82% 92% E5% 8F% 96% E3% 82% 8A% E5% 87% BA% E3 % 81% 97% E3% 81% A6% E3% 81% BF% E3% 82% 8B) Die Liste scheint geteilt zu sein.
CLIENT_SECRET = xxxxx_xxxx_get
Setzen Sie hier den oben erhaltenen geheimen Schlüssel auf eine Variable namens "CLIENT_SECRET" ("number", obwohl es sich um ein Zeichen handelt).
CLIENT_ID = os.environ['XXXX']
Verwenden Sie hier das erste importierte "os"
os.environ () wird verwendet, um Umgebungsvariablen abzurufen, zu schreiben und zu überschreiben Richtig.
Auf dem Lambda-Funktionsbildschirm wird hier die ID abgerufen, die in die Umgebungsvariable geschrieben und in serverless.yml geschrieben wurde (XXXX hat tatsächlich den Namen der Umgebungsvariablen geschrieben).
XXXX_URL = "https://xxxxx/xxxx"
Ich habe die URL des Speicherorts des Tokens in eine Variable namens "XXXX_URL" eingefügt
xxxx_xxxx_key = {
'xxxx_secret': XXXX_SECRET,
'xxxx_id': XXXX_ID,
Hier verwenden wir den Wörterbuchtyp der Liste und setzen die Schlüssel in der Variablen "xxxx_xxxx_key" zusammen.
Es ist nicht gut für die Sicherheit, den geheimen Schlüssel und die ID zu schreiben, die erforderlich sind, um das Token an derselben Stelle abzurufen (Hardcodierung: [Es ist besser, den Prozess und den Wert separat an einer anderen Stelle zu schreiben. Quellcode Schreiben Sie es direkt in [https://wa3.i-3-i.info/word12866.html)). Teilen Sie also den geheimen Schlüssel in den Parameterspeicher und die ID in die Lambda-Umgebungsvariable. Da ich mich registriert habe, brauche ich eine Beschreibung, um sie zu bekommen
}
-}: Wave Bracket (Namikakko), [Derzeit ist "Wave Bracket" dem Namen "Middle Bracket" vorzuziehen](https://business-textbooks.com/type-of -Parenthesis / # toc-7)
response_xxxx = requests.post(XXXX_URL, data=xxxx_xxxx_key)
Senden Sie formularcodierte Daten wie HTML-Formulare. Übergeben Sie dazu einfach ein Wörterbuch in das Datenargument. Das Datenwörterbuch wird automatisch formularcodiert, wenn eine Anfrage gestellt wird --Ich habe mehrere Schlüssel in den Wörterbuchtyp eingefügt, daraus eine Variable namens "xxxx_xxxx_key" gemacht und diese Variable als Argument für "Daten" übergeben.
xxxx_data = json.loads(response_xxxx.text)
――Sie können das Token hier tatsächlich erhalten, aber es war im sogenannten JSON-Format.
Json lädt dekodiert (konvertiert in einen verwaltbaren Typ) eine Zeichenfolge Richtig.
In Erwartung dessen verwenden wir hier die Funktion "json.loads" von "import json", um es in einer Zeile aufzurufen.
Warum fügst du nach response_xxxx .text
hinzu?
Sie können den Antworttext im Textformat abrufen, indem Sie .text für die Antwort verwenden
Der Antworttext ist der Ort, an dem "der Inhalt der Datei, die die andere Partei wollte" geschrieben wird »Übrigens war ich überrascht, dass json.load und json.loads unterschiedlich sind. json.dump und json.dumps unterscheiden sich ebenfalls.
xxxx_xxxx_data = xxxx_data.get('access_token')
Holen Sie sich den Inhalt als access_token
von xxxx_data geschrieben
--Für den Teil .get
[können Sie die Methode get () verwenden, um einen beliebigen Wert (Standardwert) abzurufen, ohne einen Fehler zu verursachen, wenn der Schlüssel nicht vorhanden ist](https: //note.nkmk. ich / python-dict-get /)
Gibt den Wert für key zurück, wenn sich key im Wörterbuch befindet, andernfalls standardmäßig. Wenn keine Standardeinstellung angegeben ist, wird standardmäßig Keine verwendet. Daher löst diese Methode keinen KeyError aus. ――Warum soll "KeyError" nicht angezeigt werden? Ich möchte nicht, dass es angezeigt wird, weil es ein Fehler ist
Das Programm wird zwangsweise beendet, wenn KeyError ausgegeben wird Ja, ich möchte nicht, dass es angezeigt wird.
response_put = client.put_parameter(
――Die diesmal den Inhalt, den Sie oben erhalten haben, einfügen (einfügen, einfügen). ――Der Mechanismus ist der gleiche wie get_parameter.
Name = '/xxxx/xxxx',
Der Name des Parameterspeichers, den Sie einfügen möchten (/ ist enthalten, aber es ist nicht die URL, sondern die hier festgelegte Namensregel)
Value = xxxx_xxxx_xxxx,
Schreiben Sie hier eine leicht verständliche Erklärung
Type = 'SecureString',
Das ist interessant, und wenn es "String" ist, wird das Zeichen so gesendet, wie es ist, aber wenn es "SecureString" ist, wird es "*****" sein. »Es ist Sicherheit
Overwrite = True
Dieses Mal schreiben wir den Token einmal pro Woche neu, daher ist das Überschreiben in Ordnung.
)
――Warum ist das nicht eine Wellenklammer?
['Spam', 'Ei', 0.5]
](https: //pycamp.pycon. jp / textbook / 4_collections.html)('Spam', 'Ham', 4)
](https: //pycamp.pycon) zu trennen .jp / textbook / 4_collections.html)user_info = {'user_name': 'taro', 'last_name': 'Yamada'}
](https://pycamp.pycon.jp/textbook/4_collections .html) scheint
―― Mit anderen Worten, das vorherige ist im Wörterbuchformat und dies ist im Tapple-Format (Elemente, für die keine Schlüssel erforderlich sind und die Sie unveränderlich machen möchten).Ich zitierte und verwies auf den Link auf dieser Seite, Wir möchten uns bei den Autoren der offiziellen Dokumente und Artikel bedanken. Vielen Dank.
Nun, zu diesem Zeitpunkt passierte so etwas als nächstes.
Nach der Bereitstellung, egal wie oft ich es versucht habe, ist der Test auf dem Lambda-Bildschirm fehlgeschlagen
!
Die Python-Version, die ich in Lambda (dh serverless.yml) festgelegt hatte, war 3.8, Als ich lokal bearbeitete, war die Python-Umgebung 3.7. Ich dachte, es würde auf den neuesten Stand wechseln, wenn es bereitgestellt wird (außerhalb des lokalen Bereichs), aber das war nicht der Fall. Ich habe die Python-Version der lokalen Umgebung, an der ich arbeite, auf 3.8 festgelegt und bereitgestellt, und es hat einwandfrei funktioniert. Bitte seien Sie auch vorsichtig.
Recommended Posts