Facilement sans serveur avec Python en utilisant Calice

Jour 5 du Calendrier de l'Avent Python 2016 Ceci est l'article sur le 5ème jour du Calendrier de l'Avent Fusic 2016.

Ravi de vous rencontrer, je m'appelle seike460. Je touche généralement PHP et le serveur.

Je veux être à la mode sans serveur! J'ai pensé, La situation actuelle est que PHP ne peut pas être sans serveur sur AWS, que j'utilise de manière conviviale. (Pour être précis, vous pouvez le faire si vous faites de votre mieux, mais je laisserai cette histoire de côté.)

Je ne peux pas m'empêcher de faire ce que je ne peux pas faire, alors j'ai pensé essayer le serveur sans serveur dans une autre langue, J'ai décidé de le rendre sans serveur en utilisant Python, ce qui m'a attiré récemment.

Si vous essayez de configurer Lambda et API Gateway sans rien utiliser, ~~ C'est trop ennuyeux et j'ai l'impression de devenir fou ~~ J'ai eu l'impression que c'était inefficace et ne pouvait pas supporter l'opération réelle.

Par conséquent, j'ai sélectionné et implémenté la bibliothèque officielle Amazon Python "calice".

Si vous avez un compte AWS, vous pouvez faire Hello World sans serveur en moins de 10 minutes en exécutant simplement la section Démarrage rapide. ~~ Après tout, le nom qui stimule les deux cœurs de la cuisine est le meilleur, la Holy Cup! Holy Cup! ~~ Puisque la méthode d'introduction a déjà été écrite dans READ ME, la méthode d'introduction sera omise.

Cet objectif

Cette fois, l'objectif était d'envoyer Json vers API Gateway et de sauvegarder Json dans S3. On suppose qu'une API pour recevoir des données sera installée et que les données seront utilisées via S3.

qiita-2016-12-05_1.png

Environnement de développement

OS:macOS v10.12(Sierra) Python:2.7.10

Préparation côté AWS

Tout d'abord, préparez un rôle IAM pour charis. Cette fois, nous le définirons indépendamment de l'autorité. Pour le moment, je vais vous donner l'autorité. ** * En fait, vous devriez y penser! L'auto-responsabilité !! **

↓ Cela ressemble à ceci.

qiita-2016-12-05_2.png

Ensuite, définissez les informations d'identification dans votre environnement de développement.

~/.aws/config


[default]
aws_access_key_id=Je ne peux pas te montrer! !! !! ]
aws_secret_access_key=Je ne peux pas te montrer! !! !! ]
region=ap-northeast-1 ← Région de Tokyo

Hello world est prêt à partir.

Je vais également toucher AWS, donc j'inclurai également boto3. Si vous souhaitez utiliser virtualenvs à ce stade, installez-le dans l'environnement qui utilise charice.

boto3


(chalice) $ pip install boto3

--Référence - boto3 - virtualenvs

Let's hello world Créez un projet save2S3.

new-project


(chalice) $ chalice new-project save2S3

Ensuite, la structure de répertoires suivante sera créée.

save2S3


save2S3
├── .chalice
│   └── config.json
├── .gitignore
├── app.py
└── requirements.txt

Modifiez ce fichier app.py pour le rendre sans serveur. Ouvrons app.py

app.py



from chalice import Chalice

app = Chalice(app_name='save2S3')


@app.route('/')
def index():
    return {'hello': 'world'}


# The view function above will return {"hello": "world"}
# whenver you make an HTTP GET request to '/'.
#
# Here are a few more examples:
#
# @app.route('/hello/{name}')
# def hello_name(name):
#    # '/hello/james' -> {"hello": "james"}
#    return {'hello': name}
#
# @app.route('/users', methods=['POST'])
# def create_user():
#     # This is the JSON body the user sent in their POST request.
#     user_as_json = app.json_body
#     # Suppose we had some 'db' object that we used to
#     # read/write from our database.
#     # user_id = db.create_user(user_as_json)
#     return {'user_id': user_id}
#
# See the README documentation for more examples.
#

L'atmosphère qui semble pouvoir faire hello world est incroyable. Il semble que le calice a bonjour le monde, alors déployons-le immédiatement sur AWS.

deploy


(chalice) $ chalice deploy

Initial creation of lambda function.
Creating role
Creating deployment package.
Lambda deploy done.
Initiating first time deployment...
Deploying to: dev
https://[Votre chemin unique].execute-api.ap-northeast-1.amazonaws.com/dev/

C'était très facile à déployer. Par défaut, il est créé dans un chemin appelé / dev. Si vous souhaitez le créer dans un chemin appelé api, vous pouvez utiliser la commande suivante.

deploy_to_api


(chalice) $ chalice deploy api

J'essaierai d'accéder à l'URL immédiatement.

deploy


(chalice) $ curl https://[Votre chemin unique].execute-api.ap-northeast-1.amazonaws.com/dev/
{"hello": "world"}

Ceci termine vos débuts avec Charice. Montrez à votre voisin: "Je peux utiliser la Sainte Coupe." ** Ce n'est pas ma faute si le résultat est décevant. Responsabilité personnelle **

Code pour atteindre l'objectif

Le top est bon! J'écris un petit code comme ça.

app.py


from chalice import Chalice
import boto3
import json

# for S3
clientS3 = boto3.client('s3')
yourBucketPath = '[Écrivez votre seau ici! ]'

app = Chalice(app_name='save2S3')

@app.route('/save', methods=['POST'], content_types=['application/json'])
def save():
  saveJson = app.current_request.json_body
  if (validateKey(saveJson) == False):
    return {'error':'please input key'}
  SavePath = saveJson['key'] + '.json'
  clientS3.put_object(Bucket=yourBucketPath, Key=SavePath, Body=json.dumps(saveJson, ensure_ascii=False))
  return {'save':saveJson['key']}

def validateKey(saveJson):
  if (saveJson.has_key("key") == False):
      return False
  return True

Seule la validation de clé minimale sera enregistrée.

J'écris aussi un petit code pour vérifier ce type. ** * J'ai écrit ceci en python3. ** (lambda prend en charge python3)

postJson.py


import urllib.request
import json

url = "https://[Votre chemin unique].execute-api.ap-northeast-1.amazonaws.com/dev/save"
method = "POST"
headers = {"Content-Type" : "application/json"}
obj = {"key" : "seike460", "val" : "Je peux utiliser la Sainte Coupe"}
json_data = json.dumps(obj).encode("utf-8")

request = urllib.request.Request(
  url,
  data=json_data,
  method=method,
  headers=headers
)
with urllib.request.urlopen(request) as response:
  response_body = response.read().decode("utf-8")
print(response_body)

Lorsque vous exécutez ceci, c'est une commande ** * python3 !! **

deploy


$ python3 postJson.py
{"save": "seike460"}

Il devrait également être bien enregistré dans S3. À ce stade, vous êtes un lutteur de serveur. Soyons sans serveur à votre guise. Nous pouvons faire sans serveur à ce stade. Il semble que notre sergent sans serveur sera dépassé en théorie, alors je vais m'arrêter.

Résumé et impressions

Cette fois, PHPer a essayé d'utiliser Python dans le but d'être sans serveur. à l'intérieur de ça,

J'ai senti que, cette fois, c'était une histoire proche d'AWS, Je vais continuer à écrire quelque chose avec du matériel Python.

Je veux toucher Django

Recommended Posts

Facilement sans serveur avec Python en utilisant Calice
Faites facilement un bip avec python
Simplifiez-vous la tâche avec les exigences Python sans serveur
Implémentez facilement des sous-commandes avec python click
Gérez facilement les listes avec python + sqlite3
Publiez facilement sur Twitter avec Python 3
FizzBuzz en Python3
Grattage avec Python
Statistiques avec python
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
python commence par ()
avec syntaxe (Python)
Bingo avec python
Zundokokiyoshi avec python
Téléchargez facilement des mp3 / mp4 avec python et youtube-dl!
Comparaison des frameworks sans serveur Python-Zappa vs Chalice
API de reconnaissance faciale sans serveur conçue avec Python
Touchez AWS avec Serverless Framework et Python
Excel avec Python
Micro-ordinateur avec Python
Cast avec python
Utiliser des packages Python supplémentaires avec Serverless Framework (v1.x)
Vous pouvez facilement créer une interface graphique même avec Python
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
Premiers pas avec AWS IoT facilement en Python
Facile à créer une application console Python avec Click
Communication série avec Python
Zip, décompressez avec python
Jugement des nombres premiers avec Python
Python avec eclipse + PyDev.
Communication de socket avec Python
Analyse de données avec python 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Facilement démonisé avec Supervisor
Recherche séquentielle avec Python
"Orienté objet" appris avec python
Exécutez Python avec VBA
Manipuler yaml avec python
Résolvez AtCoder 167 avec python
Communication série avec python
[Python] Utiliser JSON avec Python
Apprendre Python avec ChemTHEATER 05-1
Apprenez Python avec ChemTHEATER
Exécutez prepDE.py avec python3
1.1 Premiers pas avec Python
Collecter des tweets avec Python
Binarisation avec OpenCV / Python
3. 3. Programmation IA avec Python
Méthode Kernel avec Python
Non bloquant avec Python + uWSGI
Grattage avec Python + PhantomJS
Publier des tweets avec python