[PYTHON] Bis hallo Welt mit Zappa

Versuchen Sie Hallo Welt mit Zappa.

Was ist Zappa?

https://github.com/Miserlou/Zappa

Es ist ein flaschenbasiertes Framework, das einen serverlosen Python-Webdienst mit aws realisiert. Es scheint das API-Gateway + Lamdba + Cloudwatch-Ereignisse voll auszunutzen.

Das Demo-GIF-Bild ist aufregend.


Was ist eine Flasche?

http://flask.pocoo.org/

Es ist ein Mikroframework für Python-Webanwendungen mit wsgi + jinja2 als Backend. Das erste Commit hat eine lange Geschichte von 2010. Wie Sie auf der offiziellen Top-Seite sehen können, können Sie mit http mit dem folgenden Code Hallo Welt machen.

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!

Umgebung

Dieses Mal werde ich versuchen, es mit centos7 auf vagrant auszuführen. Da für zappa virtualenv erforderlich ist, beginnen wir in diesem Bereich. Darüber hinaus werden wir als "vagabundierender" Benutzer fortfahren.

Installation der erforderlichen Pakete

Normalerweise mit yum installieren.

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

Rohrinstallation

Installieren Sie das Rohr systemweit.

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

pyenv + virtualenv

Installieren Sie pyenv und virtualenv. Ich bin dankbar, ein großartiges Skript zu haben, das beide gleichzeitig installieren kann.

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

Die folgenden Websites waren über pyenv und virtualenv leicht zu verstehen. http://blog.ieknir.com/blog/pyenv-with-virtualenv/

virtualenvwrapper

Es scheint praktisch zu sein, daher werde ich es unter Bezugnahme auf das folgende Qiita einführen. 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}

Bisher habe ich es in github eingefügt.

Python-Installation

### install python
pyenv install 2.7.12
pyenv local 2.7.12

Es ist 2.7.12.

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

Zappa-Setup

mkvirtualenv

Erstellen wir mit mkvirtualenv eine dedizierte Umgebung. Die Eingabeaufforderung ändert sich und es ist in Mode.

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

Ich werde es einrichten.

$ 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'): 

Es kam etwas heraus. Sie werden nach dem Umgebungsnamen gefragt, belassen ihn jedoch als Entwickler.

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-*****'):

Sie werden nach dem S3-Bucket-Namen gefragt, der für Lambda bereitgestellt werden soll. Lassen Sie dies jedoch als Standard.

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?: 

Nennen wir es 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!

Die Initialisierung ist abgeschlossen.

zappa_settings.json

Standardmäßig war die Region us-east-1. Bearbeiten Sie sie daher. Wenn das Profil durch Anmeldeinformationen getrennt ist, geben Sie es auch durch Profilname an.

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

Probenplatzierung

Ich möchte das Beispiel [hier] ausführen (https://github.com/Miserlou/Zappa/blob/master/example/app.py).

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

Die Ordnerstruktur sieht so aus.

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

0 directories, 3 files

Einstellen des aws-Berechtigungsnachweises

Da Sie auf aws zugreifen, legen Sie die Anmeldeinformationen folgendermaßen fest.

deploy !

Es ist endlich bereit.

(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

Ich werde es treffen.

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

Es war!

Überprüfen Sie das Protokoll

Es ist bequem, Cloudwatch-Protokolle mit zappa tail dev zu überprüfen. (Ich erhalte eine Fehlermeldung.)

[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

Anwendungsaktualisierung

Sie können Ihre Anwendung mit zappa update dev aktualisieren.

Anwendung entfernen

Sie können alles löschen, was mit zappa undeploy dev bereitgestellt wurde.

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

schließlich

Ich konnte eine Webanwendung erstellen, die Hallo Welt, ohne zu wissen, was es war. Es ist wunderbar.

Recommended Posts

Bis hallo Welt mit Zappa
Hallo Welt mit ctypes
Hallo, Welt mit Docker
Hallo Welt auf Flasche
Zeichne Hallo Welt mit mod_wsgi
Hallo Welt mit Flask + Hamlish
Python beginnend mit Hallo Welt!
Hallo Welt
Hallo Welt! Mit virtueller CAN-Kommunikation
[Hinweis] Hallo Weltausgabe mit Python
Hallo Welt! Von QPython mit Braincrash
Bis Hello World mit Flask + uWSGI + Nginx @ Sakuras VPS (CentOS 6.6)
Hallo Welt- und Gesichtserkennung mit opencv-python 4.2
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Pymacs helloworld
Cython Helloworld
Hallo Welt! Von QPython mit Brainfu * k
Hallo Welt- und Gesichtserkennung mit OpenCV 4.3 + Python
Hallo Welt mit gRPC / go in Docker-Umgebung
Hallo Welt mit allen Funktionen der Go-Sprache
Begrüßen Sie die Welt mit Python mit IntelliJ
Hallo Welt mit Nginx + Uwsgi + Python auf EC2
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
Erste Python ① Umgebungskonstruktion mit Pythonbrew & Hello World !!
Erstellen Sie in Tornado einen HTTP-Server (Hello World)
RabbitMQ Tutorial 1 ("Hallo Welt!")
Hallo Welt mit Django
Djangos erste Hallo Welt
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic, durch logistische Regression vorhersagen.
[Lernnotiz] So erstellen Sie eine App mit Django ~ Bis Hello World angezeigt wird ~
Hallo Welt mit Google App Engine (Java 8) + Spring Boot + Gradle
Hallo Welt mit Google App Engine (Java 8) + Servlet API 3.1 + Gradle
Hallo Welt in GO-Sprache
Lassen Sie uns die Überlebenden von Kaggles Hello World, Titanic durch logistische Regression vorhersagen - Vorhersage / Bewertung
Hallo Welt (Anfänger) mit Django
Hallo Welt mit Google App Engine (Java 11) + Spring Boot + Gradle
Erste Schritte mit Heroku-Viewing Hello World in Python Django mit Raspberry PI 3
Beginnen Sie mit Windows, nicht so beängstigend Nim ① Es ist wie Hallo Welt.
Lass uns "Hello World" in 40 Sprachen machen! !!
Bis Sie Jupyter in Docker starten
Hallo Welt! (Minimum Viable Block Chain)
cout << "Hallo Welt! \ N" in Python
Hallo Welt mit Flasche [Passendes Memo]
Code: 2 "Hello World" im "Choregraphe-Python-Skript"
Bis Python auf Apache läuft
Bis zum Umgang mit Python in Atom
Python #Hello World für Super-Anfänger
Bis Sie den Rubin mit Renpy schütteln
Einführung in Ansible Teil 1'Hallo Welt !! '
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Re: Heroku Leben beginnt mit Flask von Null - Umwelt und Hallo Welt -