Cloud Runでテストサービスを構成したメモ

Cloud RunにSeleniumベースのテストサービスを構築した(先日のDocker作成)

で、本番環境で動かす時にこのサービスは非公開だけど非公開のRunって初めて構成したのでセキュリティをどうするのかと検討。

このサービスの呼び出し元はアプリビルド時の動作確認と、定期ヘルスチェックの2つ。 Cloud Build&Schedulerってことで、Google Cloud内部なのでIAMとかで簡単に構成できる気がする。

Cloud Runの設定でセキュリティタブに認証項目がある。

認証が必要
Cloud IAM を使用して承認済みユーザーを管理します。

うん、この設定ならIAMで認証できて中に認証とか組む必要ないね。

では、これはどう動くのか?
一言で言ってAuthorizationヘッダーで適切な権限のあるトークンが与えられることを確認している。

Schedulerの場合は簡単、スケジュールの設定で「実行内容を構成する」にあるAuthヘッダーの項目で「OIDCトークンを追加」を選択して「Cloud Run起動元」の権限があるSAを選択すれば勝手にやってくれる。

 Buildの場合は、gcloudコンテナのbashエントリーポイントで gcloud auth print-identity-token を実行すればトークンが取得できる。
 複数のステップで共有する場合はWorkspaceを使って保存して使い回すと早い(Googleのコンテナで/workspace/配下はビルド実行中に引き継げる一時ストレージなので、トークン取得ステップで
gcloud auth print-identity-token > /workspace/token.txt
とかすれば、以降のステップでは /workspace/token.txt を取得すれば良い)
 一つのステップの中だけで完結する場合は変数に入れて、
token=$(gcloud auth print-identity-token)&&curl -H “Authorization: Bearer $token”
みたいな感じでAuthorizationヘッダを付加して叩いてやれば良い。 Googleのドキュメントにあるサンプルは大文字TOKENだけど、Buildでは$大文字はBuild自体が置換するのでそんなの無いよエラーを吐くので、小文字でなければならないところは注意。
 BuildのSAに「Cloud Run起動元」の権限を付与しておく(今回はRunをデプロイするためにRun管理者のロールが付いていたので追加付与は不要だったが、Run以外をデプロイするだけのSAとかの場合は必要)

 オンプレとかだと鍵認証とかを自分で組み込んだりする必要が出るけど、クラウドの場合はこういった権限管理の仕組みがあるから手軽に実現できて良いね。

 開発段階でテストを実行したい場合・・・通常ならWebに対するテストは開発リポジトリにpushしたらトリガで開発にデプロイして、テストを起動して結果確認となるので、開発用Buildトリガを仕込んで、条件を開発ブランチにpushされた時にして、cloudbuild.yamlで普通に開発環境deployまで実行して、その後にテストを叩くステップを入れてやる。
 deployまでだとビルドの結果はデプロイが成功したかっていう状態だけど、テストステップを追加すればdeployした結果テストが通ったかっていうアプリケーションレイヤーでの成功を一目で確認できる。

(2)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

GitHub Copilotの活用を進めてみた

週末、相変わらずAIちゃんと戯れてみて実際に使える物を作るのはどんな感じかなと実施。

出来上がった物はこんな感じ

 

https://github.com/studioes/copilot-WoL-Flask

所要時間は環境設定込みで2~3時間と言う所でしょうか。

検索して情報・方法を得てコードを書くと言う部分が殆どCopilot任せになるので知らない技術を用いる場合には非常に有能に動いてくれます。 ○○について調べておいてって依頼するより遙かに早く結果が帰ってきます。

今回は自宅マシンをWoLするWebアプリケーションが欲しかったのでそれをCopilotとペアで開発しました。

最初のプロンプトは主機能であるWoL部分です。

>MACアドレスにマジックパケットを送信してWakeUpする処理

はい、マジックパケットの詳細は知りませんでしたが、ちょっと知っている情報からプロンプトを組んだら作ってくれました。 わずか数秒で。 普通ならGoogleでWoL magickpacket Pythonとか入れて検索して探して読んで・・・となって数百倍の時間かかるところが数秒です。 こういった所は非常に有能です。

そして追加プロンプト
>FlaskでWebから使える様に
Flaskの基本形が出来て/にGETならMAC入れるフォームが出来て、POSTなら先の物を呼び出す処理が出来上がりました。

ここからは機能を足したり、調整したりですが、ザックリ機能をつける場合はCopilotにお願いすれば入力時間より早く上がってきます。

>SQLAlchemyとsqliteでマシン名とMACアドレスを保存出来るようにして

>マシン名からMACアドレスを取得して保存出来るようにして

>Machineの編集、削除機能を作って

>Machineの一覧を作って、WakeOn、Edit、Deleteへのリンクを付けて

 等の様にしてFlaskルート+処理実体が次々と出来上がりました。

 他方で調整は解釈違いが起きるので人力の方が早いかなという印象。 これは普通にエンジニアがやっていても起きるヤツですね、要件者のイメージがうまく共有出来ないって言うヤツ。 なので、基本部分をCopilotで生成し人間が調整、調整したのをCopilotに学んで貰った上で、以後の調整を補完など支援して貰うって言うのが現状のベストかなと感じました。

ちなみに、README.mdについてもChatで「このプログラムのREADME.mdを作って」とお願いすると、それっぽく概要が出来上がってきて、いまいちだけど必要事項も入っていて、何も無いよりは良い、ちょっと待つだけでこの程度出来るなら十分。 という感じでした。

 現状はVSCodeでやっていますが、PyCharmにもプラグインがある様なのであちらで整備してやりたい感じもします。 個人的にPyCharmの方が最初からPython用にカスタムされててデフォルトの機能も動きが良いのでVSCodeでも出来るけどPyCharmの方がなお良いと言う感覚があります。 また、JetBrains自身もAIアシストがあるようなので、Copilotと比較であちらも試すのもアリかなと(しかし、評価期間がCopilot30日に対して、JetBrainsは7日しか無い)

(3)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Cloud RunでChrome/Selenium/FastAPIな環境を作る

 新しい勤務先がGoogle Cloudメインなのでそれになれる為に各種リソースをおさわりしています。

 今回は無料枠があるけどあまり利用していなかったCloud Runを活用してサイト監視のシステムを作ってみました。

 Cloud Runは、コンテナを走らせてくれる環境で、普通にDockerファイルを用意してやれば動きます。 今回は自分のサービスのハイレベル監視をこれで動かそうと言う事で、Seleniumによるアクセスを行うコンテナを作りました。

 Dockerfileはこんな感じになりました。
 ベースはUbuntu24,04を使い、アプリは/appに配置することにしました。
 Selenium+Chromeを中で動かすためにaptで結構色々ライブラリやら日本語フォントやら入れています。 Ubuntuミニマムだと数十MBのイメージがで来ますが、これだと1.5GB位(Artifacts Registoryの仮想サイズで600MB+なので無料枠を微妙にはみ出します)
 開発環境はDockerとか諸々のツールが入ってるディレクトリの下にsrcディレクトリを切った状態で作業しているので、コンテナを作る時にはsrc以下をまるっとappにコピーしてます。 requirements.txtだけはsrcより上位にあるので追加コピーしてpipで入れて、コンテナサイズ節約のためにaptのパージとか適当にかけてます。
 CMDで出すところが非常に長いです。 これは、Chrome使う時にdbusうごいてねーよって怒られたので、dbusを立ち上げた後にuvicornをスタートさせてるためです。 sleep 1は動かしてるインスタンスが小さいので安定のために待機させてます。

個人なら普通にローカルで作ってアップしてでも良いですが、やっぱり仕事の勉強がてらなので、ここはCloud Buildで継続デプロイも構成。 GitHubのマスターブランチにプッシュしたら走るトリガを作って、cloudbuild.yamlを準備。

最初のDocker PULLは2回目以降のビルドを高速化するために既存のコンテナを取ってきてキャッシュ利用するためのおまじないです。 このビルドだと初期は5分くらいかかりますが、これやると半分くらいで収まります。

で、DockerをビルドしてArtifacts Registoryにpush。
 ターゲット系がus-west1で纏まってるのは無料枠が大抵このリージョンになるので合わせている都合です。 仕事では普通にasia-northeast1。
 pushしたコンテナを使ってRunをデプロイしてます。
 自分用ケチケチなので1Giメモリ1CPUで暴走課金防止のためにタイムアウトも3mと短め、Max-instace1でMin0なので結構コールドスタートになります。 今回はFastAPI側に認証機構を持たせるのでallow-unauthenticatedを指定してます。 内部から呼び出すだけの場合はこれを外して適当なIAM設定の所からコールするのが良いです。
 で、サービスアカウント指定は、Runを呼び出すんじゃ無くRunが使うサービスアカウントなので、例えばCloud Storageに保存するならストレージ書き込みロール、Cloud Loggingに書き込むなら同様にログ書き込みロールを付けるだけで、Run実行などは不要です。 Google Cloudのサービス特に呼ばないならそれこそ何も権限が無い状態でも動きます、デフォのComputeは権限が凄く付いていて危なっかしいので、必ず権限を削った物を用意します。
 デプロイ後に追加のgcloud sdk使った処理がありますが、こちらはArtifacts Registoryからlatest以外を削除してしまう処理です。 リポジトリ自体にもライフサイクル削除機能がありますが、最低1日1回走るって言う機能なので、テストで頻繁にpushしてると削除されるまでの時間でも結構なサイズが溜まってしまうのでデプロイの最後で消しています。 通常はRegistory側の設定だけでこれは不要ですね。

 これで、src配下に置いたソース入りDockerがCloud Run上で動いてくれるので、あとはSchedulerなりなんなりで叩いて走らせます。

アプリ側は基本形はこんな感じでやってます

複数のAPI機能で唯一のchromedriverを使い回すためにグローバルにdriverを作り、コンテキストマネージャのライフスパンを使ってアプリ起動時にドライバを生成し、終了時に落とすためにwithでドライバ呼んで中はyieldのみという感じに。 ChromeDriverFactory.create_driverは各種オプション指定してChrome webdriverを作ってwebdriverを返してます。

後は各種APIを実装、グローバルに置いてるdriverを使い回していく感じ。

この構成でコールドスタートだと10秒くらいかかりますが、まぁ許容かなと。 Cloud Runは立ち上げからレスポンスを返すまでの課金ですが、インスタンス自体は即座に止まらずにアイドルで一定時間残るので、連続でリクエストを投げていく分にはそれほど問題になりません。 表示テスト、ログインテスト、編集テスト、編集結果反映確認テスト、削除テストと順番に投げていくと初回がコールドスタートで15秒とかかかるけど、その後のは2~3秒で進んでいって、サイトがちゃんと動くねテストが一通り30秒とかで終わります。 Cloud Schedulerも3ジョブまで無料(Githubに一つ取られてるのでウチの空きは2個だったので、テスト一式を起動するジョブを1本設定)なので、ほぼ無料で毎時にサイト動作確認とか出来ます。 ちょっとDockerファイルサイズがはみ出してる都合でArtifacts Registoryの課金が月に数円程度の感じ。

リソースのヘルスステータスはモニタ出来ますが、データ壊れておかしくなってるとか言うケースでは検知出来ないので、Selenium等の実際のUI操作テストは有用なので、程よいコスト感で回せるCloud Run+Schedulerのシステムは良い感じですね。

(12)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

GitHub Copilotでラピッド開発

GitHub CopilotがGPT4oベースになって高速化&賢くなったというのでお試ししてみた。

PythonでFlaskアプリの基本形を開発してみる。

Visual Studio Codeだとプラグインを入れてコード補完やインライン・チャットベースでの支援が受けられて、シームレスに開発プロセスにAIを導入出来る。
今回はインラインのチャットで雛形を作ってみる(適当なpyファイル作って、エディタでCtrl+iするとコパイと簡単に話してすぐにコード反映出来る)

プロンプト

sqlalchemyのAccountモデルを作って、モデルは主キーid、文字列型usernameとpassword、日時型のcreatedとupdatedを持つ

createdはレコードが作成された時間を設定するようにして

すべてのカラムはnotnullにして

こうなった

お願いするたびimportが湧いたけど少し修正で行ける感じ

次はコントローラ側

プロンプト

Flaskでログイン画面を作って
sqlalchemyでmysqlに接続して、Accountモデルのusernameが変数usernameに、passwordが変数passwordに一致するか確認する処理を追加
AccountのpasswordはMD5処理されている

やっぱり多少修正すれば使えるね

プロンプト一行で10行以上のコードが出来上がって、直して欲しいところを追加で入れていけば基本形完成。 素人だと生成されたコードの意味がわからずエラー起こしたりするし、エラー処理とかは無いから程よくCopilotにお願いするか、手書きで追加するかは必要だけど、定型処理を毎度書くかどっかからコピペするとかよりは効率良い。

リファクタ機能があるから、そっちでお願いすると多少きれいにしてくれる。

モデルのコードをリファクタしてもらうと

重複importを綺麗にしてくれた

コントローラ側も綺麗にしてもらおう

結構になったね。
 DB接続を使うところでベタ書きだったDB接続情報がグローバルに持っていかれて全体で使い回せる構成、更に環境変数から取ろうとして、それでも無ければベタ値になってる、サーバレスとかで使いやすい形。 ベタ値は開発環境用とかで使ったり。 初心者コードがべスプラに近づいてる。
 更にMD5弱いからbcrypt使うようにしてくれて、セッションもクローズしてくれてる。
 けど、try中にreturnがあるからこのときはクローズしない? と思ったら、中でreturnしてもfinallyは実行されるっていう、今更の気付き、Copilot恐ろしい子! 今まで、DB処理部分だけtryでくくってDBに関する処理だけキャッチして、残りは次って書いてたよ・・・

ちなみに、テストコード作ってとかもしてくれる。
逆に既存コードを説明してってのもしてくれるので、引き継ぎとかされてない謎コードメンテのときとかに結構お役立ち。

対象にもよるけど最低でも2~3割早くなる、簡易ツールとかなら倍単位で早くなる感じ。 テストコードでパターンを書くとかいう手間が省けるので、テストするまでもないかなぁみたいなところも数秒でテストコード出来てクオリティアップできそう。

(7)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

NEC IXルータで新しいAndroid(IKEv2)からのリモートアクセスVPNを受ける(不完全→一応成功)

 新しいAndroid OSはVPNの方法としてL2TPなどが削除されてIKEv2/IPSecじゃないと繋がらない。
 しかし、自宅のNEC IXルータではIKEv2/IPSecでのリモートアクセスに関する情報が見当たらないので一旦諦めて、WiFi APとして使ってたTP-LinkルータにOpen VPNサーバ機能あったから、IXからOpenVPNトラフィックをTP-Linkに通して通信なんて言う事をしていたけど、やっぱりルータもスマホも標準機能で済ませたいので、自宅のNEC IX2235ルータで設定に挑戦した。

続きを読む

(244)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

Python – pywin32でOutlook整理

outlookのメールボックスがゴミだらけになってるけど標準の検索やフィルタ機能で削除するのは結構痒いところに手が届かなかったりするのでPython利用で削除してみた。

まず、outlookを制御する場合、Win32 COMを経由して制御することになり、Windows版Pythonインストール時に入れられるpywin32ライブラリでコレが出来る。

import win32com

pywin32にはWindowsの色々にアクセス出来るけど今回はCOMだけなのでコレで。

outlookにアクセスする基本形は

outlookがアプリケーションアクセス用で、ネットでさらったコードだとDispatchを使ってたけど、今回は処理をする時にイベント処理が必要なのでWithEventsを使ってる。 mapiはメールボックスとかの各種情報にアクセスするネームスペース。

この辺までは大体既存の情報検索とMSのドキュメントですんなり行ったんだけど、completeの所がちょいと手間取った。 AdvancedSearchしてすぐにsearchにアクセスしても、その先はoutlookなので実態じゃなくてoutlookのインスタンスで検索が終わってないと0件だったり、件数があっても処理してる間にどんどん増えていったりするので、検索が完了するまで待機する必要がある(AdvancedSearchは結果を返してるわけじゃなく、AdvancedSearchを開始してソコへの繋ぎを即座に返している)
 で、MSのVBA Learnとかを見るとAdvancedSearchが完了するとAdvancedSearchCompleteイベントが発生するよ、って言うのはあったけど、その時のハンドラをPythonからアクセスするのがイマイチ良くわからず、VBAサンプルだとApplication_AdvancedSearchCompleteとか書いてたけど、どうやってアクセスするんだろと。 で、色々なCOMアクセスのサンプルとかを漁っていった結果、多分こうじゃないかな?と色々な名称を書いていった結果・・・

コレが正解だった、global使ってるのは格好悪いけどハンドラインスタンスにアクセスする方法が良くわからずだったのでコレで妥協。 importの下でcomplete = Falseでcompleteを定義してグローバルアクセスしてる。

ネーミングルールがわかればまぁ後は簡単ですね、Onイベント名と言うメソッドを持ったハンドラー用クラスを作ってWithEventsの第二引数に入れてやればOKと言う簡単な答えだった。 でも、ネット探してもAdvancedSearchComplete使ってるコードがなかったんで案外手間取った、そんなわけでここにナレッジとして記載。

なお、大抵連続処理してるとOLEエラーとか色々な例外が出て途中で止まるので叩く部分は例外処理してリトライとか付けないと放置で大量削除とかは出来ない。

(66)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

avif2png ー AVIF形式画像をPNG形式に変換するアプリ Windows版

最近増えてきたAVIF形式を従来のPNGに変換するWindowsツールです。 インストール不要、完全フリー、広告無しです。

DL

最低限の機能だけ実装してあるので以下の通り確認して下さい。

ZIPファイルの中にavif2png.exeがあります、変換したいファイルをドラッグして実行すると自動で変換します。

対応するファイルはAVIFファイルを含むZipアーカイブと、直接のAVIFファイルで複数のファイルの一括処理に対応します。

変換後のファイル名は元のファイル名の最後に.pngが付いたPNG画像です。 ※既存のファイルは有無を言わさず上書きされます

機能要望、バグレポートなどはコメント欄からどうぞ。 興味のある広告を踏む支援や、Amazonギフトのカンパ歓迎します。 コメント欄は自動表示では無いのでギフトコードなど投げ込んで貰ってもOKです。

(741)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ