PyPIデビュー手前の人のための地下活動手法
PyPICloudを使ったプライベートレジストリの構築
- date:
2021-10-15
- event:
PyCon JP 2021
- speaker:
Kazuya Takei / @attakei / NIJIBOX Co., Ltd.
- hashtag:
はじめに
お前誰よ?
Kazuya Takei / @attakei (Tw, GT, GL,,,)
趣味系Pythonista/ライブラリ・拡張系の開発がメイン
sphinx-revealjs
sphinxcontrib-gtagjs
Errbotプラグインいろいろ
お前誰よ?
Kazuya Takei / 株式会社ニジボックス
バックエンド寄りのフルスタック気味(CI系が一番コア?)
技術ハードルの突破要因をしたり
POSTDの運用設計とかをしたり
AD:株式会社ニジボックス
AD:株式会社ニジボックス
海外のテクノロジー系記事を日本語で読むことができるエンジニア向けのキュレーションメディア
株式会社ニジボックスが運営を引き継ぎ再始動
アジェンダ
PyPIデビュー手前の人のためのPyPI体験記
PyPICloudからの自己紹介
PyPICloudの使い方あれこれ
PyPICloudを実際に使ってみて
話すこと
pypucloudの...
使い方
使い道
使い勝手
これらを通じて、PyPIデビュー手前の「地下活動」手法
話さないこと
- PyPICloudにアップロードするものの作り方=> いわゆるPyPIデビューのためのパッケージ作成周り
- PyPICloudの突っ込んだ使い方=> PyPICloudのエキスパートになる方法
PyPIデビュー手前の人のためのPyPI体験記
3行で説明する大雑把な「PyPIデビュー」
「これ何度も使うな?」というコードをひとまとめにする
実コード以外にも必要なファイルを揃えてパッケージを作成して
PyPIにアップロードする
デビューしていない方向け
PyPIデビュー時/デビュー後の悩みごと
※以下、個人の感想です
グローバルな名前空間を1個使って良いものか
パブリックなパッケージにしか出来ない
↑を踏まえて、PyPIにいきなりアップロードすることに抵抗がある
※グローバルな名前空間
そうじゃない例:
npm(Node.js):
@attakei/sync-nextjs-rewrites
Packagist(PHP):
phpunit/phpunit
※グローバルな名前空間
=> メンテナンスを放置したときに、利用者がちょっと困る...かも?
※グローバルな名前空間
(まだ、おとぎ話です)
とあるパッケージ
errcron
があります。 たまたま使ってた人が改善してみたのですが、作者が放置気味のため、 「同じ機能を提供している」のに改善版の反映が出来ません。仕方がないので、
errcron3
を公開することにしました。そして、カオスが始まります...
※パブリックにしかならない
PyPI自体に登録するパッケージはプライベートに出来ない。
=> 「社内限定の特定用途ライブラリ」「PyPIにあるやつに固有なチューニングしたい」
よくある解決例
アーカイブを直接配布する
Gitリポジトリだけ公開する
専用のパッケージレジストリを用意する
よくある解決例
- アーカイブを直接配布する
pip install /opt/my-package.whl
- Gitリポジトリだけ公開する
pip install git+https://github.com/attakei/my-package.git
- 専用のパッケージレジストリを用意する↑今日のお題はここ!
PyPICloudからの自己紹介
PyPICloudとは
https://pypi.org/project/pypicloud/
This package is a Pyramid web app that provides a PyPI server where the packages are stored on Amazon’s Simple Storage Service (S3), Google’s Cloud Storage (GCS) or Azure’s Blob Storage.
※README序文より引用
意訳すると: S3,GCS,Azure Blobでパッケージファイルを管理できるPyramid製のPyPIサーバー
PyPICloudとは
https://pypi.org/project/pypicloud/
使用感としては、
最初からクラウドサービス上での運用を前提とした
各種IaaS向けのインターフェース設計をしている
プライベートなPyPIサーバーアプリケーション
※もちろんローカルでの利用も可能
ちょっと使ってみる
(デモ予定)
ちょっと使ってみる
ターミナル1
$ python -m venv .venv
$ . .venv/bin/activate
(.venv) $ pip install 'pypicloud[server]'
(.venv) $ pypicloud-make-config config.ini
(.venv) $ pserve config.ini
ターミナル2
$ python -m venv .venv
$ . .venv/bin/activate
(.venv) $ pip install --index-url bottle
ところで
最初からクラウドサービス上での運用を前提とした
各種IaaS向けのインターフェース設計をしている
...って何だ?
pypicloudの仕組み(図解)
PyPICloudに加えて、Storage/Cacheの3層構成
pypicloudの仕組み(図解)
Storageは、実際にインストールされていくパッケージファイルの管理が役割。
S3 in AWS
GCS in GCP
ローカルファイルシステム
pypicloudの仕組み(図解)
Cacheはパッケージのメタ情報をファイルから取り出してキャッシュする。 パッケージの検索や情報閲覧をする際のKVSとして用いる。
RDB
DynamoDB
設定ファイルの中身紹介
[app:main]
; PyPICloudに指定パッケージがないときどうするか
pypi.fallback = cache
; everyone = 誰でも、 authenticated = 認証済みユーザーのみ
; 読み取り(パッケージ情報の取得・検索など)の権限
pypi.default_read =
everyone
; 書き込み(パッケージの登録など)の権限
pypi.default_write =
authenticated
; キャッシュ関連の更新の権限
pypi.cache_update =
everyone
設定ファイルの中身紹介
; Storageに何を使うか
pypi.storage = s3
storage.XXXXX = XXX
; Cacheに何を使うか
pypi.db = dynamo
db.region_name = ap-northeast-1
db.namespace = mypypicloud
; 管理者(パッケージをアップロードする人)
auth.admins =
admin
user.admin = $6$rounds=20500$Nooooooooooooooooooooooooooooooooo
構成例
シンプルにローカルで動かしてみたり...
構成例
AWSを可能な限り使ってみたり...
構成例
GCP上で動かしてみたり...
構成例
特殊な基盤向けに、StorageもCacheを自作してみたり
PyPICloudの使い方あれこれ
大まかに3種類の使い方を考える
LAN内のPyPIプロキシサーバー
個人パッケージの公開用サーバー
組織用プライベートレジストリ
LAN内のPyPIプロキシサーバー
構成
LAN内(AWS-VPC内)などのパターン
Clientらは外部アクセスをせず、PyPICloudだけが通信するイメージ
LAN内のPyPIプロキシサーバー
設定例(抜粋)
; 自身が知らないパッケージはfallback先からダウンロードしてキャッシュする
pypi.fallback = cache
; 上記キャッシュの更新を誰でも出来るようにする
pypi.cache_update =
everyone
LAN内のPyPIプロキシサーバー
特徴とか
⭕ 通信経路の限定化が出来る
⭕ パッケージがLAN内に残るので、2台目以降が高速
❌ PyPICloudである必要性がない
❌ ゴールデンイメージで十分
個人パッケージの公開用サーバー
構成
- 外部公開されたWebアプリケーション(heroku, EC2, docker services)
Storage, Cacheにはローカル以外を使う(ことが良い)
個人パッケージの公開用サーバー
設定例(抜粋)
; 自身が知らないパッケージはfallback先へリダイレクトする
pypi.fallback = redirect
; (初期設定)認証済みユーザーによってパッケージをアップロードできる
pypi.default_write =
authenticated
個人パッケージの公開用サーバー
特徴とか
⭕ 自分の好きなパッケージを登録できる
⭕ 公開サービスなので、READMEの案内がしやすくなる
❌ 他人が利用する可能性があるため、サービス維持を意識する必要がある
組織用プライベートレジストリ
構成
- Webアプリケーション(heroku, EC2, docker services)アクセス制限はあったほうが良い(なくても一応平気)
Storage, Cacheにはローカル以外を使う(ことが良い)
組織用プライベートレジストリ
設定例(抜粋)
; 自身が知らないパッケージはfallback先へリダイレクトする
pypi.fallback = redirect
; アクセス自体も認証状態であることを求める
pypi.default_read =
authenticated
組織用プライベートレジストリ
特徴とか
⭕ アクセス制限のあるPyPIを提供できるので、プライベートなパッケージを気兼ねなく登録できる
❌ 組織内で積極利用することが前提になり、きちんとしたサービス維持を要求される
PyPICloudを実際に使ってみて
PyPICloudを外部公開する
PyPICloudを外部公開する
As python packege
-----------------
1. Run ``pip install --extra-index-url https://pypi.attakei.net/simple/ errbot-slack-bolt-backend``
2. | Import function to get plugin directory from ``errbot_slack_bolt_backend``.
| example: ``from errbot_slack_bolt_backend import get_plugin_dir``
Readmeのインストールガイドが pip install --extra-index-url https://pypi.attakei.net/simple/ ~~
といったように、
PyPICloudのURLを指定している状態で記述できる。
構成
StorageはGCS(標準提供)
CacheはFirestore用の実装(自作) ※
PyPICloudはCloud Runで動作
Firebase Hostingをフロントにして強キャッシュ
※需要がわからないので、これ自体もPyPICloudで公開
運用しての感想
パッケージ管理
「とりあえずPyPICloud上で公開すればいい」と気持ちがちょっと楽になる
自分以外に使っている人がいるっぽい
コスト周り
パッケージの数もそんなに多くなく、費用はほぼゼロ
間違ってバズったりする前にPyPIに引っ越すのでコストはそんなに増えない...はず
まとめ
振り返り
PyPICloudの紹介を、使い方・使い道の面で紹介しました
一度構築するとシンプルな運用で、地下活動できます
この地下活動で弾みをつけて、よりPyPIアップロードが捗ると良いですね
おまけ
https://github.com/attakei-lab/pypicloud-trials
AWS上に、サーバーレスなアーキテクチャでPyPICloudを構築するAnsible playbookを作ってみています。
S3
DynamoDB
App Runner
ECR
(※ 余裕があればデモ)
Thanks!
※ここからは参考リンクなどです
PyPICloud
Myself
Thanks!
※ここからは参考リンクなどです
NIJIBOX Co., Ltd.