2022/05/17に続いて、 GCPのデモとして用意していたvsReversiをアップデートしました。
アップデート内容は以下のとおりです。
- マテリアルデザイン対応
- モバイル対応
マテリアルデザイン対応
Angularのマテリアルデザインに対応しました。上記のキャプチャにはマテリアルデザインの個所はありませんが、全体的に見た目がちょっとAndroidアプリぽく変化しています。
2022/05/17に続いて、 GCPのデモとして用意していたvsReversiをアップデートしました。
アップデート内容は以下のとおりです。
Angularのマテリアルデザインに対応しました。上記のキャプチャにはマテリアルデザインの個所はありませんが、全体的に見た目がちょっとAndroidアプリぽく変化しています。
GCPでログを扱うなら、Cloud Loggingは避けて通れない道です。適当にログを吐くコードでを埋め込んでおいて、ブラウザを立ち上げてGCPコンソールのログビューアで表示。しかも30日前くらいまで遡って表示可能。
Cloud Loggingのライブラリの使い方に慣れれば、出力するログのフォーマットもかなり自由に弄べます。ほとんどのGCPサービス・言語で利用できますし、使い方も同じです。
こんなに便利なツールがあるなら、避ける理由などありません。それくらいに便利です。
しかしCloud Loggingには、ログがまともに出ない問題があります。具体的には、
メインスレッドから出力すると問題ありません。しかしFirestoreのトランザクションなど、仕様書に明記されていないもののこっそりワーカスレッドを生成して処理しているケースでも上記の問題が発生します。時にはCloud BuildのビルドログがGAEアプリの実行ログに混じることも。
「Java8 ランタイム環境」の「スレッド」の注釈に説明されています。
注: Java スレッド作成 API を使用する場合、Cloud Trace はリクエスト ID を正しく表示しません。Google は現在この問題の解決に取り組んでいます。
なんと、まだ対応中でした。何年も前から発生しているので早く直してほしいですね。
GCPで動作するアプリケーションを作っていると、アプリケーションの管理者=プロジェクトの管理者 であることが多いと思います。開発フェーズか運用フェーズかでそこに割り当てられている人は変わったとしても、この関係は変わりないのが理想と思います。
であれば、プログラムでプロジェクト管理者のアカウントを判断できれば、「アプリケーション管理者のアカウント」をアプリケーションで保持する必要ながなくなって便利です。
プロジェクト管理者のアカウントをコードで取得する手段を探してみたところ、Goで発見しましたので紹介します。
サービスの名称と機能からIdentity and Access Managementあたりかと あたりをつけて探し始めて、たどり着いたのはResource Managerでした。プロジェクト管理者のアカウントを取得するには、以下の様に複数のAPIを経由します。
import (
"context"
"os"
"strings"
"google.golang.org/api/cloudresourcemanager/v1"
)
...
// context.Contextを取得
context := context.Background()
// Cloud Resource Managerサービスを取得
crmservice, err := cloudresourcemanager.NewService(context) // (1)Resource Managerサービスを取得
if err != nil {
// エラー処理
return
}
// プロジェクトのIAMポリシーを取得
projid := os.Getenv("GOOGLE_CLOUD_PROJECT") // (2)プロジェクトIDを取得
request := new(cloudresourcemanager.GetIamPolicyRequest)
iampolicy, err := crmservice.Projects.GetIamPolicy(projid, request).Do() // (3)IAMポリシーを取得
if err != nil {
// エラー処理
return
}
// このプロジェクトの管理者に含まれているか確認
adminuser := false
check_end:
for _, binding := range iampolicy.Bindings { // (4)各ポリシー
for _, member := range binding.Members { // (5)各メンバ
if strings.Contains(member, email) { // (6)Eメールアドレスで判断
adminuser = true
break check_end
}
}
}
// adminuser == tureならプロジェクト管理者
今回使ったライブラリのパッケージは以下。
一方でGoogle公式サイトには以下も載っています。
cloud.google.com/go/resourcemanager/apiv2
後者のライブラリは実装されている機能が少なすぎて、今回のように実装できません。というかAPI仕様を見る限り、ほとんど使い物にならないのではないかと思います。
GoのResource Managerに限らず、どのライブラリを使えばいいのか、こんなの見つけたけど使って大丈夫なのかと、迷うことがよくありますが、今回は以上の実装で目的を果たせました。また前者のライブラリは機能も十分そろっていそうなので、その他の用途にも使えると思います。