🧪

【Python+heroku】Python入れてない状態からherokuで何か表示するまで(前編)

2022/01/24に公開

この記事は、2022.01.22-01.30 の期間で開催中の 「技術書典 12」 での新刊
ShotGrid Tips本の三冊目 「ShotGridチョットデキル」 の補足記事です。

https://techbookfest.org/event/tbf12/market

https://techbookfest.org/product/5296800539869184

「APIを使った定期処理」 P.11 の内容を補足します。元記事はQiitaにて2016年1月30日に公開したものです。


これはなに?

heroku入門系の記事で、「macOSでRubyで」とか「node.js」でとかはよく見かけますので(※2016年当時)、そうじゃない切り口で書いてみたいと思います。

  • Pythonで
  • Win7で
  • herokuにアカウント登録はしている
  • (gitとはまだ仲良しじゃない)

こんなところからスタートしてみます。
主にheroku公式のPython導入ドキュメントに沿い、アプリを作る等ではなくなにかを表示するあたりがゴールとなります。

heroku公式のPython導入ドキュメント
https://devcenter.heroku.com/articles/getting-started-with-python


インストール

Pythonインストール

このへんからダウンロードしてきてインストールします。

https://www.python.org/downloads/

記事執筆時点では、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 となっています。

https://devcenter.heroku.com/articles/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します。

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

するとここが開かれました↓

https://postgres.heroku.com/databases

resource12394017@heroku.com does not exist or cannot be accessed by this account 

そうですか。

addonとアカウントのverify

ちなみに、アドオンによってはアカウントをベリファイしてないとインストールさせてくれません。
要するに支払情報(クレジットカード)を登録しておくれよ、ということのようです。

※参考:
Unfiltered + HerokuでTwitter ToDoサービスを作る(heroku Add-onと設定ファイルとScalate使ってみる編) @ 冥冥乃志
http://mao-instantlife.hatenablog.com/entry/20120310/1331388396

支払い情報登録をさぼってアドオン入れようとするとこういう態度を取られます。

ですよね!

リリース情報

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

前半はここまで

長くなったので前後編に分けました。

https://zenn.dev/it_ks/articles/ae1e3db51fda7b

Discussion