PyPIデビュー手前の人のための地下活動手法

PyPICloudを使ったプライベートレジストリの構築

date:

2021-10-15

event:

PyCon JP 2021

speaker:

Kazuya Takei / @attakei / NIJIBOX Co., Ltd.

hashtag:

#pyconjp

はじめに

お前誰よ?

Kazuya Takei / @attakei (Tw, GT, GL,,,)

趣味系Pythonista/ライブラリ・拡張系の開発がメイン

  • sphinx-revealjs

  • sphinxcontrib-gtagjs

  • Errbotプラグインいろいろ

https://attakei.net/_static/images/icon-attakei@2x.png

お前誰よ?

Kazuya Takei / 株式会社ニジボックス

  • バックエンド寄りのフルスタック気味(CI系が一番コア?)

  • 技術ハードルの突破要因をしたり

  • POSTDの運用設計とかをしたり

https://attakei.net/_static/images/icon-attakei@2x.png

AD:株式会社ニジボックス

../_images/logo-nijibox.svg
株式会社ニジボックスは、UXデザインに特化した、リクルートグループのWeb制作会社です。
新規事業の立ち上げ支援、UXデザイン、UIデザイン、Web制作、開発、動画制作、イラスト制作、リリース後のグロースハックまで、一気通貫でサポートしています。

AD:株式会社ニジボックス

../_images/logo-postd.png

POSTD

  • 海外のテクノロジー系記事を日本語で読むことができるエンジニア向けのキュレーションメディア

  • 株式会社ニジボックスが運営を引き継ぎ再始動

アジェンダ

  • PyPIデビュー手前の人のためのPyPI体験記

  • PyPICloudからの自己紹介

  • PyPICloudの使い方あれこれ

  • PyPICloudを実際に使ってみて

話すこと

pypucloudの...

  • 使い方

  • 使い道

  • 使い勝手

これらを通じて、PyPIデビュー手前の「地下活動」手法

話さないこと

  • PyPICloudにアップロードするものの作り方
    => いわゆるPyPIデビューのためのパッケージ作成周り
  • PyPICloudの突っ込んだ使い方
    => PyPICloudのエキスパートになる方法

PyPIデビュー手前の人のためのPyPI体験記

PyPIデビューしてますか?
or
PyPIデビューしてみようと思ったことありますか?

3行で説明する大雑把な「PyPIデビュー」

  • 「これ何度も使うな?」というコードをひとまとめにする

  • 実コード以外にも必要なファイルを揃えてパッケージを作成して

  • PyPIにアップロードする

デビューしていない方向け

../_images/pypi-debut.png

PyPIデビュー時/デビュー後の悩みごと

※以下、個人の感想です

  • グローバルな名前空間を1個使って良いものか

  • パブリックなパッケージにしか出来ない

  • ↑を踏まえて、PyPIにいきなりアップロードすることに抵抗がある

※グローバルな名前空間

PyPIに登録するパッケージ名は単一の名前空間上に登録される。
(Pythonのライブラリとしてはサブパッケージは可能)

そうじゃない例:

  • npm(Node.js): @attakei/sync-nextjs-rewrites

  • Packagist(PHP): phpunit/phpunit

※グローバルな名前空間

PyPIに登録するパッケージ名は単一の名前空間上に登録される。
(Pythonのライブラリとしてはサブパッケージは可能)

=> メンテナンスを放置したときに、利用者がちょっと困る...かも?

※グローバルな名前空間

(まだ、おとぎ話です)

とあるパッケージ 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

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!

※ここからは参考リンクなどです

Thanks!

※ここからは参考リンクなどです