[PYTHON] J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK

Quand j'ai partagé un long lien long, je voulais le raccourcir, donc après de nombreuses recherches, j'ai trouvé des tutoriels. J'ai créé un service de raccourcissement d'URL avec AWS Cloud Development Kit (CDK) Une histoire sur la création d'un service de raccourcissement d'URL qui peut être utilisé en interne à faible coût sans serveur Je l'ai créé une fois dans le dernier tutoriel, mais j'étais dégoûté que le paramètre de domaine personnalisé de CloudFront ne fonctionne pas et j'étais dégoûté de faire apparaître la console, alors j'ai fini par le personnaliser en fonction de l'ancien tutoriel.

Flux de création

installation et tutoriel cdk

Qu'est-ce qu'AWS CDK En termes simples, il s'agit d'un outil qui vous permet de créer les ressources dont vous avez besoin sur AWS à partir de fichiers écrits dans une langue que vous connaissez. Lors de l'écriture directe de CloudFormation, un fichier de paramètres est créé avec Json ou Yaml, mais il peut être remplacé par Python ou Typescript. Il est nécessaire de définir correctement certains IAM, mais personnellement, je l'aime parce que je peux l'écrire comme si je le disais. Cependant, le goulot d'étranglement est qu'il n'y a pas beaucoup d'échantillons, et si vous n'êtes pas familiarisé avec les termes AWS et les mécanismes liés aux ressources, vous ne serez pas lent. (Personnellement, j'ai eu du mal car je n'avais pas l'habitude de toucher Lambda ou Api Gateway.) Liste des API CDK

L'introduction de cdk et la création de la pile de base sont les mêmes que dans le didacticiel Manma, donc je les omettrai. Veuillez vous référer à ce qui suit. J'ai créé un service de raccourcissement d'URL avec AWS Cloud Development Kit (CDK)

Verrouiller la passerelle API

url_shortener_stack.py


api = aws_apigateway.LambdaRestApi(self, "UrlShortenerApi", handler=handler)

Je n'ai pas trouvé de moyen de verrouiller la passerelle API lors de l'utilisation de LambdaRestApi, alors je l'ai implémenté en utilisantRestApi à la place.

url_shortener_stack.py


api = aws_apigateway.RestApi(self, "UrlShortenerApi")
shorten_integration = aws_apigateway.LambdaIntegration(shorten_handler)
redirect_integration = aws_apigateway.LambdaIntegration(redirect_handler)

redirect = api.root.add_resource('{proxy}')
redirect_method = redirect.add_method("GET", redirect_integration)#Pas de clé

shorten = api.root.add_resource("shorten")
shorten_method = shorten.add_method("GET", shorten_integration, api_key_required=True)#Avec clé

api_key = api.add_api_key('APIKey',api_key_name='BuildAPIKey')#Création de clé
plan = api.add_usage_plan('ForAPIKey', api_key=api_key, throttle={
            "rate_limit": 100,
            "burst_limit": 1000
        })#Création du plan d'utilisation, spécification des clés
plan.add_api_stage(stage=api.deployment_stage,
                           throttle=[
                               {
                                   "method": shorten_method,
                                   "throttle": {
                                       "rate_limit": 100,
                                       "burst_limit": 1000
                                   }
                               },
                               {
                                   "method": redirect_method,
                                   "throttle": {
                                       "rate_limit": 100,
                                       "burst_limit": 1000
                                   }
                               },
                           ]
                           )#Lier la scène et le plan
self.map_company_subdomain('go', api)

Dans l'exemple d'origine, il était contrôlé par la fonction principale de Lambda, mais il ne pouvait pas être contrôlé correctement en raison d'un manque de puissance (car lambda main se déclenche lorsque le proxy a un jeton arbitraire, approprié / jeton? Si vous y accédez sous la forme targetUrl =, vous pouvez déclencher la fonction de raccourcissement à partir de la racine {proxy} déverrouillée), rendre la fonction de raccourcissement et la fonction de redirection différentes fonctions Lambda, puis définir chacune , Lié à la méthode API Gateway et verrouillé la fonction abrégée.

Recevez le résultat raccourci dans Json

Si vous conservez le tutoriel, il sera retourné sous forme de texte / plain, alors changez en json

lambda/shorten.py


return {
            'statusCode': 200,
            'headers': {'Content-Type': 'application/json'},
            'body': json.dumps({'shrink_url': url})
        }

Résumé

Vous n'êtes pas obligé d'accéder à la console à chaque fois, et cdk diff est pratique pour la différence, donc je veux l'utiliser de manière positive, mais je ne peux pas écrire de code approprié à moins d'avoir suffisamment de connaissances sur les ressources AWS sous-jacentes. Ce code fonctionne pour le moment, mais je pense qu'il y a de nombreux points qui ne peuvent pas être atteints tels que l'étape API Gateway, la limitation, les clés, l'intégration et le contrôle des fonctions Lamda, j'ai donc pensé que je devrais l'améliorer progressivement.

Recommended Posts

J'ai essayé de créer un service de raccourcissement d'url sans serveur avec AWS CDK
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de créer une application todo en utilisant une bouteille avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
Je veux faire un jeu avec Python
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
J'ai essayé AWS CDK!
J'ai créé un jeu ○ ✕ avec TensorFlow
J'ai essayé de faire un processus périodique avec CentOS7, Selenium, Python et Chrome
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
[Analyse des brevets] J'ai essayé de créer une carte des brevets avec Python sans dépenser d'argent
J'ai créé une API de recherche de château avec Elasticsearch + Sudachi + Go + echo
J'ai essayé de créer une API de reconnaissance d'image simple avec Fast API et Tensorflow
J'ai essayé de faire un "putain de gros convertisseur de littérature"
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
J'ai essayé de faire quelque chose comme un chatbot avec le modèle Seq2Seq de TensorFlow
J'ai essayé de faire une simulation de séparation de source sonore en temps réel avec l'apprentissage automatique Python
J'ai essayé d'implémenter une ligne moyenne mobile de volume avec Quantx
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé de créer automatiquement un rapport avec la chaîne de Markov
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux faire une macro de clic avec pyautogui (désir)
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit
Je veux faire une macro de clic avec pyautogui (Outlook)
J'ai essayé de commencer avec Hy ・ Définir une classe
J'ai essayé de trier une colonne FizzBuzz aléatoire avec un tri à bulles.
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé d'écrire dans un modèle de langage profondément appris
J'ai créé un éditeur de texte simple en utilisant PyQt
[1 hour challenge] J'ai essayé de créer un site de bonne aventure qui soit trop adapté à Python
J'ai essayé de charger / télécharger des fichiers sur AWS S3 / Azure BlobStorage / GCP CloudStorage avec Python
J'ai essayé de créer un générateur qui génère une classe conteneur C # à partir de CSV avec Python
J'ai essayé de créer une caméra de surveillance à détection de mouvement avec OpenCV en utilisant une caméra WEB avec Raspberry Pi
J'ai essayé de créer un service qui vend des données apprises par machine à une vitesse explosive avec Docker
[AWS Hands-on] Créons un service d'identification des célébrités avec une architecture sans serveur!
J'ai essayé de créer un système qui ne récupère que les tweets supprimés
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
J'ai essayé de rendre le deep learning évolutif avec Spark × Keras × Docker
Un mémorandum lors de l'acquisition automatique avec du sélénium
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
[Python] Un mémo que j'ai essayé de démarrer avec asyncio
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
[Introduction] Je veux créer un robot Mastodon avec Python! 【Débutants】
J'ai essayé de créer des taureaux et des vaches avec un programme shell
Faisons une discussion WEB en utilisant WebSocket avec AWS sans serveur (Python)!