Slide 1

Slide 1 text

趣味でPerlの ビルドをしている話 AWS::Lambda, actions-setup-perl

Slide 2

Slide 2 text

自己紹介 ● 𝕏, GitHub: @shogo82148 ● 所属: フラー株式会社 ● ブログ: shogo82148.github.io ● 趣味: Perlのビルド

Slide 3

Slide 3 text

アジェンダ ● 宣伝 ● 趣味でPerlのビルドをしている話 ○ なぜPerlをビルドするのか ○ AWS::Lambda ■ SYNOPSIS ■ どうやってビルドしているのか ■ ビルドの難所 ○ actions-setup-perl ■ SYNOPSIS ■ どうやってビルドしているのか ■ ビルドの難所

Slide 4

Slide 4 text

<<”宣伝”;

Slide 5

Slide 5 text

フラー株式会社 ● スマートフォンアプリの制作 ● サーバーサイドの使用技術 ○ 使用言語: Goがメイン (残念ながらPerlは・・・) ○ クラウドプラットフォーム : AWS ○ データーベース: MySQL 宣伝

Slide 6

Slide 6 text

宣伝

Slide 7

Slide 7 text

宣伝 詳しくは「フラー採用サイト」まで https://recruit.fuller-inc.com/

Slide 8

Slide 8 text

趣味でPerlの ビルドをしている話

Slide 9

Slide 9 text

自己紹介 ● 𝕏, GitHub: @shogo82148 ● 所属: フラー株式会社 ● 趣味: Perlのビルド

Slide 10

Slide 10 text

Perlのビルド ● 主なビルド環境はAWS LambdaとGitHub Actions ● Perlのビルドは意外と簡単 ○ だいたいどんな環境でもビルドできる ○ 先人たちの努力のおかげ ● みんなもPerlをビルドして遊ぼう!

Slide 11

Slide 11 text

なぜ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言語の環境は用意されている

Slide 12

Slide 12 text

AWS Lambda

Slide 13

Slide 13 text

AWS Lambda ● AWSの代表的なサーバーレスな計算サービス ● 「サーバーはあります!」 ○ ユーザーがサーバーの運用保守について気にする必要はない ■ サーバーの起動 ■ サーバーの監視 ■ OS・ミドルウェアのアップデート ○ サーバー自体は存在して、その上で動く コードや権限の設定 はしないといけない ● 2023年8月時点での対応言語 ○ Node.js, Python, Java, .NET, Go, Ruby ○ Where is Perl…?

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

単純なエコー関数を登録

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

AWS::Lambdaでできること ● Webアプリケーション ○ AWS::Lambda::PSGI を使ってPSGIアプリケーションを動かせる ● AWS APIを使った自動化 ○ S3へのファイルアップロード、 DynamoDBの読み書き etc.

Slide 25

Slide 25 text

AWS::Lambdaでできること 杜甫々さんのWwwCounterが(ほぼ)そ のまま動きます https://shogo82148.github.io/blog/201 8/12/16/run-cgi-in-aws-lambda/ https://shogo82148.github.io/blog/202 1/06/13/aws-lambada-efs-and-perl/

Slide 26

Slide 26 text

AWS::Lambdaでできること minibbs.cgiを動かしたひともいます https://d.nekoruri.jp/entry/2020/06/17/ serverless-minibbs

Slide 27

Slide 27 text

詳細は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

Slide 28

Slide 28 text

本題 どうやってビルドしているのか

Slide 29

Slide 29 text

どうやってビルドしているのか ● ビルド環境: 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の裏側で使われているやつ

Slide 30

Slide 30 text

ビルドの難所: 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月にリリース)は未だインデックスされていない・・・

Slide 31

Slide 31 text

Pawsの圧縮 ● tar.gzを解凍するだけで約120MB ○ AWS Lambdaのストレージ制限は 250MBでちょっと厳しい ■ ※ Zipアップロードの場合。今は Dockerイメージを使って10GBまでいける ■ とはいえ軽いほうがうれしいのは間違いない ○ 解凍後のストレージ制限なので、圧縮方式の変更では回避できない ● Perl::Stripを使って圧縮

Slide 32

Slide 32 text

Perl::Strip ● 空白・コメント・POD等を取り除くモジュール ○ HTMLやJavaScriptの文脈だと「minify」と呼ばれる ● perlstripコマンドが付属して、簡単に利用できる

Slide 33

Slide 33 text

Before: Paws::EC2::RunInstances ● 25KiB

Slide 34

Slide 34 text

After: Paws::EC2::RunInstances ● 3.4KiB ○ コメントやPODが消えてスリムに!

Slide 35

Slide 35 text

perlstripコマンドの軽量化 ● perlstripコマンドの実行は重たい ○ (おそらく)構文解析器の初期化に時間がかかる ○ 3万ファイル近くあると、圧縮がなかなか終わらない ● 変換用のプロセスを建てよう→Perl::StripのPSGIアプリを開発 ○ curlで簡単にperlstripできる ■ curl -sSf --upload-file Hoge.pm http://example.com ○ 構文解析器の初期化は起動時の 1回だけ、変換処理自体は軽量

Slide 36

Slide 36 text

PSGIアプリのライフサイクル管理はどうする? ● 変換用のプロセスのライフサイクル管理はどうする? ○ 適切なタイミングで起動や終了するのは意外と面倒 ○ ビルドスクリプトの開始と同時に起動? ■ ビルドに失敗したとき正しく終了できる?

Slide 37

Slide 37 text

PSGIアプリのライフサイクル管理はどうする? ● 変換用のプロセスのライフサイクル管理はどうする? ○ 適切なタイミングで起動や終了するのは意外と面倒 ○ ビルドスクリプトの開始と同時に起動? ■ ビルドに失敗したとき正しく終了できる? ● AWS Lambdaの出番! ○ サーバーの起動・終了のタイミングは AWSにおまかせ ○ プロセスを再利用をしてくれるので、変換処理も高速 ○ 並列にリクエストを投げれば、勝手にスケーリング ■ ローカルのPC以上のCPUコアを使える

Slide 38

Slide 38 text

AWS Lambdaのまとめ ● AWS Lambda上でPerlを実行するためのカスタムランタイムを提供中 ○ 古き良きCGIスクリプトがよみがえります ○ AWSとの連携も簡単 ● Docker上でPerl本体をビルド ● 最大の難所は「Pawsがとにかくでかい」こと ○ Perl::Stripによる圧縮 ○ 圧縮のための計算リソースに AWS Lambdaを活用

Slide 39

Slide 39 text

GitHub Actions

Slide 40

Slide 40 text

GitHub Actions ● GitHubが提供するCI/CDサービス ○ 2019年に正式公開 ● 使い始めるのが簡単 ○ 設定ファイルをコミットするだけで使い始められる ○ GitHubのUIに組み込まれている

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

GitHub Actionsサイコー! ● 使い始めるのが簡単 ○ 設定ファイルをコミットするだけで使い始められる ○ Minilla v3.1.17(2022-05-01リリース)からは minil new のデフォルト ● ワークフローの起動トリガーが豊富 ○ 新規コミットプッシュ、 Pull Request作成、Issueへのコメント、定期実行、手動実行、 etc. ○ GitHub上で起こったことなら、なんでもトリガーにできる ● 代表的な3つのOS(Linux, macOS, Windows)でテストできる

Slide 49

Slide 49 text

GitHub Actionsのイケてないところ ● Perlの標準サポートがない! ● → 仕方がない、ビルドしよう

Slide 50

Slide 50 text

本題 どうやってビルドしているのか

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

Perl 5.6以降の全68バージョンをビルド ● Perl5.6以降の全68バージョンをGitHub Actions上でビルド ○ 依存ライブラリの更新等があるので、ときどきリビルドが必要 ● 合計408種類のバイナリをビルド ○ Linux, macOS, Windowsの3プラットフォーム ○ single-threaded, multi-threadedの2つのビルドオプション ○ ここまでムチャしても問題なく動く ■ GA直後は途中でビルドが止まったり不安定だったけど、ここ 1年くらいは改善

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

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コンパイラで動かすためのパッチ集

Slide 58

Slide 58 text

ビルドの難所 ● Windows ● Perl 5.6, 5.8

Slide 59

Slide 59 text

ビルドの難所: Windows ● 最新のPerlをビルドするだけなら簡単 ○ GitHub ActionsのWindows環境にはStrawberry Perlがインストールされている ○ Strawberry PerlにはGCCもGNU Makeもついている ○ 普通にmakeすればOK

Slide 60

Slide 60 text

ビルドの難所: 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が主流だった記憶しかないので、ちょっと 驚き(個人の感想です)

Slide 61

Slide 61 text

ビルドの難所: 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対応となっていても動かないモジュールも ○ 頑張ってパッチを当てる

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

まとめ 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 を活用