[PYTHON] Jusqu'à bonjour le monde avec zappa

Essayez hello world avec zappa.

Qu'est-ce que zappa

https://github.com/Miserlou/Zappa

Il s'agit d'un framework basé sur flask qui réalise un service Web python sans serveur avec aws. Il semble utiliser pleinement les événements de passerelle API + lamdba + cloudwatch.

L'image gif de démonstration est passionnante.


Qu'est-ce que la fiole

http://flask.pocoo.org/

C'est un microframework pour une application web python avec wsgi + jinja2 comme back-end. Le premier commit a une longue histoire de 2010. Comme vous pouvez le voir sur la page d'accueil officielle, vous pouvez faire hello world avec http avec le code suivant.

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!\n"

if __name__ == "__main__":
    app.run()
$ pip install Flask
$ python hello.py &
 * Running on http://localhost:5000/
$ curl http://localhost:5000
Hello World!

Environnement

Cette fois, je vais essayer de l'exécuter avec centos7 sur vagrant. Puisque virtualenv est requis pour zappa, commençons par ce domaine. De plus, nous procéderons en tant qu'utilisateur «vagabond».

Installation des packages requis

Installez normalement avec yum.

sudo yum install -y gcc libffi-devel python-devel openssl-devel zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel git

installation de pip

Installez pip à l'échelle du système.

curl -L https://bootstrap.pypa.io/get-pip.py | sudo python

pyenv + virtualenv

Installez pyenv et virtualenv. Je suis reconnaissant d'avoir un excellent script qui peut installer les deux à la fois.

curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
cat << 'EOF' >> ~/.bash_profile

### virtualenv
export PATH="/home/vagrant/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
EOF

Les sites suivants étaient faciles à comprendre sur pyenv et virtualenv. http://blog.ieknir.com/blog/pyenv-with-virtualenv/

virtualenvwrapper

Cela semble pratique, je vais donc le présenter en référence à la qiita suivante. http://qiita.com/drafts/505492193317819772c7/edit

sudo pip install virtualenvwrapper
export WORKON_HOME="~/python-venv"
mkdir -p $WORKON_HOME
virtualenvwrapper_sh=$(whereis virtualenvwrapper.sh | cut -d : -f2)
echo """
if [ -f ${virtualenvwrapper_sh} ]; then
    export WORKON_HOME=$HOME/.virtualenvs
    source ${virtualenvwrapper_sh}
fi
""" >> ~/.bash_profile
source ${virtualenvwrapper_sh}

Jusqu'à présent, je l'ai mis dans github.

installation de python

### install python
pyenv install 2.7.12
pyenv local 2.7.12

C'est le 2.7.12.

$ pyenv versions
  system
* 2.7.12 (set by PYENV_VERSION environment variable)

configuration de zappa

mkvirtualenv

Créons un environnement dédié avec mkvirtualenv. L'invite change et c'est à la mode.

vagrant 07:42:55 ~$ mkvirtualenv zappa_2.7.12
(zappa_2.7.12) vagrant 07:42:55 ~$

Je vais le mettre en place.

$ mkdir app
$ cd app
$ cat << EOF >> requirements.txt
zappa
flask
EOF
$ pip install -r requirements.txt
$ zappa init

███████╗ █████╗ ██████╗ ██████╗  █████╗
╚══███╔╝██╔══██╗██╔══██╗██╔══██╗██╔══██╗
  ███╔╝ ███████║██████╔╝██████╔╝███████║
 ███╔╝  ██╔══██║██╔═══╝ ██╔═══╝ ██╔══██║
███████╗██║  ██║██║     ██║     ██║  ██║
╚══════╝╚═╝  ╚═╝╚═╝     ╚═╝     ╚═╝  ╚═╝

Welcome to Zappa!

Zappa is a system for running server-less Python web applications on AWS Lambda and AWS API Gateway.
This `init` command will help you create and configure your new Zappa deployment.
Let's get started!

Your Zappa configuration can support multiple production environments, like 'dev', 'staging', and 'production'.
What do you want to call this environment (default 'dev'): 

Quelque chose est sorti. On vous demande le nom de l'environnement, mais laissez-le comme dev.

Your Zappa deployments will need to be uploaded to a private S3 bucket.
If you don't have a bucket yet, we'll create one for you too.
What do you want call your bucket? (default 'zappa-*****'):

Vous serez invité à indiquer le nom du compartiment S3 à déployer sur lambda, mais laissez-le par défaut.

It looks like this is a Flask application.
What's the modular path to your app's function?
This will likely be something like 'your_module.app'.
Where is your app's function?: 

Appelons cela test.app.

Okay, here's your zappa_settings.js:

{
    "dev": {
        "app_function": "test.app",
        "s3_bucket": "zappa-******"
    }
}

Does this look okay? (default y) [y/n]: y

Done! Now you can deploy your Zappa application by executing:

	$ zappa deploy dev

After that, you can update your application code with:

	$ zappa update dev

To learn more, check out the Zappa project page on GitHub: https://github.com/Miserlou/Zappa
or stop by our Slack channel: http://bit.do/zappa

Enjoy!

L'initialisation est terminée.

zappa_settings.json

Par défaut, la région était us-east-1, alors modifiez-la. De plus, si le profil est séparé par des informations d'identification, spécifiez-le par nom_profil.

$  cat zappa_settings.json
{
    "dev": {
        "app_function": "test.app",
        "s3_bucket": "zappa-*****",
        "aws_region": "ap-northeast-1",
        "profile_name": "profile_name" //Si nécessaire
    }
}

Emplacement de l'échantillon

Je voudrais exécuter l'exemple ici.

$  cat test.py
import logging
from flask import Flask

app = Flask(__name__)
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

@app.route('/', methods=['GET', 'POST'])
def hello(event=None, context=None):
    logger.info('Lambda function invoked index()')
    return 'hello from Flask!\n'


if __name__ == '__main__':
    app.run(debug=True)

La structure des dossiers ressemble à ceci.

~/app$  tree
.
├── requirements.txt
├── test.py
└── zappa_settings.json

0 directories, 3 files

définition des informations d'identification aws

Puisque vous accédez à aws, définissez les informations d'identification de la manière suivante.

deploy !

C'est enfin déployé.

(zappa_2.7.12-2) vagrant 08:05:26 ~/app$  zappa deploy dev
Packaging project as zip...
Uploading zip (2.7MiB)...
100%|█████████████████████████████████████████████████████████████████████████████████████████| 2.81M/2.81M [00:00<00:00, 2.97Mit/s]
Scheduling keep-warm..
Creating API Gateway routes (this only happens once)..
1008it [01:39, 10.17it/s]
Deploying API Gateway..
Deployed! https://*****.execute-api.ap-northeast-1.amazonaws.com/dev

Je vais le frapper.

(zappa_2.7.12-2) vagrant 08:07:45 ~/app$  curl -l https://*****.execute-api.ap-northeast-1.amazonaws.com/dev
hello from Flask!

C'était!

Vérifiez le journal

Il est pratique de vérifier les journaux cloudwatch avec zappa tail dev. (J'obtiens une erreur.)

[1470384650490] [DEBUG] 2016-08-05T08:10:50.490Z    1f3ccb88-5ae4-11e6-b4c6-c9ecf09594ff    Zappa Event: {u'body': u'e30=', u'headers': {u'Via': u'1.1 9736f79fa942ea72a1eee114f49093dd.cloudfront.net (CloudFront)', u'CloudFront-Is-Desktop-Viewer': u'true', u'CloudFront-Is-SmartTV-Viewer': u'false', u'CloudFront-Forwarded-Proto': u'https', u'X-Forwarded-For': u'1.1.1.1, 2.2.2.2', u'CloudFront-Viewer-Country': u'JP', u'Accept': u'*/*', u'User-Agent': u'curl/7.43.0', u'Host': u'q14421ik6h.execute-api.ap-northeast-1.amazonaws.com', u'X-Forwarded-Proto': u'https', u'X-Amz-Cf-Id': u'RdcP863CiLrem7LekuwSQrt2YvNw29a9m3Es55O2Db6E9YGjqWQdCg==', u'CloudFront-Is-Tablet-Viewer': u'false', u'X-Forwarded-Port': u'443', u'CloudFront-Is-Mobile-Viewer': u'false'}, u'params': {}, u'method': u'GET', u'query': {}}
[1470384650491] [INFO]  2016-08-05T08:10:50.491Z    1f3ccb88-5ae4-11e6-b4c6-c9ecf09594ff    Lambda function invoked index()
[1470384650491] [INFO]  2016-08-05T08:10:50.491Z    1f3ccb88-5ae4-11e6-b4c6-c9ecf09594ff    1.1.1.1 - - [05/Aug/2016:08:10:50 +0000] "GET / HTTP/1.1" 200 18 "" "curl/7.43.0" 0/0.798
[1470384659083] need more than 1 value to unpack: ValueError
Traceback (most recent call last):
  File "/var/task/handler.py", line 324, in lambda_handler
    return LambdaHandler.lambda_handler(event, context)
  File "/var/task/handler.py", line 121, in lambda_handler
    return cls().handler(event, context)
  File "/var/task/handler.py", line 146, in handler
    app_function = self.import_module_and_get_function(whole_function)
  File "/var/task/handler.py", line 114, in import_module_and_get_function
    module, function = whole_function.rsplit('.', 1)
ValueError: need more than 1 value to unpack

Mise à jour de l'application

Vous pouvez mettre à jour votre application avec zappa update dev.

Supprimer l'application

Vous pouvez supprimer tout ce qui est déployé avec zappa undeploy dev.

$ zappa undeploy dev
Are you sure you want to undeploy? [y/n] y
Deleting API Gateway..
Removing keep-warm..
Deleting Lambda function..
Done!

à la fin

J'ai pu créer une application web qui salue le monde sans savoir ce que c'était. C'est incroyable.

Recommended Posts

Jusqu'à bonjour le monde avec zappa
bonjour le monde avec ctypes
Bonjour le monde avec Docker
Bonjour le monde sur flacon
Dessinez bonjour le monde avec mod_wsgi
Bonjour le monde avec Flask + Hamlish
Python commençant par Hello world!
Bonjour le monde
Bonjour tout le monde! Avec la communication CAN virtuelle
[Note] Sortie Hello world avec python
Hello World! Par QPython avec Braincrash
Jusqu'à Hello World avec Flask + uWSGI + Nginx @ Sakura's VPS (CentOS 6.6)
Hello World et détection de visage avec opencv-python 4.2
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Pymacs helloworld
cython helloworld
Hello World! Par QPython avec Brainfu * k
Hello World et détection de visage avec OpenCV 4.3 + Python
Hello World avec gRPC / go dans l'environnement Docker
Bonjour tout le monde avec toutes les fonctionnalités du langage Go
Dites bonjour au monde avec Python avec IntelliJ
Hello World avec nginx + uwsgi + python sur EC2
Créez une application Hello World avec un seul fichier avec django
Premier python ① Construction de l'environnement avec pythonbrew & Hello World !!
Créer un serveur "Hello World" (HTTP) dans Tornado
Tutoriel RabbitMQ 1 ("Hello World!")
Hello World avec Django
Le premier Hello World de Django
Prédisons les survivants du Hello World de Kaggle, Titanic par régression logistique-Modélisation-
[Mémo d'apprentissage] Comment créer une application avec Django ~ Jusqu'à ce que Hello World soit affiché ~
Hello World avec Google App Engine (Java 8) + Spring Boot + Gradle
Hello World avec Google App Engine (Java 8) + API Servlet 3.1 + Gradle
Hello World en langue GO
Prédisons les survivants de Hello World, Titanic de Kaggle par régression logistique-Prédiction / Évaluation-
Hello World (débutant) avec Django
Hello World avec Google App Engine (Java 11) + Spring Boot + Gradle
Premiers pas avec Heroku-Viewing Hello World en Python Django avec Raspberry PI 3
Commencez avec Windows, pas si effrayant Nim ① C'est comme bonjour le monde.
Faisons "Hello World" en 40 langues! !!
Jusqu'à ce que vous démarriez Jupyter dans Docker
Bonjour tout le monde! (Chaîne de blocs viables minimum)
cout << "Hello, World! \ N" en python
Hello World avec Flask [Mémo approprié]
Code: 2 "Hello World" dans "Choregraphe-Python script"
Jusqu'à ce que Python fonctionne sur Apache
Jusqu'à traiter de python dans Atom
Python #Hello World pour les super débutants
Jusqu'à ce que tu secoues le rubis avec renpy
Introduction à Ansible Partie 1 Hello World !! '
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Re: La vie Heroku commence avec Flask from zero - Environnement et Hello world -