星期六, 2月 18, 2023

AWS Athena 使用者查詢次數小記

AWS Athena 使用者查詢次數小記


OS: openSUSE Leap 15.4


使用雲端服務, 當出帳的時候觀察帳單金額與服務用量也是很重要的事情

今天紀錄使用 aws cli 來快速查詢 Athena 使用者的查詢次數


場景: 因應 Athena 每月查詢費用可能有浮動, 所以用 aws cli 來快速統計使用者查詢次數, 來快速判斷是否跟查詢有關


說明: 當 Athena 的費用有變動的時候大多是查詢資料量造成費用的變動, 這個時候使用單位大概會有兩個疑問

  • 我的使用量與費用的對比

    • 這個可以藉由 Billing console 來進行查詢

  • 誰(使用者)進行查詢導致費用的變動



如果想要了解相關資訊, 可能會藉由下列兩個指令來進行了解

  • aws cloudtrail lookup-events

    •  query 是由哪個帳號所執行和該筆查詢的 query execution id

  • aws athena get-query-execution

    • 取得 DataScannedInBytes 的資訊


使用 aws cli 所得到的都是單一筆的結果, 如果要統計到個別使用的結果, 可能要透過撰寫程式或是 script 來進行彙總.


於是有下列 script 結合 aws cli  與 jq 來簡單統計指定區間內 Athena 使用者的查詢次數

  • 想法: 使用區間先列出使用者查詢次數, 如果符合查詢次數與費用的比例, 應該就不用進一步去統計 DataScannedInByte 的資訊


以下為初步的 script


# 使用 aws cli 指令查詢指定日期的 Athena 使用者查詢次數

# 情境: 當 Athena 費用有變動的時候, 快速用次數來判斷費用變動因素

# Edit by Max 2023/2/18


# AWS  提供參考

# 要有 jq 指令


echo ""

echo "This script will print athena query times - order username and date between"

echo "使用 aws cli 指令列出指定日期的 Athena 使用者查詢次數"

echo ""



# 設定使用帳戶

echo ""

echo "設定使用帳戶"

read -e -p "Please enter account name: " -i "default" account_name

echo ""


# 設定 Region

echo ""

echo "設定 Region"

read -e -p "Please enter region name: " -i "ap-northeast-1" region_name

echo ""


# 設定查詢起始日期

echo ""

echo "設定查詢起始日期"

read -e -p "Please enter query start date: " -i "2023-01-01" start_date

echo ""


# 設定查詢結束日期

echo ""

echo "設定查詢結束日期"

read -e -p "Please enter query end date: " -i "2023-01-31" end_date

echo ""


# 列出這段時間有查詢的使用者

echo ""

echo "建立查詢的使用者清單"

aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=StartQueryExecution --profile $account_name --region $region_name --start-time $start_date --end-time $end_date | grep Username | sort | uniq | cut -d '"' -f 4 > /tmp/athena_user

echo ""


# 列出

for i in $( cat /tmp/athena_user )

do

echo "使用者 $i 在這段時間的使用次數為:"

aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=StartQueryExecution --start-time $start_date --end-time $end_date  --profile $account_name --region $region_name | jq "[.[][] | select(.Username == \"$i\" )] | length"

echo ""

done



輸出結果參考


# sh  aws_athena_user_queryCount.sh


This script will print athena query times - order username and date between

使用 aws cli 指令列出指定日期的 Athena 使用者查詢次數


設定使用帳戶

Please enter account name: defaut



設定 Region

Please enter region name: ap-northeast-1



設定查詢起始日期

Please enter query start date: 2023-01-01



設定查詢結束日期

Please enter query end date: 2023-01-31



建立查詢的使用者清單


使用者 sakana 在這段時間的使用次數為:

1170



另外現行的 AWS 機制, 暫時好像沒有如果 Scan Data 大於多少資料量即發出告警, 希望之後能夠有相關功能 ( 許願 )


這樣下次要進行查詢就方便多了


~ enjoy it



Reference

星期四, 2月 16, 2023

Anthos clusters on Azure 小記

Anthos clusters on Azure 小記


OS: container with openSUSE Leap 15.4


Todo

  • 升級 3 大平台工具 container

  • 嘗試使用 terraform


今天來測試 Anthos cluster on Azure


首先參考官方文件


確認滿足相關準備工作


==== Google Cloud CLI ====


檢查 CLI 版本是否有高於 402


# gcloud  version


Google Cloud SDK 412.0.0

bq 2.0.83

bundled-python3-unix 3.9.12

core 2022.12.09

gcloud-crc32c 1.0.0

gke-gcloud-auth-plugin 0.4.0

gsutil 5.17

kubectl 1.23.14




安裝 kubectl

# gcloud  components  install  kubectl


驗證是否安裝 kubectl

# kubectl  version


確認有相關身份驗證

這邊可以使用以下指令確認有沒有身份認証

# gcloud  auth  list 


如果沒有的話, 請執行以下指令進行驗證

# gcloud  auth  login


啟用相關 API


啟用之前可以先到專案觀察相關 API

登入 GCP console

點選 選單 -- > APIs & Services 

觀察 Enabled APIs 的數量


觀察相關 Library

點選 選單 -- > APIs & Services -- > Library


嘗試搜尋 gke 這個關鍵字




接下來使用官方提供的指令進行啟用 API


# gcloud  services  enable  gkemulticloud.googleapis.com --project  YOUR_PROJECT

# gcloud  services  enable  gkeconnect.googleapis.com --project  YOUR_PROJECT

# gcloud  services  enable  connectgateway.googleapis.com --project  YOUR_PROJECT

# gcloud  services  enable  cloudresourcemanager.googleapis.com --project  YOUR_PROJECT

# gcloud  services  enable  anthos.googleapis.com --project  YOUR_PROJECT

# gcloud  services  enable  logging.googleapis.com --project  YOUR_PROJECT

# gcloud  services  enable  monitoring.googleapis.com --project  YOUR_PROJECT


  • 如果沒有啟用過該 API, 應該會出現 Operation "operations/acat.p2-9064xxxx3606-9313xxxx-2bff-407a-a807-7e6b672bxxxx" finished successfully.

  • 請將 YOUR_PROJECT 換成自己的專案


啟用之後就會發現 Enabled APIs 的數量增加了



==== Azure CLI ====


因為現在容器那邊的 az cli 有些問題, 這個部份我是用我實體機器的 az cli, 可以參考我之前的文章安裝 Azure cli


確認有安裝 Azure CLI


> az version


{

  "azure-cli": "2.38.0",

  "azure-cli-core": "2.38.0",

  "azure-cli-telemetry": "1.0.6",

  "extensions": {

    "resource-graph": "1.0.0"

  }

}



透過 # az account show 確認是否有身份驗證

如果還沒有身份驗證, 使用下列指令登入

# az  login


==== 配置 Azure 虛擬網路 / 創建 Azure 資源組 ====


準備工作的 創建 Azure 資源組 ( Resource Group ) 與 創建虛擬網路 可以一起執行


建立新的 Resource Group


> az  group  create  --name  "anthos_test_2023"  --location  "japaneast"



建立新的虛擬網路


> az  network vnet  create \

  --name "anthostest-vnet" \

  --location "japaneast" \

  --resource-group "anthos_test_2023" \

  --address-prefixes 10.0.0.0/16 \

  --subnet-name default


  • 虛擬網路的名稱可以自訂, 這邊以 anthostest-vnet 為例

  • location 與 resource group 請與上面相同

  • 子網路名稱可以自訂, IP 地址的前綴也可以自訂, 這邊以 10.0.0.0/16 為例, 會建立 anthostest-vnet 的虛擬網路 位址空間 10.0.0.0/16, 子網路為 default, 位址空間為 10.0.0.0/24

  • 網路的前綴, 建議也參考 Google 另外一份文件, 建立 Cluster 選擇 CIDR 的說明


> az  network  public-ip  create \

--name  "anthos-nat-gw-ip" \

--location  "japaneast" \

--resource-group  "anthos_test_2023" \

--allocation-method  Static \

--sku Standard


> az  network  nat  gateway  create \

--name  "anthos-nat-gw" \

--location  "japaneast" \

--resource-group  "anthos_test_2023" \

--public-ip-addresses  "anthos-nat-gw-ip" \

--idle-timeout  10


> az  network  vnet  subnet  update \

--name default \

--vnet-name  "anthostest-vnet" \

--resource-group  "anthos_test_2023" \

--nat-gateway  "anthos-nat-gw"



Notes

  • 沒有使用 Azure NAT Gateway, Health Check 會失敗





==== 建立 Azure Active Directory 服務帳號 ====


建立應用程式註冊 

> az  ad  app  create  --display-name  anthos-test-20230126


  • 這邊的名稱, 個人喜歡加上建立日期, 名稱可以自訂


建立完成之後可以到 Azure AAD 的 應用程式註冊 觀察



或是使用指令方式觀察 

> az  ad  app  list --output  table



Console 上面的 應用程式(用戶端)識別碼, 或是 az 指令輸出的 AppId 就是文件上面的 APPLICATION_ID


也可以用指令撈出來

az ad app list --all \

 --query "[?displayName=='anthos-test-20230126'].appId" \

 --output tsv


  • displayName 請換成自己的 :)


建立服務主帳號

> az  ad  sp  create --id  "YOUR_APPLICATION_ID"


  • 請使用之前建立出來的 AppId 來填入



可以使用 az ad sp list 配合 --all 以及 --display-name 來確認是否建立成功


> az ad  sp  list --output  table --all  --display-name  ant


DisplayName           Id                                    AppId                                 CreatedDateTime

--------------------  ------------------------------------  ------------------------------------  --------------------

anthos-test-20230126  d8b67939-xxxx-4d49-xxxx-7d0f2e63xxxx  0656xxxx-f3f5-xxxx-8c13-f71ed3cxxxx7  2022-10-23T06:42:47Z


或是觀察 Console 

  • 應用程式註冊內, 剛剛建立的 anthos-test-20230126 內容,  本機目錄受控的應用程式是否有對應? 如果沒有, 會顯示建立服務主體



==== 建立 Azure 角色分配 ====


要進行 Azure 角色分配 ( Role ), 需要下列資訊

  • APPLICATION_ID

    • 就是剛剛應用程式的 appId

    • > az  ad  app  list --output  table 來觀察

    • 或 > az ad app list --all  --query "[?displayName=='anthos-test-20230126'].appId"  --output tsv 

  • SERVICE_PRINCIPAL_ID

    • 剛剛建立的服務主帳號 id

      • 這個部份官方文件應該有誤, 他的 query 方式是 "[?displayName=='APPLICATION_NAME'].{objectId:objectId}" , 事實上透過 > az ad sp list  --all  --query "[?displayName=='anthos-test-20230126']" 來看整個資料的輸出, 該欄位應該是 id , 而非 objectId

      • > az ad sp list  --all  --query "[?displayName=='anthos-test-20230126'].{objectId:id}" --output tsv 或是觀察 console 上面, 應用程式註冊內, 剛剛建立的 anthos-test-20230126 內容的本機目錄中的受控的應用程式 (SP) 裡面的 物件識別碼

  • SUBSCRIPTION_ID

    • 訂閱的 ID

      • > az account show --query "id" --output tsv


這邊是以在訂閱這邊設定角色為例, 之前在測試 Azure Grafana 的時候, 也有相關指令可以參考


建立 3 個 role, Contributor、User Access Administrator 和 Key Vault Administrator 角色

  • 其實只是需要 SERVICE_PRINCIPAL_ID 與 SUBSCRIPTION_ID :p


建立指令如下


> az role assignment create \

    --role "Contributor" \

    --assignee "SERVICE_PRINCIPAL_ID" \

    --scope "/subscriptions/SUBSCRIPTION_ID"


> az role assignment create \

    --role "User Access Administrator" \

    --assignee "SERVICE_PRINCIPAL_ID" \

    --scope "/subscriptions/SUBSCRIPTION_ID"


> az role assignment create \

    --role "Key Vault Administrator" \

    --assignee "SERVICE_PRINCIPAL_ID" \

    --scope "/subscriptions/SUBSCRIPTION_ID"


  • 請替換成自己的 SERVICE_PRINCIPAL_ID 與 SUBSCRIPTION_ID


建立完成, 可以到 Console 上面

該訂用帳戶 -- > 存取控制 ( IAM ) -- > 角色指派 上面去觀察是否有該 SP


  • 參與者 ( Contributor )

  • Key Vault  系統管理員 ( Key Vault Administrator)

  • 使用者存取系統管理員 ( User Access Administrator )



==== 建立 客戶端證書 ====


要建立 Azure Client 需要下列資訊


  • SUBSCRIPTION_ID

    • 訂閱的 ID

      • > az account show --query "id" --output tsv

  • APPLICATION_ID

    • 就是剛剛應用程式的 appId

    • > az  ad  app  list --output  table 來觀察

    • 或 > az ad app list --all  --query "[?displayName=='anthos-test-20230126'].appId"  --output tsv 

  • TENANT_ID

    • 我自己是喜歡直接使用 > az account show 去觀察 tenantId

    • 官方文件是用 az account list   --query "[?id=='${SUBSCRIPTION_ID}'].{tenantId:tenantId}" --output tsv

      • 請替換成自己的 SUBSCRIPTION_ID


建立 AzureClient


# gcloud  container  azure  clients  create  anthos-azure-japaneast   --location=asia-northeast2   --tenant-id="YOUR_TENANT_ID"   --application-id="YOUR_APPLICATION_ID" --project YOUR_PROJECT



觀察是否有建立


# gcloud  container  azure  clients  list  --location  asia-northeast2  --project  YOUR_PROJECT


如果要刪除可以用以下指令

  • gcloud  container  azure  clients delete anthos-azure-japaneast --location=asia-northeast2 --project YOUR_PROJECT


接下來要將憑證上傳到 Azure AD 剛剛註冊的應用程式

因為是憑證的關係, 所以真的會利用變數來傳入了 :)


> CERT=$(gcloud  container  azure  clients get-public-cert --location=asia-northeast2 anthos-azure-japaneast --project YOUR_PROJECT )


  • location 請替換你的 Google 區域

  • client 名稱請換成自己的名稱

  • 如果 project ID 已經有預設就不一定要加上去


觀察輸出

> echo  $CERT


> az  ad  app  credential  reset  --id "YOUR_APPLICATION_ID" --cert  "${CERT}" --append


上傳完成, 可以到 Azure Console 該應用程式的 憑證及祕密的 憑證觀察



==== 建立 SSH 金鑰對 ====


使用 ssh-keygen 指令建立金鑰

> ssh-keygen  -m  PEM  -t  rsa  -b  4096  -f  ~/.ssh/anthos-multicloud-key -N ""


  • 會在家目錄底下建立  anthos-multicloud-key 與 anthos-multicloud-key.pub

  • 金鑰要不要加上 passphrase 保護看自己





==== 建立 Cluster ====


建立 cluster 參考


查詢 Resource Group ID

> az  group  show  --output  tsv  --query  id  --resource-group anthos_test_2023


設定變數

> CLUSTER_RESOURCE_GROUP_ID=$(az  group  show  --output  tsv  --query  id  --resource-group anthos_test_2023)


確認資訊

> echo $CLUSTER_RESOURCE_GROUP_ID


設定變數

> VNET_ID=$(az  network  vnet  show --output  tsv  --resource-group  anthos_test_2023  --query  id --name  anthostest-vnet)


確認資訊

> echo  $VNET_ID


> SUBNET_ID=$(az  network  vnet  subnet  show  --query  id  --output  tsv  \

    --resource-group  anthos_test_2023 \

    --vnet-name  anthostest-vnet \

    --name default)


確認資訊

> echo  $SUBNET_ID


設定變數

> AZURE_REGION=japaneast


確認資訊

> echo $AZURE_REGION


設定變數

> FLEET_PROJECT_ID=YOU_PROJECT


  • 請換成自己 Project 的 ID


> CLIENT_NAME=anthos-azure-japaneast



> SSH_PUBLIC_KEY=$(cat ~/.ssh/anthos-multicloud-key.pub)


  • 請對應到實際 public key 的位置



gcloud  container  azure  clusters create  azure-cluster-0 \

    --location  asia-northeast2 \

    --cluster-version  1.24.5-gke.200 \

    --azure-region japaneast \

    --fleet-project  YOU_PROJECT \

    --client  anthos-azure-japaneast \

    --resource-group-id  $CLUSTER_RESOURCE_GROUP_ID \

    --vnet-id  $VNET_ID \

    --subnet-id  $SUBNET_ID \

    --pod-address-cidr-blocks  10.2.0.0/18 \

    --service-address-cidr-blocks  10.1.0.0/24 \

    --ssh-public-key  "$SSH_PUBLIC_KEY" \

    --vm-size  Standard_B2ms \

    --tags  "google:gkemulticloud:cluster=azure-cluster-0" --project YOU_PROJECT


  • fleet-project 請對應到自己的 project ID

  • 建議可以先用 > az  vm  list-skus -l  japaneast -r  virtualMachines  -o  table 確認有該機器可用, 不然可能會遇到資源不足 error

  • 沒有使用 NAT Gateway 換了  pod 與 service address CIDR 還是失敗, 但是訊息變成 Operation failed, 卡在 Health Check

  • 之前有規範 Pod 使用 100.65.0.0/16 , Service 使用 100.66.0.0/16 失敗, 之後再來測試


列出 Cluster 資訊

> gcloud  container  azure  clusters  list  --location  asia-northeast2 --project YOU_PROJECT


如果要刪除 Cluster 可以用下列指令

> gcloud  container  azure  clusters  delete  azure-cluster-0 --location  asia-northeast2 --project YOU_PROJECT


  • azure-cluster-0 請對應到要刪除的 cluster 名稱


可以到 GCP Anthos 的 Cluster 觀察資訊




建立 Node Pool ( 使用 VMSS )


> gcloud  container  azure  node-pools  create  pool-0 \

    --cluster  azure-cluster-0 \

    --location  asia-northeast2 \

    --node-version  1.24.5-gke.200 \

    --vm-size  Standard_B2s \

    --max-pods-per-node  110 \

    --min-nodes 1 \

    --max-nodes 5 \

    --ssh-public-key  "$SSH_PUBLIC_KEY" \

    --subnet-id  $SUBNET_ID \

    --tags  "google:gkemulticloud:cluster=azure-cluster-0" --project YOU_PROJECT


  • VM size / min-node / max-node 請依照需求更改

  • 請將 project ID 換成自己的


觀察 Azure VMSS 建立完成




GCP 上面的 Anthos Cluster 狀態改為 login


觀察相關資訊

gcloud  container  azure  node-pools  list  --location  asia-northeast2  --cluster  azure-cluster-0 --project  YOU_PROJECT


gcloud  container  azure  node-pools  describe  pool-0 \

    --cluster  azure-cluster-0 \

    --location  asia-northeast2 --project YOU_PROJECT


點選 azure-cluster-0 Status 的圖示

點選 LOG IN


選取登入的方式

點選 Use your Google identity to log-in

點選 LOGIN



這個時候就發現 Status 就正常了


同時這個 Cluster 也會出現在 GKE 的 Cluster 列表內




接下來就是取得  authentication credentials


> gcloud  container  azure  clusters  get-credentials  azure-cluster-0  --location  asia-northeast2  --project YOU_PROJECT


相關的 credentials 會被整合到目前的 ~/.kube/config


下個簡單的指令來驗證

> kubectl  get  nodes


NAME                                          STATUS   ROLES    AGE   VERSION

gke-fnahzzytjbfa-np-tjd6ttygv5da-vmss000000   Ready    <none>   18d   v1.24.5-gke.200


建立一個 deployment 測試


> kubectl  create  deployment  hello-server  --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0



> kubectl  get  deployments


NAME           READY   UP-TO-DATE   AVAILABLE   AGE

hello-server   1/1     1            1           71s


將剛剛的 deployment export 出去

> kubectl  expose  deployment  hello-server  --type  LoadBalancer  --port  80  --target-port  8080


service/hello-server exposed


確認資訊
> kubectl  get  services


NAME           TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)        AGE

hello-server   LoadBalancer   10.1.0.54    YOUR_PUBLIC_IP   80:30898/TCP   95s

kubernetes     ClusterIP      10.1.0.1     <none>          443/TCP        18d


開啟瀏覽器測試 http://YOUR_PUBLIC_IP 



可以在 GCP console 上面觀察 Service



我們剛剛 export 出去的 Service Type 是 LoadBalancer, 所以其實連結的是 Azure 那邊的負載平衡器, 如果在 GCP 這邊是看不到的



而是對應到 Azure 的 負載平衡器





又朝 Kubernetes 更進一步


~ enjoy it


補充: 刪除相關資源


> gcloud  container  azure  node-pools  delete  pool-0  --cluster  azure-cluster-0  --location  asia-northeast2  --project YOU_PROJECT


> gcloud  container  azure  clusters  delete  azure-cluster-0  --location  asia-northeast2  --project YOU_PROJECT


  •  官方文件只有上面這兩個步驟, 但是實際觀察 Resource Group 其實還有以下兩個資源, 也要手動刪除

    • Public IP

    • NAT Gateway


刪除順序要反過來


> az  network  vnet  subnet  update \

--name default \

--vnet-name  "anthostest-vnet" \

--resource-group  "anthos_test_2023" \

--nat-gateway  ""



> az  network  nat  gateway  delete \

--name  "anthos-nat-gw" \

--resource-group  "anthos_test_2023


> az  network  public-ip  delete \

--name  "anthos-nat-gw-ip" \

--resource-group  "anthos_test_2023


這樣才算是清除乾淨 :)



Reference



Todo