Slide 1

Slide 1 text

PyPIデビュー手前の人のための 地下活動手法 PyPICloudを使ったプライベートレジストリの構築 date 2021-10-15 event PyCon JP 2021 speaker Kazuya Takei / @attakei / NIJIBOX Co., Ltd. hashtag #pyconjp

Slide 2

Slide 2 text

はじめに

Slide 3

Slide 3 text

お前誰よ? Kazuya Takei / @attakei (Tw, GT, GL,,,) 趣味系Pythonista/ライブラリ‧拡張系 の開発がメイン sphinx-revealjs sphinxcontrib-gtagjs Errbotプラグインいろいろ

Slide 4

Slide 4 text

お前誰よ? Kazuya Takei / 株式会社ニジボックス バックエンド寄りのフルスタック 気味(CI系が一番コア?) 技術ハードルの突破要因をしたり POSTDの運用設計とかをしたり

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

AD:株式会社ニジボックス 海外のテクノロジー系記事を日本語で読むことができ るエンジニア向けのキュレーションメディア 株式会社ニジボックスが運営を引き継ぎ再始動 POSTD

Slide 7

Slide 7 text

アジェンダ PyPIデビュー手前の人のためのPyPI体験記 PyPICloudからの自己紹介 PyPICloudの使い方あれこれ PyPICloudを実際に使ってみて

Slide 8

Slide 8 text

話すこと pypucloudの… 使い方 使い道 使い勝手 これらを通じて、PyPIデビュー手前の「地下活動」手法

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

3行で説明する大雑把な「PyPIデビュ ー」 「これ何度も使うな?」というコードをひとまとめに する 実コード以外にも必要なファイルを揃えてパッケージ を作成して PyPIにアップロードする

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

PyPIデビュー時/デビュー後の悩みご と ※以下、個人の感想です グローバルな名前空間を1個使って良いものか パブリックなパッケージにしか出来ない ↑を踏まえて、PyPIにいきなりアップロードすること に抵抗がある

Slide 15

Slide 15 text

※グローバルな名前空間 PyPIに登録するパッケージ名は単一の名前空間上に登録さ れる。 (Pythonのライブラリとしてはサブパッケージは可能) そうじゃない例: npm(Node.js): @attakei/sync-nextjs-rewrites Packagist(PHP): phpunit/phpunit

Slide 16

Slide 16 text

※グローバルな名前空間 PyPIに登録するパッケージ名は単一の名前空間上に登録さ れる。 (Pythonのライブラリとしてはサブパッケージは可能) => メンテナンスを放置したときに、利用者がちょっと困 る…かも?

Slide 17

Slide 17 text

※グローバルな名前空間 (まだ、おとぎ話です) とあるパッケージ errcron があります。 たまたま使ってた人が改善し てみたのですが、作者が放置気味のため、 「同じ機能を提供してい る」のに改善版の反映が出来ません。 仕方がないので、 errcron3 を公開することにしました。 そして、カオスが始まります…

Slide 18

Slide 18 text

※パブリックにしかならない PyPI自体に登録するパッケージはプライベートに出来な い。 => 「社内限定の特定用途ライブラリ」「PyPIにあるやつに 固有なチューニングしたい」

Slide 19

Slide 19 text

よくある解決例 アーカイブを直接配布する Gitリポジトリだけ公開する 専用のパッケージレジストリを用意する

Slide 20

Slide 20 text

よくある解決例 アーカイブを直接配布する pip install /opt/my-package.whl Gitリポジトリだけ公開する pip install git+https://github.com/attakei/my- package.git 専用のパッケージレジストリを用意する ↑今日のお題はここ!

Slide 21

Slide 21 text

PyPICloudからの自己紹介

Slide 22

Slide 22 text

PyPICloudとは 意訳すると: S ,GCS,Azure Blobでパッケージファイルを管 理できるPyramid製のPyPIサーバー 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 (S ), Google’s Cloud Storage (GCS) or Azure’s Blob Storage. ※README序文より引用

Slide 23

Slide 23 text

PyPICloudとは 使用感としては、 最初からクラウドサービス上での運用を前提とした 各種IaaS向けのインターフェース設計をしている プライベートなPyPIサーバーアプリケーション ※もちろんローカルでの利用も可能 https://pypi.org/project/pypicloud/

Slide 24

Slide 24 text

ちょっと使ってみる (デモ予定)

Slide 25

Slide 25 text

ちょっと使ってみる ターミナル1 ターミナル2 $ python -m venv .venv $ . .venv/bin/activate (.venv) $ pip install 'pypicloud[server]' (.venv) $ pypicloud-make-config config.ini (.venv) $ pserve config.ini $ python -m venv .venv $ . .venv/bin/activate (.venv) $ pip install --index-url bottle

Slide 26

Slide 26 text

ところで 最初からクラウドサービス上での運用を前提とした 各種IaaS向けのインターフェース設計をしている …って何だ?

Slide 27

Slide 27 text

pypicloudの仕組み(図解) PyPICloudに加えて、Storage/Cacheの 3層構成 PyPICloud Cache Storage

Slide 28

Slide 28 text

pypicloudの仕組み(図解) Storageは、実際にインストールされて いくパッケージファイルの管理が役 割。 S in AWS GCS in GCP ローカルファイルシステム PyPICloud Cache Storage

Slide 29

Slide 29 text

pypicloudの仕組み(図解) Cacheはパッケージのメタ情報をファ イルから取り出してキャッシュする。 パッケージの検索や情報閲覧をする際 のKVSとして用いる。 RDB DynamoDB PyPICloud Cache Storage

Slide 30

Slide 30 text

設定ファイルの中身紹介 [app:main] ; PyPICloudに指定パッケージがないときどうするか pypi.fallback = cache ; everyone = 誰でも、 authenticated = 認証済みユーザーのみ ; 読み取り(パッケージ情報の取得・検索など)の権限 pypi.default_read = everyone ; 書き込み(パッケージの登録など)の権限 pypi.default_write = authenticated ; キャッシュ関連の更新の権限 pypi.cache_update = everyone

Slide 31

Slide 31 text

設定ファイルの中身紹介 ; 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

Slide 32

Slide 32 text

構成例 シンプルにローカルで動かしてみた り… PyPICloud Local sqlite3 Local filesystem

Slide 33

Slide 33 text

構成例 AWSを可能な限り使ってみたり… AppRunner DynamoDB S3

Slide 34

Slide 34 text

構成例 GCP上で動かしてみたり… PyPICloud Local sqlite3 GCS

Slide 35

Slide 35 text

構成例 特殊な基盤向けに、StorageもCacheを 自作してみたり PyPICloud Custom Cache Custom Storage

Slide 36

Slide 36 text

PyPICloudの使い方あれこ れ

Slide 37

Slide 37 text

大まかに3種類の使い方を考える LAN内のPyPIプロキシサーバー 個人パッケージの公開用サーバー 組織用プライベートレジストリ

Slide 38

Slide 38 text

LAN内のPyPIプロキシサーバー 構成 PyPICloud Client1 Client2 PyPI LAN内(AWS-VPC内)などのパターン Clientらは外部アクセスをせず、PyPICloudだけが通 信するイメージ

Slide 39

Slide 39 text

LAN内のPyPIプロキシサーバー 設定例(抜粋) ; 自身が知らないパッケージはfallback先からダウンロードしてキャッシュする pypi.fallback = cache ; 上記キャッシュの更新を誰でも出来るようにする pypi.cache_update = everyone

Slide 40

Slide 40 text

LAN内のPyPIプロキシサーバー 特徴とか ⭕ 通信経路の限定化が出来る ⭕ パッケージがLAN内に残るので、2台目以降が高速 ❌ PyPICloudである必要性がない ❌ ゴールデンイメージで十分

Slide 41

Slide 41 text

個人パッケージの公開用サーバー 構成 PyPICloud PyPI Client 外部公開されたWebアプリケーション (heroku, EC , docker services) Storage, Cacheにはローカル以外を使う(ことが良 い)

Slide 42

Slide 42 text

個人パッケージの公開用サーバー 設定例(抜粋) ; 自身が知らないパッケージはfallback先へリダイレクトする pypi.fallback = redirect ; (初期設定)認証済みユーザーによってパッケージをアップロードできる pypi.default_write = authenticated

Slide 43

Slide 43 text

個人パッケージの公開用サーバー 特徴とか ⭕ 自分の好きなパッケージを登録できる ⭕ 公開サービスなので、READMEの案内がしやすくな る ❌ 他人が利用する可能性があるため、サービス維持 を意識する必要がある

Slide 44

Slide 44 text

組織用プライベートレジストリ 構成 PyPICloud PyPI Client Webアプリケーション(heroku, EC , docker services) アクセス制限はあったほうが良い(なくても一応平 気) Storage, Cacheにはローカル以外を使う(ことが良 い)

Slide 45

Slide 45 text

組織用プライベートレジストリ 設定例(抜粋) ; 自身が知らないパッケージはfallback先へリダイレクトする pypi.fallback = redirect ; アクセス自体も認証状態であることを求める pypi.default_read = authenticated

Slide 46

Slide 46 text

組織用プライベートレジストリ 特徴とか ⭕ アクセス制限のあるPyPIを提供できるので、プライ ベートなパッケージを気兼ねなく登録できる ❌ 組織内で積極利用することが前提になり、きちんと したサービス維持を要求される

Slide 47

Slide 47 text

PyPICloudを実際に使って みて

Slide 48

Slide 48 text

PyPICloudを外部公開する 私が個人用に公開しているPyPICloud => https://pypi.attakei.net

Slide 49

Slide 49 text

PyPICloudを外部公開する Readmeのインストールガイドが pip install --extra- index-url https://pypi.attakei.net/simple/ ~~ といっ たように、 PyPICloudのURLを指定している状態で記述で きる。 As python packege ----------------- 1. Run ``pip install --extra-index-url https://pypi.attakei.net/simple/ errbot-slack-bo 2. | Import function to get plugin directory from ``errbot_slack_bolt_backend``. | example: ``from errbot_slack_bolt_backend import get_plugin_dir``

Slide 50

Slide 50 text

構成 StorageはGCS(標準提供) CacheはFirestore用の実装(自 作) ※ PyPICloudはCloud Runで動作 Firebase Hostingをフロントにし て強キャッシュ Firebase(CDN) Cloud Run(PyPICloud) Firestore(Cache) GCS(Storage) ※需要がわからないので、これ自体もPyPICloudで公開

Slide 51

Slide 51 text

運用しての感想 パッケージ管理 「とりあえずPyPICloud上で公開すればいい」と気持 ちがちょっと楽になる 自分以外に使っている人がいるっぽい コスト周り パッケージの数もそんなに多くなく、費用はほぼゼロ 間違ってバズったりする前にPyPIに引っ越すのでコス トはそんなに増えない…はず

Slide 52

Slide 52 text

まとめ

Slide 53

Slide 53 text

振り返り PyPICloudの紹介を、使い方‧使い道の面で紹介しま した 一度構築するとシンプルな運用で、地下活動できます この地下活動で弾みをつけて、よりPyPIアップロード が捗ると良いですね

Slide 54

Slide 54 text

おまけ AWS上に、サーバーレスなアーキテクチャでPyPICloudを 構築するAnsible playbookを作ってみています。 S DynamoDB App Runner ECR (※ 余裕があればデモ) https://github.com/attakei-lab/pypicloud-trials

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

Thanks! ※ここからは参考リンクなどです NIJIBOX Co., Ltd. https://nijibox.jp/ https://recruit.nijibox.jp/ https://postd.cc/