Posts
gRPC - Custom error over RpcException
在做系統時,免不了可能會要定義自己的狀態碼供判斷系統的問題。在 gRPC 下,我們可能會為 Message 增加 StatusCode 這樣的欄位做傳遞與判讀。
這樣的做法在一般的呼叫方式並無問題,但是在用 Streaming 傳達多個小 Message 時,使用上就會有點奇怪。這邊筆者試著透過 gRPC 本身的例外機制嘗試解決這樣的問題。
先造一個自定義的例外,支援帶入 StatusCode,這邊筆者先簡單的用字串型態來做 StatusCode 的定義,實際運用時改用列舉會比較好。
Server 端透過自定義的例外拋出例外。
using System.Threading.Tasks; using Greet; using Grpc.Core; namespace GrpcService_CSharp1 { public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { throw new MyException("ERROR2020"); } } } Server 端掛載攔截器處理例外,將例外轉為 RpcException 拋出,gRPC 支援的狀態碼較少所以筆者拿 StatusCode.Internal 狀態碼來用,Detail 這邊就帶我們自定義的狀態碼,若有額外資訊要帶入可放在 MetaData。
using System; using System.Threading.Tasks; using Grpc.Core; using Grpc.Core.Interceptors; namespace GrpcService_CSharp1 { public class ExceptionInterceptor: Interceptor { public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation) { try { return await base.
read morePosts
Vault - Policies
要設定 Vault 的 Policy,先建立 Policy 設定檔。
vim $policy_file 在設定檔內用 HCL (HashiCorp Configuration Language) 做 Policy 的設定。
# Normal servers have version 1 of KV mounted by default, so will need these # paths: path "secret/*" { capabilities = ["create"] } path "secret/foo" { capabilities = ["read"] } # Dev servers have version 2 of KV mounted by default, so will need these # paths: path "secret/data/*" { capabilities = ["create"] } path "secret/data/foo" { capabilities = ["read"] } 像是這邊設定的是可以在 secret/ 下做寫入的動作,只有 secret/foo 是唯讀;secret/data/ 下可寫入,但 secret/data/foo 唯讀。
read morePosts
Vault - GitHub auth method
要使用 GitHub 做 Vault 的認證,可用 vault auth enable 帶入 github 啟動 GitHub auth method。
vault auth enable [-path=$path] github 查驗一下是否正常啟用。
vault auth list
接著設定 GitHub 的 Organization。
vault write auth/github/config organization=$organization 設定 GitHub Organization 的 Team,與要使用的 Policy。
vault write auth/github/map/teams/$team value=$policy 因為用 GitHub 認證,這邊要先準備好 GitHub personal access token。
GitHub personal access token 這邊建立時要給予 read:org 權限。
建立完調用 vault login,帶入 -method 參數指定用 GitHub 登入,並帶入剛建立的 GitHub personal access token 即可。
vault login -method=github 若後續不再使用,可登回 root。
read morePosts
Vault - Install with HomeBrew
如要在 MAC 上使用 Vault,可透過 HomeBrew 進行 Vault 的安裝。
brew install vault 安裝後調用 Vault 命令並帶入 –version 參數,若安裝正常應可查驗到安裝的 Vault 版本。
vault --version
read morePosts
Vault - Token authentication
Vault 支援 Token 認證方式,在 Vault server 啟動後會顯示 Root token,可直接取用。
也可以透過 vault token create 命令建立新的 token 使用。
vault token create Token 的相關資訊可用 vault token lookup 帶入 Token 查驗。
vault token lookup $token Token 取得後可用 vault login 帶入 Token 登入。
vault login $token 若要註銷 Token,可用 vault token revoke 帶入 Token。
vault token revoke $token Token 註銷後不得使用,無法查驗 Token 資訊。
也無法用來登入。
Link Authentication
read morePosts
Vault - Secrets engines
Vault 的 Secure engine 可以是 AWS、Database、Github… 等。
資料會進哪個 Secret engine 是看 Path,像是預設開啟 kv 這個 Secret engine 在 secret 這個 Path,我們可以直接用 secret/$name 這樣的方式指定存放的位置。
若指定的位置無對應的 Secret engine,因為無 Secret engine 可以服務,因此會報錯。
vault write foo/bar a=b Secret engine 可使用 vault secrets enable 加帶 Secret engine name自行啟用,如果啟用的 Path 跟 Secret engine name 不同,可加帶 -path 參數指定。
vault secrets enable [-path=$path] $secret-engine 像是這邊筆者起了一個 kv 的 Secret engine 在 kv 這個 Path。
vault secrets enable -path=kv kv 查驗 Secret engine 列表,可看到確實已經啟用。
read morePosts
Vault - Your first secure
Vault server 起動後,實際做些資料的操作看看。
透過 vault kv put 可將資料存放到指定的 kv store。
vault kv put secret/hello foo=world 支援存放多筆資料。
vault kv put secret/hello foo=world excited=yes 放入 kv store 的資料可用 vault kv get 查看。
vault kv get secret/hello 若要查詢特定值可加帶 -field 參數指定。
vault kv get -field=excited secret/hello 也可加帶 -format 參數指定輸出格式做些進階處理。
vault kv get -format=json secret/hello | jq -r .data.data.excited 資料不要時可透過 vault kv delete 自 kv store 移除。
vault kv delete secret/hello vault kv get secret/hello Link Your First Secret
read morePosts
Vault - Starting the server
Vault 安裝後可調用 Vault server 命令起服務試試,這邊可加帶 -dev 參數起 Dev server。
vault server -dev 服務啟用後注意到特別變色的區塊,裡面有 Vault server 的位置與 Root token。
可複製新開 Terminal 後貼上,設定 VAULT_ADDR。
export VAULT_ADDR='http://127.0.0.1:8200' 以及 VAULT_DEV_ROOT_TOKEN_ID。
export VAULT_DEV_ROOT_TOKEN_ID="$token_id" 設定完後調用 vault status 命令測試看看,沒意外的話應該可以正常連到 Vault server,並將 Vault server 的資訊顯示出來。
vault status Link Starting the Server
read morePosts
Vault - Install Vault
要安裝 Vault 可到這邊下載對應系統的檔案。
像是筆者用 Android 手機在用 Termux 玩,所以是下載 ARM 版本的檔案。
wget https://releases.hashicorp.com/vault/1.3.0/vault_1.3.0_linux_arm64.zip 下載下來後解壓縮。
unzip vault_1.3.0_linux_arm64.zip 就可以直接使用解壓縮出來的二進制檔案操作。
vault Link Installing Vault
read morePosts
Redis - Redis cluster with create-cluster script
Redis 安裝完後 utils/create-cluster 目錄下有提供現成的腳本可以用來起 Redis cluster 做些測試。
使用方式可參閱目錄下的 README。
或是直接調用命令參考命令的說明。
./create-cluster 簡單來說,可以用 start 將要組成 Redis cluster 的節點都先運行起來。
./create-cluster start 再用 create 將運行起來的 Redis 連結組成 Cluster。
./create-cluster create 若有需要,可用 watch 監看 Redis 的輸出。
./create-cluster watch 如 Redis log 過多,可用 clean-logs 清除 Redis log。
./create-cluster clean-logs 不使用時可用 stop 停止 Redis 服務。
./create-cluster stop 再用 clean 將 Redis 的 資料、設定、Log 都清除。
./create-cluster clean
read more