Bonjour. Comment ça va?
Lorsque d'anciennes vidéos sont diffusées sur le net, Vous le verrez avec nostalgie. La nostalgie n'est qu'un divertissement.
Il y avait une telle description, de quel type de contenu s'agit-il? Lorsque vous entendez Python, cela vous rappelle un boxeur noir musclé. Cette personne s'appelle Barlog dans la version d'outre-mer, n'est-ce pas?
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 et get_logger
du module nommé ʻutil` (littéralement, l'unité d'assemblage: util.py est créée à l'avance). Déclareest stocké dans
/ layer / python / (le contenu de util.py sera omis). ――Lorsque ʻutil.py
est dans une hiérarchie différente de handler.py
, pourquoi pouvez-vous l'appeler sans écrire le chemin du fichier?$ {self: custom.requirements_layer}
―― La bibliothèque à appeler était stockée dans une couche commune (littéralement, «couche» et «hiérarchie»).
―― Cela prend du temps autre que le déploiement (téléchargement des paramètres et des fichiers requis pour AWS), donc la subdivision de cette manière réduira le temps.import app
logger = get_logger('INFO')
@logging_decorator
--@
est undécorateur (la personne chargée de décorer la surface de vente, la vitrine et la vitrine)
, et [une fonction pour ajouter ou modifier le traitement d'une fonction existante]( 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 est une abréviation pour define en anglais
. C'est vrai (il a été confondu avec Default).
--xxxx_handler et l'événement et le contexte des arguments sont appelés dans la fonction définie
return app._token(event)
_token
Pourquoi est-ce préfixé par _
?Il y avait une telle description. Python utilisé pour Serverless Framework. Je l'ai également fait assez caché (xxx), donc je suis désolé si le flux de variables est incorrect. Pour le traitement du contenu, ʻutiliser l'ID et le mot de passe spécifiés, obtenir les informations de jeton (format json) à partir de l'emplacement spécifié, et C'est un `qui extrait uniquement les informations de jeton et les enregistre dans le magasin de paramètres.
app.py
import json
import boto3
import requests
import os
def _token(event):
try:
# ===================================================================
#Processus d'acquisition de jetons
# ===================================================================
#Utilisez boto3 et utilisez le magasin de paramètres
client = boto3.client('ssm')
#Obtenir la clé secrète
# get_Récupère la valeur du paramètre avec le paramètre
response_get = client.get_parameter(
Name = '/xxx/xxxx/xxxx',
WithDecryption = True
)
client_secret_get = response_get['Parameter']['Value']
#Liste des clés nécessaires pour obtenir des jetons
CLIENT_SECRET = xxxxx_xxxx_get
CLIENT_ID = os.environ['XXXX']
XXXX_URL = "https://xxxxx/xxxx"
#Cet été nous avons la clé
xxxx_xxxx_key = {
'xxxx_secret': XXXX_SECRET,
'xxxx_id': XXXX_ID,
}
#Accédez aux informations du jeton et saisissez les informations requises
response_xxxx = requests.post(XXXX_URL, data=xxxx_xxxx_key)
#Informations sur le jeton de sortie
#Le résultat est au format JSON, donc décodez-le
xxxx_data = json.loads(response_xxxx.text)
#Extraire uniquement la valeur du jeton d'accès à partir des informations de jeton
xxxx_xxxx_data = xxxx_data.get('access_token')
# ===================================================================
#Les informations de jeton obtenues ci-dessus- AWS Systems Manager -Envoyer au magasin de paramètres
# ===================================================================
# put_Mettre à jour la valeur du paramètre avec le paramètre
response_put = client.put_parameter(
Name = '/xxxx/xxxx',
Value = xxxx_xxxx_xxxx,
Type = 'SecureString',
Overwrite = True
)
import json
import boto3
import requests --Requests est la bibliothèque de communication HTTP de Python, qui facilite l'obtention d'informations sur les sites Web et la collecte d'images C'est vrai.
import os
def _token(event): ――Je me souviens plus tôt
C'est la fonction que handler.py essaie d'appeler. --event est un argument formel nom de la variable à mettre entre parenthèses lors de la définition de la fonction
try:
--Il existe une instruction try-except
, et [" Traitement des exceptions: traitement lorsqu'une erreur peut se produire lors de l'exécution même si vous écrivez du code grammaticalement correct "](https: // www.sejuku.net/blog/23044) C'est vrai
En fait, ce qui suit est ajouté comme "gestion des erreurs" après la description try:
(le contenu ici est omis ici, un jour ...)
#La gestion des erreurs
except Exception as error:
data = {'request': event}
logger.exception(error, extra=dict(data))
return_params = {
'message': 'Une erreur est survenue. Veuillez réessayer l'opération.{}'.format(str(error))
}
return {
'statusCode': 500,
'body': return_params
}
En d'autres termes, Si une exception se produit dans le code écrit dans le bloc try, le processus écrit dans le bloc except est exécuté Semble être
client = boto3.client('ssm')
--Le boto3.client
signifie ici [lors de l'utilisation de l'API client, appelez d'abord boto3.client ('service name = ssm: Amazon Simple Systems Manager')" (https: //dev.classmethod. jp / articles / boto3-client-api-et-ressource-api /)
La documentation officielle de boto3 Un client de bas niveau représentant Amazon Simple Systems Manager (SSM):
Au fait, l'API de bas niveau qui apparaît ici est Bas niveau → Vous pouvez spécifier de petites choses (= vous devez contrôler vous-même les branches fines), Haut niveau → Il vous suffit de spécifier ce que vous voulez faire ( = Cela signifie (vous ne pouvez pas spécifier de détails) C'est vrai.
response_get = client.get_parameter(
―― Tout d'abord, je suis allé à l'écran de stockage des paramètres à l'avance et j'ai enregistré la clé que j'ai reçue à l'avance.
――Nous le créerons sur un tel écran (le nom est facile à comprendre, l'explication est facile à comprendre et la clé est écrite dans le champ de valeur avec une chaîne de caractères standard et sûre)
Après cela, la clé enregistrée (JIjlksjdfaijklaIJ + IJ ... une chaîne de caractères comme celle-ci) est récupérée avec la fonction get_parameter.
Name = '/xxx/xxxx/xxxx',
Écrivez le nom enregistré ici
――La raison pour laquelle /
est écrit ici est que vous mettez /
dans le nom, il ne chevauche pas d'autres clés enregistrées, et c'est une notation que cette clé appartient à la hiérarchie. Pour faciliter la compréhension
WithDecryption = True
--Ceci est [Renvoyer la valeur du nom de paramètre complexé par WithDecryption = True et stocké dans le magasin de paramètres](https://dev.classmethod.jp/articles/get-data-from-system-manager-parameter -store-using-boto3-ja /)
Comme il a été crypté lors de son enregistrement, il sera décrypté ici "Décrypter" est un mot qui fait référence à l'opération elle-même, il ne s'appelle donc pas "Décrypter". Ne le faites pas
)
--Parenthèses fermées
client_secret_get = response_get['Parameter']['Value']
-Pourquoi diviser la liste avec ['Paramètre'] ['Valeur']? ――Il n'y a pas beaucoup d'informations (quel genre de mot recherchez-vous?), Mais [['spam', 'ham'] + ['egg'] # Combine list](https://pycamp.pycon.jp/textbook / 4_collections.html # use-list)
Je ne l'ai pas essayé, mais ['Parameter', 'Value']
Je pensais que c'était bien, mais ici cela signifie ['Parameter' pour obtenir la partie
Value du paramètre ʻin
Parameter '. ] ['Value'] ʻet la liste peut être séparée
--Other ['Parameter'] [0] ['Value']
J'ai trouvé une telle description, mais c'est ['spam', 'ham', 'egg'] [0] #list Obtenez le 0e de
[Les paramètres sont organisés hiérarchiquement, il est donc logique pour moi d'y accéder comme un dictionnaire dans un dictionnaire](https://medium.com/@nqbao/how-to-use-aws- Cela ressemble à ssm-parameter-store-easy-in-python-94fda04fea84)
[Valeur de la clé de sortie de section1](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) Il semble que la liste soit divisée.
CLIENT_SECRET = xxxxx_xxxx_get
Ici, définissez la clé secrète obtenue ci-dessus sur une variable appelée CLIENT_SECRET
( number
même s'il s'agit d'un caractère).
CLIENT_ID = os.environ['XXXX']
Ici, nous utilisons le premier ʻos` importé
os.environ () est utilisé pour obtenir, écrire et écraser les variables d'environnement C'est vrai.
Sur l'écran de la fonction Lambda, l'ID écrit dans la variable d'environnement déployée et écrite dans serverless.yml est obtenu ici (XXXX a en fait le nom de la variable d'environnement écrit).
XXXX_URL = "https://xxxxx/xxxx"
--Je mets l'URL de l'emplacement du token dans une variable appelée XXXX_URL
xxxx_xxxx_key = {
'xxxx_secret': XXXX_SECRET,
'xxxx_id': XXXX_ID,
Ici, nous utilisons le type dictionnaire de la liste et regroupons les clés dans la variable xxxx_xxxx_key
.
--Il n'est pas bon pour la sécurité d'écrire la clé secrète et l'ID requis pour obtenir le jeton au même endroit (codage en dur: [Il est préférable d'écrire le processus et la valeur séparément dans un autre endroit Code source Écrivez-le directement dans [https://wa3.i-3-i.info/word12866.html)), divisez donc la clé secrète dans le magasin de paramètres et l'ID dans la variable d'environnement Lambda. Depuis que je me suis inscrit, j'ai besoin d'une description pour les obtenir
}
-}: Wave bracket (Namikakko), [Actuellement, "wave bracket" est préférable au nom "middle bracket"](https://business-textbooks.com/type-of -parenthesis / # toc-7)
response_xxxx = requests.post(XXXX_URL, data=xxxx_xxxx_key)
Envoyez des données codées par formulaire, comme des formulaires HTML. Pour ce faire, passez simplement un dictionnaire dans l'argument data. Le dictionnaire de données est automatiquement codé au format lorsqu'une requête est effectuée
--Je mets plusieurs clés dans le type de dictionnaire, j'en fais une variable appelée xxxx_xxxx_key
, et je passe cette variable comme argument de data
.
xxxx_data = json.loads(response_xxxx.text)
――Vous pouvez en fait obtenir le jeton ici, mais c'était au format dit JSON.
Json charge décode (convertit en un type gérable) une chaîne C'est vrai.
Donc, en prévision de cela, nous utilisons ici la fonction json.loads
de ʻimport json` pour l'appeler sur une seule ligne.
Pourquoi ajoutez-vous .text
après response_xxxx?
Vous pouvez obtenir le corps de la réponse au format texte en utilisant .text pour la réponse
Le corps de la réponse est l'endroit où "le contenu du fichier que l'autre partie voulait" est écrit ―― Au fait, j'ai été surpris que json.load et json.loads soient différents. json.dump et json.dumps sont également différents.
xxxx_xxxx_data = xxxx_data.get('access_token')
Récupère le contenu écrit comme ʻaccess_tokenà partir de xxxx_data --Pour la partie
.get`, [vous pouvez utiliser la méthode get () pour obtenir une valeur arbitraire (valeur par défaut) sans provoquer d'erreur si la clé n'existe pas](https: //note.nkmk. moi / python-dict-get /)
Renvoie la valeur de la clé si la clé est dans le dictionnaire, par défaut dans le cas contraire. Si aucune valeur par défaut n'est donnée, la valeur par défaut est Aucun. Par conséquent, cette méthode ne lève pas de KeyError.
――Pourquoi ne voulez-vous pas que KeyError
apparaisse? Je ne veux pas qu'il apparaisse car c'est une erreur
Le programme est arrêté de force lorsque KeyError est sorti Oui, je ne veux pas qu'il apparaisse.
response_put = client.put_parameter(
―― Cette fois, mettez (mettez, collez) le contenu que vous avez obtenu en haut. ―― Le mécanisme est le même que get_parameter.
Name = '/xxxx/xxxx',
Le nom du magasin de paramètres que vous souhaitez mettre (/ est inclus, mais ce n'est pas l'URL mais la règle de dénomination décidée ici)
Value = xxxx_xxxx_xxxx,
Écrivez une explication facile à comprendre ici
Type = 'SecureString',
Ceci est intéressant, et s'il s'agit de «String», le caractère sera envoyé tel quel, mais s'il s'agit de «SecureString», ce sera «*****». ――C'est la sécurité
Overwrite = True
――Cette fois, nous réécrivons le jeton une fois par semaine, donc l'écrasement est OK.
)
――Pourquoi n'est-ce pas une tranche d'onde?
['spam', 'egg', 0.5]
](https: //pycamp.pycon. jp / textbook / 4_collections.html)('spam', 'ham', 4)
](https: //pycamp.pycon .jp / textbook / 4_collections.html)J'ai cité et renvoyé au lien sur cette page, Nous remercions les auteurs des documents et articles officiels. Merci beaucoup.
Eh bien, à ce stade, quelque chose comme ça s'est produit ensuite.
Peu importe combien de fois j'ai essayé, après le déploiement, le test sur l'écran Lambda a échoué
!
La version Python que j'avais définie dans Lambda (c'est-à-dire serverless.yml) était 3.8, Lorsque je modifiais localement, l'environnement Python était 3.7. Je pensais qu'il passerait à la dernière lors du déploiement (loin du local), mais ce n'était pas le cas. J'ai défini la version Python de l'environnement local sur lequel je travaille sur 3.8 et je l'ai déployée, et cela a bien fonctionné. Soyez également prudent.
Recommended Posts