【Python+heroku】Python入れてない状態からherokuで何か表示するまで(前編)
この記事は、2022.01.22-01.30 の期間で開催中の 「技術書典 12」 での新刊
ShotGrid Tips本の三冊目 「ShotGridチョットデキル」 の補足記事です。
「APIを使った定期処理」 P.11 の内容を補足します。元記事はQiitaにて2016年1月30日に公開したものです。
これはなに?
heroku入門系の記事で、「macOSでRubyで」とか「node.js」でとかはよく見かけますので(※2016年当時)、そうじゃない切り口で書いてみたいと思います。
- Pythonで
- Win7で
- herokuにアカウント登録はしている
- (gitとはまだ仲良しじゃない)
こんなところからスタートしてみます。
主にheroku公式のPython導入ドキュメントに沿い、アプリを作る等ではなくなにかを表示するあたりがゴールとなります。
heroku公式のPython導入ドキュメント
インストール
Pythonインストール
このへんからダウンロードしてきてインストールします。
記事執筆時点では、2系で最新だった2.7.11を入れました。
現在ではCG映像系ツールのPythonバージョンも3系移行が進んでおり、またheroku入門ドキュメントの条件としても「3.10がインストールされていること」と書かれています。
PATHを通す
Windowsの環境変数のPATHに追加します。
C:\Python27;C:\Python27\Scripts;
これを途中まで忘れていて、途中から正常(?)にしました。
なので途中までは、最初にこれをやってたら出なかったエラーとかも含まれてるかもしれません。含まれてないかもしれません。
コマンドで追加したい場合はsetx
ですね
> setx /?
SetX の使用法は 3 とおりあります:
構文 1:
SETX [/S システム [/U [ドメイン\]ユーザー [/P [パスワード]]]] 変数 値 [/M]
構文 2:
SETX [/S システム [/U [ドメイン\]ユーザー [/P [パスワード]]]]
変数 /K レジストリパス [/M]
構文 3:
SETX [/S システム [/U [ドメイン\]ユーザー [/P [パスワード]]]]
/F ファイル {変数 {/A x,y | /R x,y 文字列}[/M] | /X} [/D 区切り文字]
説明:
ユーザーまたはシステムの環境の中で環境変数を作成または
変更します。引数、レジストリ キー、またはファイル入力を
もとに変数を設定することができます。
(後略)
virtualenv
virtualenvが要るとおっしゃるので入れます。
Python 2.7.11 (v2.7.11:6d1b6a68f775, Dec 5 2015, 20:32:19) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
>>> pip.main(["list"])
pip (7.1.2)
setuptools (18.2)
0
>>> pip.main(["install","virtualenv"])
Collecting virtualenv
Downloading virtualenv-13.1.2-py2.py3-none-any.whl (1.7MB)
100% |################################| 1.7MB 271kB/s
Installing collected packages: virtualenv
Successfully installed virtualenv-13.1.2
0
>>>
普通に pip install virtualenv
でもいいんですけど、ここではPython内からpipモジュールを使ってインストールしてみました。
実際に使うのは後編記事になってからです。
herokuインストール
heroku Toolbeltという、herokuとそれに関するツール一式を入れてくれるインストーラが用意されてます。 現在は Toolbelt ではなく Heroku CLI となっています。
中身は、gitとかrubyとか。
▼こちらの場所にインストールされ、PATHに追加されます。
Technical details
The heroku client will be installed into C:\Program Files\Heroku and will be added to your %PATH%.
インストール時は、なんか最後のgitのとこでちょい待たされて ん? ってなりますがビビらなくていいです。
git
この時点でgitも入ってます。 Toolbeltではgitも同時にインストールされていましたが、Heroku CLIでは必要に応じて自分でインストールします。
git -h
します。
C:\Users\{user}>git -h
Unknown option: -h
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
getting-started
以下こちら▼に沿って進めます。
https://devcenter.heroku.com/articles/getting-started-with-python
> heroku
Toolbeltインストールした直後に「一旦インストールすればheroku
コマンドで使えるようになるよ!」みたいなのが書いてあるんですが、
それをみてとにかく無邪気にheroku
と実行。しました。
するとなにか初期化っぽいのが走って、 add dependencies とかなんとかかんとかで、ちょいと待たされます。待ちましょう。なんかまずいことしたのかと思って動揺しました。
1分も待たないですけど。意外なとこで待たされるとそのたびにビビります。
ちなみにこのときのログは、初期化が終わったあとウィンドウが自動で閉じてしまったので失われました。
ログオン
heroku login
します。すると、herokuアカウントのメールアドレスとパスワードを訊かれます。
Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. All rights reserved.
C:\Users\{user}>heroku login
Enter your Heroku credentials.
Email: aiueo@gmail.com
Password (typing will be hidden):
Logged in as aiueo@gmail.com
はいれた。っぽい。
バージョン確認
heroku version
C:\Users\{user}>heroku version
heroku/toolbelt/3.42.29 (i386-mingw32) ruby/2.1.7
heroku-cli/4.27.13-9dddf39 (386-windows) go1.5.3
=== Installed Plugins
heroku-apps@1.1.3
heroku-cli-addons@0.1.1
heroku-fork@4.0.0
heroku-git@2.4.4
heroku-local@4.1.5
heroku-run@2.9.2
heroku-spaces@2.0.9
heroku-status@1.2.4
こちら(▼)も読みながら進めていて、そこの【2】に書いてあった内容です。
http://developers.mobage.jp/blog/how-to-use-for-beginners-heroku(リンク切れ)
テストアプリケーションの場所準備
適当に今回の作業場にしたいフォルダを作って移動します。
C:\Users\{user}>cd C:\Users\{user}\Documents\path\to\heroku_proj
C:\Users\{user}\Documents\path\to\heroku_proj>mkdir testapp
C:\Users\{user}\Documents\path\to\heroku_proj>cd testapp
C:\Users\{user}\Documents\path\to\heroku_proj\testapp>
herokuのPythonサンプルをもらってくる
githubで公開されている python-getting-started っていうのをもらってきます。
git clone https://github.com/heroku/python-getting-started.git
します
C:\Users\{user}\Documents\path\to\heroku_proj\testapp>git clone https://github.com/heroku/python-getting-started.git
Cloning into 'python-getting-started'...
remote: Counting objects: 204, done.
emote: Total 204 (delta 0), reused 0 (delta 0), pack-reused 204Receiving objects
Receiving objects: 75% (153/204)
Receiving objects: 100% (204/204), 32.17 KiB | 0 bytes/s, done.
Resolving deltas: 100% (91/91), done.
Checking connectivity... done.
で、cd
で移動
C:\Users\{user}\Documents\path\to\heroku_proj\testapp>cd python-getting-started
C:\Users\{user}\Documents\path\to\heroku_proj\testapp\python-getting-started>
以降は、すべてのコマンドは C:\Users\{user}\Documents\path\to\heroku_proj\testapp\python-getting-started>
から実行したものとご了解ください。
herokuアプリをクリエイト
イマココ
https://devcenter.heroku.com/articles/getting-started-with-python#deploy-the-app
heroku create
せよ、とのこと。
>heroku create
Creating app... done, stack is cedar-14
https://ancient-taiga-0000.herokuapp.com/ | https://git.heroku.com/ancient-taiga-0000.git
文中の ancient-taiga-0000ってなんすか? 突然の厨二用語ですか?
って思うわけですが、createするときに名前決めなかったら 自動で名前つけてくれる みたいです。
まあテストだからいいか。
もしちゃんと名前つけるならば、このように。
heroku create your-app-name
もしくは、ブラウザ経由でherokuにログインして、そこから変えることもできるっぽいです(やってない)
デプロイ
ここで突然のgit体験です。
git push heroku master
1-2分くらいかかります。
>git push heroku master
Counting objects: 204, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (98/98), done.
Writing objects: 100% (204/204), 32.16 KiB | 0 bytes/s, done.
Total 204 (delta 91), reused 204 (delta 91)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing runtime (python-2.7.11)
remote: -----> Installing dependencies with pip
remote: Collecting dj-database-url==0.3.0 (from -r requirements.txt (line 1))
remote: Downloading dj_database_url-0.3.0-py2.py3-none-any.whl
remote: Collecting Django==1.9.1 (from -r requirements.txt (line 2))
remote: Downloading Django-1.9.1-py2.py3-none-any.whl (6.6MB)
remote: Collecting gunicorn==19.4.5 (from -r requirements.txt (line 3))
remote: Downloading gunicorn-19.4.5-py2.py3-none-any.whl (112kB)
remote: Collecting psycopg2==2.6.1 (from -r requirements.txt (line 4))
remote: Downloading psycopg2-2.6.1.tar.gz (371kB)
remote: Collecting whitenoise==2.0.6 (from -r requirements.txt (line 5))
remote: Downloading whitenoise-2.0.6-py2.py3-none-any.whl
remote: Installing collected packages: dj-database-url, Django, gunicorn, psycopg2, whitenoise
remote: Running setup.py install for psycopg2
remote: Successfully installed Django-1.9.1 dj-database-url-0.3.0 gunicorn-19.4.5 psycopg2-2.6.1 whitenoise-2.0.6
remote:
remote: -----> Preparing static assets
remote: Running collectstatic...
remote: Post-processed 'admin/js/vendor/xregexp/LICENSE-XREGEXP.txt' as 'admin/js/vendor/xregexp/LICENSE-XREGEXP.d64cecf4f157.txt'
(中略)
remote: Post-processed 'lang-logo.png' as 'lang-logo.019c8743b7cf.png'
remote: 58 static files copied to '/app/staticfiles', 58 post-processed.
remote:
remote: -----> Discovering process types
remote: Procfile declares types -> web
remote:
remote: -----> Compressing... done, 42.1MB
remote: -----> Launching...
remote: Released v4
remote: https://ancient-taiga-0000.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy.... done.
To https://git.heroku.com/ancient-taiga-0000.git
* [new branch] master -> master
>
python-getting-started の中には requirements.txt が置かれてるわけですが、上記処理中、それが読まれてpipでインストールされてます。
続けて、heroku ps:scale web=1
せよ とのこと。
>heroku ps:scale web=1
Scaling dynos... done, now running web at 1:Free.
からの heroku open
>heroku open
Opening ancient-taiga-0000... done
すると、ブラウザが立ち上がって、アプリ(ここでは ancient-taiga-0000.herokuapp.com )が開かれます。
ここまでで、
- 下準備
- heroku appを作る
- heroku上にデプロイして動かす
……を体験できました
ログを見る
イマココ
https://devcenter.heroku.com/articles/getting-started-with-python#view-logs
heroku logs --tail
--tail
をつけると、リアルタイムでログどんどん取得されます。 停めるときは Ctl + C
です。
>heroku logs --tail
2016-01-17T13:37:24.947150+00:00 heroku[api]: Enable Logplex by aiueo@gmail.com
2016-01-17T13:37:24.947150+00:00 heroku[api]: Release v2 created by aiueo@gmail.com
2016-01-17T13:40:12.180138+00:00 heroku[api]: Attach DATABASE resource by aiueo@gmail.com
2016-01-17T13:40:12.180177+00:00 heroku[api]: Release v3 created by aiueo@gmail.com
2016-01-17T13:40:12.470201+00:00 heroku[api]: Scale to web=1 by aiueo@gmail.com
2016-01-17T13:40:12.529336+00:00 heroku[api]: Deploy fe7f948 by aiueo@gmail.com
2016-01-17T13:40:12.529336+00:00 heroku[api]: Release v4 created by aiueo@gmail.com
2016-01-17T13:40:12.842955+00:00 heroku[slug-compiler]: Slug compilation started
2016-01-17T13:40:12.842964+00:00 heroku[slug-compiler]: Slug compilation finished
2016-01-17T13:40:15.096972+00:00 heroku[web.1]: Starting process with command `gunicorn gettingstarted.wsgi --log-file -`
2016-01-17T13:40:16.642246+00:00 app[web.1]: [2016-01-17 13:40:16 +0000] [3] [INFO] Listening at: http://0.0.0.0:10178 (3)
2016-01-17T13:40:16.642313+00:00 app[web.1]: [2016-01-17 13:40:16 +0000] [3] [INFO] Using worker: sync
2016-01-17T13:40:16.640646+00:00 app[web.1]: [2016-01-17 13:40:16 +0000] [3] [INFO] Starting gunicorn 19.4.5
2016-01-17T13:40:16.645613+00:00 app[web.1]: [2016-01-17 13:40:16 +0000] [9] [INFO] Booting worker with pid: 9
2016-01-17T13:40:16.684880+00:00 app[web.1]: [2016-01-17 13:40:16 +0000] [10] [INFO] Booting worker with pid: 10
2016-01-17T13:40:17.171330+00:00 heroku[web.1]: State changed from starting to up
(ry
2016-01-17T13:45:25.167623+00:00 app[web.1]: Not Found: /favicon.ico
ctl + c での停止時には、下記のように確認されます。
! Command cancelled.
バッチ ジョブを終了しますか (Y/N)? y
>
Procfile
イマココ
https://devcenter.heroku.com/articles/getting-started-with-python#define-a-procfile
git clone してきた「getting-started-with-python」の直下に置かれている Procfileファイル についてみたいです。
github上だと、これ
https://github.com/heroku/python-getting-started/blob/master/Procfile
初期状態だと中身はこう
web: gunicorn gettingstarted.wsgi --log-file -
herokuに自動処理させたい時とかに clock: ~~
っていうのを書いたりするそうで、そういった設定を書くファイルということですね。
ps
イマココ
https://devcenter.heroku.com/articles/getting-started-with-python#scale-the-app
ここからは、小さな基本的な操作の案内がいくつか続きます。
まずは heroku ps
してみろ、とのこと。
>heroku ps
=== web (Free): gunicorn gettingstarted.wsgi --log-file -
web.1: up 2016/01/17 22:40:17 (~ 18m ago)
>
heroku run ~~
heroku run ~~
でなんか実行できるらしい
>heroku run
! Usage: heroku run COMMAND
!
! Example: heroku run bash
>
run
の後ろになんか要る。。。
そういえばheroku作業始めてからヘルプしたことなかったので、ここでやってみる。
>heroku -h
Usage: heroku COMMAND [--app APP] [command-specific-options]
Primary help topics, type "heroku help TOPIC" for more details:
addons # manage add-on resources
apps # manage apps (create, destroy)
auth # authentication (login, logout)
config # manage app config vars
domains # manage domains
logs # display logs for an app
ps # manage dynos (dynos, workers)
releases # manage app releases
run # run one-off commands (console, rake)
sharing # manage collaborators on an app
Additional topics:
2fa # manage two-factor authentication settings
buildpacks # manage the buildpack for an app
certs # manage ssl endpoints for an app
drains # display drains for an app
features # manage optional features
fork # clone an existing app
git # manage local git repository for app
help # list commands and display help
keys # manage authentication keys
labs # manage optional features
local # run heroku app locally
login # Login with your Heroku credentials.
maintenance # manage maintenance mode for an app
members # manage membership in organization accounts
orgs # manage organization accounts
pg # manage heroku-postgresql databases
pgbackups # manage backups of heroku postgresql databases
plugins # manage plugins to the heroku gem
regions # list available regions
spaces # manage heroku private spaces
stack # manage the stack for an app
status # Status of Heroku Platform
twofactor # manage two-factor authentication settings
update # update the heroku client
version # display version
herokuアプリの情報を確認
自分のアプリを一覧 = heroku apps
>heroku apps
=== My Apps
ancient-taiga-0000
もちろん現状は一つしかないわけです。
続けて、appsにオプションをつけての実行です。
heroku apps:info
>heroku apps:info
=== ancient-taiga-0000
Addons: heroku-postgresql:hobby-dev
Dynos: web: 1
Git URL: git@heroku.com:ancient-taiga-0000.git
Owner: aiueo@gmail.com
Region: us
Repo Size: 36 kB
Slug Size: 42 MB
Stack: cedar-14
Web URL: https://ancient-taiga-0000.herokuapp.com/
どんなアドオン使ってるかとか、アクセス用のURLとかが確認できます。
そういえば Region(地域)が us になってますね(jpとかではなく)
プラグイン確認
heroku plugins
>heroku plugins
=== Installed Plugins
heroku-apps@1.1.3
heroku-cli-addons@0.1.1
heroku-fork@4.0.0
heroku-git@2.4.4
heroku-local@4.1.5
heroku-run@2.9.2
heroku-spaces@2.0.9
heroku-status@1.2.4
アドオン確認
heroku addons
>heroku addons
Add-on Plan Price
─────────────────────────────────────────────── ───────── ──
───
heroku-postgresql (postgresql-dimensional-7392) hobby-dev free
└─ as DATABASE
The table above shows add-ons and the attachments to the current app (ancient-taiga-0000) or other apps.
当該アドオンのページを開く。
>heroku addons:open heroku-postgresql
Opening heroku-postgresql (postgresql-dimensional-7392) for ancient-taiga-0000... done
するとここが開かれました↓
resource12394017@heroku.com does not exist or cannot be accessed by this account
そうですか。
addonとアカウントのverify
ちなみに、アドオンによってはアカウントをベリファイしてないとインストールさせてくれません。
要するに支払情報(クレジットカード)を登録しておくれよ、ということのようです。
※参考:
Unfiltered + HerokuでTwitter ToDoサービスを作る(heroku Add-onと設定ファイルとScalate使ってみる編) @ 冥冥乃志
支払い情報登録をさぼってアドオン入れようとするとこういう態度を取られます。
ですよね!
リリース情報
heroku releases
>heroku releases
=== ancient-taiga-0000 Releases
v4 Deploy fe7f948 aiueo@gmail.com 2016/01/17 22:40:12 (~ 2h ago)
v3 Attach DATABASE resource aiueo@gmail.com 2016/01/17 22:40:12 (~ 2h ago)
v2 Enable Logplex aiueo@gmail.com 2016/01/17 22:37:24 (~ 2h ago)
v1 Initial release aiueo@gmail.com 2016/01/17 22:37:24 (~ 2h ago)
環境設定を見る
heroku config
>heroku config
=== ancient-taiga-0000 Config Vars
DATABASE_URL: postgres://abcdefghijklmn:GaEMJZBYWhqmI9xXOOudegwpxf@ec2-54-83-61-45.compute-1.amazonaws.com:5432/d7vc7kpol1v9vn
前半はここまで
長くなったので前後編に分けました。
Discussion