Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2023-08-26 湘南.pm

2023-08-26 湘南.pm

Ichinose Shogo

August 26, 2023
Tweet

Other Decks in Programming

Transcript

  1. アジェンダ • 宣伝 • 趣味でPerlのビルドをしている話 ◦ なぜPerlをビルドするのか ◦ AWS::Lambda ▪

    SYNOPSIS ▪ どうやってビルドしているのか ▪ ビルドの難所 ◦ actions-setup-perl ▪ SYNOPSIS ▪ どうやってビルドしているのか ▪ ビルドの難所
  2. なぜPerlをビルドするのか • そこにPerlがないから ◦ クラウドサービスの発展により、プログラムを実行する環境は増えてきた ◦ しかしPerlをサポートしているサービスはほとんどない・・・ • AWS Lambda

    ◦ Node.js, Python, Java, .NET, Go, Ruby • GitHub Actions ◦ setup-node, setup-python, setup-go, setup-dotnet, setup-ruby, setup-elixir, setup-haskell • 自分でビルドするしかない ◦ さいわいC言語の環境は用意されている
  3. AWS Lambda • AWSの代表的なサーバーレスな計算サービス • 「サーバーはあります!」 ◦ ユーザーがサーバーの運用保守について気にする必要はない ▪ サーバーの起動

    ▪ サーバーの監視 ▪ OS・ミドルウェアのアップデート ◦ サーバー自体は存在して、その上で動く コードや権限の設定 はしないといけない • 2023年8月時点での対応言語 ◦ Node.js, Python, Java, .NET, Go, Ruby ◦ Where is Perl…?
  4. Perl Custom Runtime • AWS Lambda上でPerlを動かすための自作ランタイム ◦ 2018年11月にCustom Runtimeが発表され、任意のプログラムが実行可能に! •

    ランタイムに含まれるもの ◦ ビルド済みのPerl ◦ AWS::Lambda ▪ Custom Runtimeの仕様にそってPerlのコードを実行するためのモジュール ◦ Net::SSLeay, IO::Socket::SSL などの暗号化モジュール ◦ JSONやYAMLのデコーダ ◦ オプションでPaws ▪ Perl向けのAWS SDK
  5. 詳細はPerl Hackers Hubで! WEB+DB PRESS Vol.131 Perl Hackers Hub 【第75回】AWS

    Lambda入門 ……サーバレスでも Perlを活用しよう! (WEB+DB PRESS 休刊になっちゃいましたね・・・) https://gihyo.jp/dev/serial/01/perl-hackers-hub/007501
  6. どうやってビルドしているのか • ビルド環境: Docker ◦ AWS Lambdaの環境をエミュレーションした Dockerイメージを利用 ◦ AWS

    サーバーレスアプリケーションモデル (SAM、Serverless Application Model)の一部として開 発環境インストール済みのイメージが提供されている • x86_64, arm64 のビルドはQEMUでエミュレーション ◦ Docker Buildxを使うとお手軽 ◦ 途中で作業マシンを Intel から Apple Silicon に変えたけど、まったく問題ない • ビルドスクリプトとしてPerl-Build ◦ https://github.com/tokuhirom/Perl-Build ◦ plenvの裏側で使われているやつ
  7. ビルドの難所: Paws • AWS上で実行可能なアクションの数だけモジュールが入っていてひたすら重い % find . -name '*.pm' |

    wc -l 29314 • PAUSEを殺してしまう ◦ Paws 0.43のリリースと同時期に、 PAUSEがDisk Fullになって死んだ ▪ http://neilb.org/2021/05/10/delete-your-old-releases.html ▪ https://github.com/pplu/aws-sdk-perl/pull/383 ▪ (因果関係は知らないけど) ◦ Paws 0.45(2022年6月にリリース)は未だインデックスされていない・・・
  8. Pawsの圧縮 • tar.gzを解凍するだけで約120MB ◦ AWS Lambdaのストレージ制限は 250MBでちょっと厳しい ▪ ※ Zipアップロードの場合。今は

    Dockerイメージを使って10GBまでいける ▪ とはいえ軽いほうがうれしいのは間違いない ◦ 解凍後のストレージ制限なので、圧縮方式の変更では回避できない • Perl::Stripを使って圧縮
  9. PSGIアプリのライフサイクル管理はどうする? • 変換用のプロセスのライフサイクル管理はどうする? ◦ 適切なタイミングで起動や終了するのは意外と面倒 ◦ ビルドスクリプトの開始と同時に起動? ▪ ビルドに失敗したとき正しく終了できる? •

    AWS Lambdaの出番! ◦ サーバーの起動・終了のタイミングは AWSにおまかせ ◦ プロセスを再利用をしてくれるので、変換処理も高速 ◦ 並列にリクエストを投げれば、勝手にスケーリング ▪ ローカルのPC以上のCPUコアを使える
  10. AWS Lambdaのまとめ • AWS Lambda上でPerlを実行するためのカスタムランタイムを提供中 ◦ 古き良きCGIスクリプトがよみがえります ◦ AWSとの連携も簡単 •

    Docker上でPerl本体をビルド • 最大の難所は「Pawsがとにかくでかい」こと ◦ Perl::Stripによる圧縮 ◦ 圧縮のための計算リソースに AWS Lambdaを活用
  11. GitHub Actionsサイコー! • 使い始めるのが簡単 ◦ 設定ファイルをコミットするだけで使い始められる ◦ Minilla v3.1.17(2022-05-01リリース)からは minil

    new のデフォルト • ワークフローの起動トリガーが豊富 ◦ 新規コミットプッシュ、 Pull Request作成、Issueへのコメント、定期実行、手動実行、 etc. ◦ GitHub上で起こったことなら、なんでもトリガーにできる • 代表的な3つのOS(Linux, macOS, Windows)でテストできる
  12. どうやってビルドしているのか • ビルド環境: GitHub Actions ◦ GCCなど、Perlのビルドに必要なもの自体は、 GitHub Actionsの環境にインストール済み ◦

    実際に動作させる環境と近いほうがうれしい ◦ 計算リソースの問題 • ビルド済みのバイナリはGitHub Releases ◦ 料金の問題。無料で使えるのはでかい • ビルドスクリプトは自作
  13. どうやってビルドしているのか • ビルド環境: GitHub Actions ◦ GCCなど、Perlのビルドに必要なもの自体は、 GitHub Actionsの環境にインストール済み ◦

    実際に動作させる環境と近いほうがうれしい ◦ 計算リソースの問題 • ビルド済みのバイナリはGitHub Releases ◦ 料金の問題。無料で使えるのはでかい • ビルドスクリプトは自作
  14. Perl 5.6以降の全68バージョンをビルド • Perl5.6以降の全68バージョンをGitHub Actions上でビルド ◦ 依存ライブラリの更新等があるので、ときどきリビルドが必要 • 合計408種類のバイナリをビルド ◦

    Linux, macOS, Windowsの3プラットフォーム ◦ single-threaded, multi-threadedの2つのビルドオプション ◦ ここまでムチャしても問題なく動く ▪ GA直後は途中でビルドが止まったり不安定だったけど、ここ 1年くらいは改善
  15. Perl 5.6以降の全68バージョンをビルド • GitHub Proを契約すると20並列が60並列に! ◦ Linux 30分, macOS 6時間半,

    Windows 1時間半 ◦ ProではmacOSは5並列のまま・・・ ▪ macOSがボトルネックになって、トータルの待ち時間は変わらない • 408通りもビルドしているとDevel::PatchPerlのバグを見つける • Devel::Patch ◦ https://metacpan.org/pod/Devel::PatchPerl ◦ 古いPerlを最近のCコンパイラで動かすためのパッチ集
  16. ビルドの難所: Windows • 古いPerlも同じ方法でビルドするとハマる ◦ Perl 5.22以下はWindows用のGNUMakefileが存在しない ▪ nmake用のMakefileを参考に、GNU Make向けに書き直し

    ◦ Make::Makerがgmakeを知らない ◦ ¥パスセパレーターに対応してない ◦ MinGW-w64を知らない • 64ビットCPUをうまく認識しない ◦ ソースコード自体は64ビットCPUに対応している ▪ LinuxやmacOSではうまく動く ▪ 個人的には当時(2000年〜2002年) 32ビットCPUが主流だった記憶しかないので、ちょっと 驚き(個人の感想です)
  17. ビルドの難所: Perl 5.6, 5.8 • ソースコードの構造が大きく変わる ◦ Perl 5.10 と違ったファイル配置になって、今までのノウハウが活かせなくなる

    ◦ なんならMaintenanceバージョンが変わるだけで大きく変わる • 世の中の多くのモジュールの対応はPerl 5.8まで ◦ なぜPerl 5.8 以降対応のモジュールが多いのか・・・? ▪ Perl 5.8 はUnicode対応がまともになったバージョン(と聞いた覚えがある) ▪ たぶん僕より詳しい人がいると思うのであとで教えてください ◦ メタデータ上はPerl 5.6対応, Perl 5.8対応となっていても動かないモジュールも ◦ 頑張ってパッチを当てる
  18. GitHub Actionsまとめ • GitHub上で簡単にテストを実行できます • ビルド済みのPerlを提供してます • GitHub Actions上で408通りのPerlをビルド •

    最大の難所は「Windows」「Perl 5.8, 5.6」 ◦ ひたすらパッチを当てる ◦ Perl 5.8, 5.6 あたりの情報待ってます
  19. まとめ GitHub Actions • GitHub上で簡単にテストを実行でき ます • ビルド済みのPerlを提供してます • GitHub

    Actions上で408通りのPerlを ビルド • 最大の難所は「Windows」「Perl 5.8, 5.6」 ◦ ひたすらパッチを当てる ◦ Perl 5.8, 5.6 あたりの情報待ってます AWS Lambda • AWS Lambda上でPerlを実行するため のカスタムランタイムを提供中 ◦ 古き良きCGIスクリプトがよみがえります ◦ AWSとの連携も簡単 • Docker上でPerl本体をビルド • 最大の難所は「Pawsがとにかくでかい」こ と ◦ Perl::Stripによる圧縮 ◦ 圧縮のための計算リソースにAWS Lambda を活用