2020年11月9日月曜日

Chromebook で、Linux を使う。(2020年11月)

 久々に Chromebook の Linux を入れ直してみた。


OS が Debian10(buster) になり、Python2 が外された。

いよいよ本格的に Python3 の時代です。


で、仮想環境の構築から、Cloud-SDKのインストールまでやってみました。

手順は以下の通り。


--

google-cloud-datastore のインストールで躓き。ちょっと修正。

pip と setuptools を更新(-U)して、grpcio をインストールするのがポイント。

※ pip3 install grpcio ...とても時間掛かります... のんびり待ちましょ。

[仮想環境]

$ sudo apt update && sudo apt upgrade

$ sudo apt install python3-dev python3-venv build-essential

$ mkdir test && cd test

$ python3 -m venv env

$ source env/bin/activate

V pip3 install -U pip setuptools

V pip3 install grpcio

V pip3 install google-cloud-datastore

V deactivate

$

--

[仮想環境]

$ sudo apt update && sudo apt upgrade

$ sudo apt install python3-venv

$ mkdir test

$ cd test

$ python3 -m venv env

$ source env/bin/activate

V deactivate

$


[Cloud SDK]

$ echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list

$ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -

$ sudo apt update && sudo apt install google-cloud-sdk

$ gcloud init

$ sudo apt install google-cloud-sdk-app-engine-python

$ sudo apt install google-cloud-sdk-datastore-emulator



補足です。


・仮想環境内のPATHを確認

V which python3

-> /home/xxxxxx/test/env/bin/python3

V pip -V

-> pip 18.1 from /home/xxxxxx/test/env/lib/python3.7/site-packages/pip (python 3.7)


・Cloud SDK は、Debian/Ubuntu の手順で

 https://cloud.google.com/sdk/docs/quickstart-debian-ubuntu?hl=ja


こんなに簡単に開発環境が手に入るなんて!! とても素敵です。


2020年5月6日水曜日

GAE/Python3/Flask で Cloud Tasks を使う

非同期処理に使いたいので、調べてみました。

こちらを参考に
https://cloud.google.com/tasks/docs/creating-appengine-tasks?hl=ja

インストール
$ pip install google-cloud-tasks

まず、タスクを作ってキューに入れます。
--
@app.route('/task_send')
def task_send():
 from google.cloud import tasks_v2

 PROJECT = <プロジェクトID>
 LOCATION = <リージョン>
 QUEUE = "default"

 client = tasks_v2.CloudTasksClient()
 parent = client.queue_path(PROJECT, LOCATION, QUEUE)

 app_route = "/task_run"

 data = {
  'a': "abc",
 }
 payload = json.dumps(data)

 task = {
  'app_engine_http_request': {
   'http_method': 'POST',
   'relative_uri': app_route,
   'headers': {
    'Content-Type': "application/json"
   },
   'body': payload.encode(),
  }
 }

 response = client.create_task(parent, task)
--

説明
・LOCATION: GAEの実行場所(リージョン)です。
 "us-central"の場合、"us-central1" とします。(1を追記)
・app_route: タスクを実行する場所(PATH)です。
・data: データをJSON形式で送りたいので、一旦dictに入れて、jsonに変換します。
・headers: Content-Typeを jsonにします。
 ※デフォルトは、"application/octet-stream"

次に、タスクを受け取ります。
--
@app.route('/task_run', methods=["POST"])
def task_run():
 data = request.json
 ....
--
説明
・data: dictデータです。

あとは、お好きに。

2020年4月17日金曜日

GCEに「NGINX Unit」入れて、WEB(アプリケーション)サーバとして使う

久しぶりにGCE(Google Compute Engine)を使うことになり、改めて最新のトレンドをチェックしてみました。

[GCEの無料枠]
これは健在でした。
と言うか、「無料枠で試しに使って貰い、他社との優位性を知らしめる」戦略なのでしょう。
技術力に自信があるからこその戦略だと思います。
個人で趣味的に使うには、この無料枠で充分。

無料枠の条件
・リージョン(地域): us-central(米中央), us-west(西海岸), us-east(東海岸)
・マシンタイプ: f1-micro
要は、「アメリカのデータセンターで、一番スペックの低いCPU」と言うことですが、サーバ用途であれば十分です。

[OS]
Ubuntuしか使わないので、その他のことは分かりません...
とりあえず、それなりに新しいものを使います。
OS: Ubuntu18.04 LTS

OSの選択で、「Minimal Ubuntu」と言う見慣れないものがあったので、ちょっと調べてみました。
これ、クラウド用のOSなんですね。
とりあえず、HDDは十分(20GB)あるので、通常バージョンで良いかと。

[Nginx]
Web(アプリケーション)サーバとして、単にFlaskを動かしたいだけなのに、これまでだと、uWSGI入れて、設定をあれやって、これやって... と、非常に煩雑で、はっきり言って面倒くさい!!!!

で、調べてみると「NGINX Unit」なるものが有りました。
これ、凄いかも。

本家はこちら。
http://unit.nginx.org/

aptでインストールして、jsonで設定するだけ。ほんと簡単です。ビックリ!!!!!
もう、Apacheは、過去の遺物ですね。(言い過ぎ!!!)


-- 以下は、自分用のメモです。--

[GCE/VM]
コンソール
https://console.cloud.google.com/home/dashboard

新規プロジェクトの作成
 ※省略

課金の上限設定
 お支払 → 予算とアラート
 予算額: 100円
  Budget type: 指定額
  Target amount: ¥100

Compute Engine
VMインスタンス
インスタンスの作成
 ゾーン      us-west1-b
 シリーズ     N1
 マシンタイプ   f1-micro
 ブートディスク  Ubuntu18.04 LTS 20GB ※残り10GBは将来用
 ファイアウォール HTTP

接続 SSH → ブラウザウィンドゥで開く
 ※初回のみ標準ポート(22)で接続

SSHのポートを変更 (OS側) ※セキュリティリスク対策
$ sudo sed -i".bak" -e 's/#Port 22/Port 3843/g' /etc/ssh/sshd_config
$ sudo reboot

VPCネットワーク
外部IPアドレス
 種類: エフェメラル → 静的
  新しい静的IPアドレスの予約: static-ip

ファイヤーウォール
 *SSHのポートを変更 (FW側)
 default-allow-ssh
 SSH port: 22 -> xxxx *任意のポート

接続 SSH → ブラウザウィンドゥでカスタムポートを開く
 ※SSHdの Port変更後は、カスタムポート(xxxx)で接続

スワップの作成
How to Create a Swap File on Google Compute Engine Virtual Machines

$ sudo -i   *rootで作業
-- shell command
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
swapon -s
echo "/swapfile none swap sw 0 0" >> /etc/fstab
--
# reboot

接続 SSH → ブラウザウィンドゥでカスタムポートを開く

[apt]
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install python3-venv python-pip

[Flask]
https://flask.palletsprojects.com/en/1.0.x/installation/#installation

構成
~/
└ project1/
  ├ venv/
  │ └ Flask
  └ main.py

仮想環境 & Flaskインストール
$ cd
$ mkdir project1 && cd project1
$ python3 -m venv venv
$ source ./venv/bin/activate
V pip install Flask

アプリケーション
V nano main.py
--
from flask import Flask
application = Flask(__name__)
@application.route("/")
def index():
  return "Hello Project1!"
if __name__ == "__main__":
  application.run()
--

動作確認
V python3 main.py
 →コンソールをもう1つ開いて動作確認
  $ curl http://127.0.0.1:5000/

V deactivate

[Nginx]
http://unit.nginx.org/installation/#ubuntu

(インストール準備)
キー取得
$ sudo -i   *rootで作業
# curl -sL https://nginx.org/keys/nginx_signing.key | apt-key add -

リポジトリ追加 *Ubuntu18.04 = bionic
# nano /etc/apt/sources.list.d/unit.list
--
deb https://packages.nginx.org/unit/ubuntu/ bionic unit
deb-src https://packages.nginx.org/unit/ubuntu/ bionic unit
--

インストール
# apt update
# apt install unit unit-dev unit-python3.6

コンフィグ
https://unit.nginx.org/howto/flask/

ソケットの場所を調べる
# unitd --help
 --control ADDRESS
  set address of control API socket
  default: "unix:/var/run/control.unit.sock"

現在の設定をファイルに出力
# curl --unix-socket /var/run/control.unit.sock http://localhost/config/ > config.json

Flask用の設定
# nano config.json
--
{
 "listeners": {
  "*:80": {
   "pass": "applications/flask_app"
  }
 },
 "applications": {
  "flask_app": {
   "type": "python",
   "path": "/home/yamayoshiakira/project1/",
   "home": "/home/yamayoshiakira/project1/venv/",
   "module": "main"
  }
 }
}
--
*説明
 listeners: ポート *80(HTTP)
 type: 言語
 path: プログラムの場所
 home: 仮想環境の場所
 module: プログラム本体(ファイル拡張子を除く)

設定を上書き
# curl -X PUT --data-binary @config.json --unix-socket /var/run/control.unit.sock http://localhost/config

再起動
# service unit restart

ブラウザから動作確認。
おつかれさまでした。

参考サイト
http://yamayoshi.blogspot.com/2017/06/gce.html
http://unit.nginx.org/configuration/
https://thr3a.hatenablog.com/entry/20170909/1504925172
https://qiita.com/happou/items/23be1615927be6376dec

----
UNIT のサンプルアプリを調べてみる
# apt install unit unit-dev unit-python3.6

こんなメッセージが出たの、調べてみます。
The Python 3.6 module for NGINX Unit has been installed.
To check out the sample app, run these commands:
 sudo service unit restart
 cd /usr/share/doc/unit-python3.6/examples
 sudo curl -X PUT --data-binary @unit.config --unix-socket /var/run/control.unit.sock http://localhost/config
 curl http://localhost:8400/
Online documentation is available at https://unit.nginx.org

デフォルトの設定値
# curl --unix-socket /var/run/control.unit.sock http://localhost/config/ > config.json
--
{
 "listeners": {},
 "applications": {}
}
--

サンプルを見てみる
/usr/share/doc/unit-python3.6/examples
├ unit.config
└ python-app/
  └ wsgi.py

File: unit.config
--
{
 "applications": {
  "example_python": {
   "type": "python 3.6",
   "user": "nobody",
   "processes": 2,
   "path": "/usr/share/doc/unit-python3.6/examples/python-app",
   "module": "wsgi"
  }
 },
 "listeners": {
  "*:8400": {
   "pass": "applications/example_python"
  }
 }
}
--

File: wsgi.py
--
import os
import datetime
import sys
def application(environ, start_response):
 output = datetime.datetime.now().strftime("%Y-%m-%d %I:%M:%S %p")
 output += "\n\nPython: "
 output += sys.version
 output += "\n\nENV Variables:\n\n"
 for param in os.environ.keys():
  output += param
  output += "\t"
  output += os.environ[param]
  output += "\n"
 start_response('200 OK', [('Content-type', 'text/plain')])
 return [s.encode('utf8') for s in output]
--