Jetons un coup d'œil à Python ligne par ligne (pour obtenir des jetons avec Python, enregistrer / mettre à jour le magasin de paramètres, tester l'échec après le déploiement-succès)

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.

Précédemment à propos de Serverless Framework, Python, etc. Tout en apprenant en voyant et en écoutant des experts Je me suis souvenu en expérimentant diverses nouvelles choses Ces découvertes? Impressions? Je voudrais le laisser ici.

Tout d'abord, jetons un coup d'œil à handler.py ligne par ligne.

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

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)


Ensuite, jetons un œil à app.py ligne par ligne.

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

#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
        }

--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 /)

―― 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.

image.png

――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)

image.png

--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 /)

--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 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,

-}: 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)

――Vous pouvez en fait obtenir le jeton ici, mais c'était au format dit JSON.

―― 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',

image.png

         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?


A la fin «C'était long cette fois aussi! ''

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é!

Pourquoi le test sur l'écran Lambda a-t-il é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

Jetons un coup d'œil à Python ligne par ligne (pour obtenir des jetons avec Python, enregistrer / mettre à jour le magasin de paramètres, tester l'échec après le déploiement-succès)
Envoyer un message à LINE avec Python (LINE Notify)
Lire ligne par ligne à partir d'un fichier avec Python