搭配 Active Assist 使用無伺服器管道

本文適用於企業架構師和軟體開發人員,協助他們建構自動化管道,在 Google Cloud 機構中使用 Active Assist。本系列文章將探討企業可採用的架構模式,以使用 Active Assist 大規模最佳化雲端足跡。本系列文章包含以下部分:

本教學課程說明如何使用 Google Cloud 無伺服器技術,建構自動化管道來擷取及處理 Active Assist 建議。您會根據企業設定的業務規則提供建議。在本教學課程中設定的自動化管道可協助您大規模使用 Active Assist,同時維持團隊主導的審查和啟動程序。如果貴企業想擴大使用 Active Assist 產品組合,但仍希望控管團隊內的審查和啟動程序,這種做法就非常實用。可做為持續整合和持續推送軟體更新 (CI/CD) pipeline 的替代方案。

本教學課程中示範的架構是通用的,您可以擴充架構,以便搭配其他無伺服器產品使用。本教學課程假設您熟悉下列 Google Cloud 技術:

如要完成本教學課程,您必須擁有 Slack 帳戶,或類似的通知/工單處理工具。工具必須在電腦上設定完成,且可供使用。

架構

本教學課程展示的架構採用模組化設計,因此您可以調整通知元件,以符合業務需求。本教學課程會示範如何產生通知並傳送至 Slack。您也可以選擇將通知傳送至 Pub/Sub,或是任何其他通知或票證處理工具。

下方架構圖顯示您將在本教學課程使用的元件:

無伺服器管道。

本架構的組成部分如下:

  • 排程器會以固定間隔觸發 Cloud Run 服務。服務會讀取 Firestore 集合中定義及保留的中繼資料 (專案 ID 和建議事項類型),藉此叫用 Recommender API。
  • Active Assist 建議會推送至這個 Pub/Sub 主題,並在其中處理。
  • 第二個 Cloud Run 服務,用於剖析 Active Assist 建議。這項服務會根據企業定義並儲存在 Firestore 集合中的業務規則,決定如何處理建議。
  • 兩個 Firestore 集合,用於儲存業務中繼資料和業務規則。Firestore 集合的運作方式如下:
    • 第一個集合會儲存與擷取 Active Assist 建議相關的商家中繼資料。在本教學課程中,recommendation typeGoogle Cloud project IDslocations 屬性會做為商家中繼資料。recommendation-collector Cloud Run 服務會使用這些屬性,判斷要擷取的建議類型。
    • 第二個集合會儲存處理建議時套用的業務規則。

建構無伺服器管道

在本節中,您將建立建構無伺服器管道所需的元件。平台會根據使用模式和系統指標產生 Active Assist 建議。視產生的建議而定,每個建議類別可能會使用不同的預設時間範圍 (從過去到現在),來分析使用資料和指標。

如果您有包含現有資源和 Active Assist 建議的範例 Google Cloud 專案,可以在適當變更提供的範例程式碼後,執行管道來處理這些建議。

建立 Firestore 集合

在本節中,您將建立兩個 Firestore 集合。第一個是「集合」,用於儲存與擷取 Active Assist 建議相關的業務中繼資料。activeassist-metadata第二個是activeassist-business-rules集合,用於儲存管道處理建議時套用的業務規則。

系統剖析 Active Assist 最佳化建議時,會根據 Firestore 集合中的業務規則產生並傳送通知,或自動將最佳化建議套用至相關資源。 Google Cloud

建立 activeassist-metadata 集合

  1. 前往 Google Cloud 控制台的 Firestore 頁面。

    開啟 Firestore

  2. 如果沒有 Firestore 資料庫,請建立一個。或者,如果您已有 Firestore 資料庫,請跳至下一個步驟。

    建立資料庫:

    1. 按一下「選取原生模式」以啟用 Firestore。
    2. 選取靠近 Cloud Run 服務執行所在區域的區域位置。
    3. 按一下「建立資料庫」。完成設定需要一些時間。
  3. 在 Firestore 頁面上,按一下「開始收集」

  4. 在「Collection ID」(集合 ID) 欄位中輸入 activeassist-metadata

  5. 按照下表所示填入欄位。如要新增下一個欄位,請按一下「新增欄位」

    欄位名稱 欄位類型 欄位值 注意事項
    project string Stub-Project-ID 本教學課程會使用欄位值的存根。如要使用現有 Google Cloud 專案的建議,請改為輸入專案 ID。
    locations array global 部分最佳化建議可能適用於特定區域或可用區,例如 VM 最適規模調整建議。其他建議則為全域建議,例如 IAM 建議。
    recommenderType string google.iam.policy.Recommender 不適用。

  6. 填妥欄位後,按一下「儲存」

建立 activeassist-business-rules 集合

  1. 按一下「開始收集」
  2. 在「Collection ID」(集合 ID) 欄位中輸入以下內容:activeassist-business-rules

    請按照下表填寫文件。如要新增下一個欄位,請按一下「新增欄位」

    欄位名稱 欄位類型 欄位值 注意事項
    action string Notify 將值設為 Apply,服務就會套用建議並移除未使用的角色。
    projectId string Stub-Project-ID 本教學課程使用虛設常式建議。如要使用現有 Google Cloud 專案的建議,請改為輸入專案 ID。
    projectNumber string 999999999 本教學課程使用虛設常式建議。

    如果您要使用現有 Google Cloud 專案的建議,請改為輸入專案編號。您可以在Google Cloud 控制台歡迎頁面中找到專案編號。
    recommenderType string google.iam.policy.Recommender 不適用。
    recommenderSubtype string REMOVE_ROLE 不適用。
    slackWebhookURL string 輸入您在上一個步驟中產生的 Slack Webhook 網址。 網址類似於以下內容:

    https://hooks.slack.com/services/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

    本教學課程說明如何建立規則,判斷系統是否自動套用建議,或是否產生通知並傳送至 Slack 等平台。如要瞭解如何根據您設定的範例業務規則評估結果,自動套用建議,請參閱相關的存放區

  3. 文件填寫完畢後,按一下「儲存」

建立排程 Cloud Run 服務

在本節中,您會建立名為 recommendation-collector 的排程 Cloud Run 服務,該服務會叫用 Recommender API 並擷取有效建議。本教學課程會使用 Identity and Access Management Recommender API 做為 Recommender API。這項服務會從您建立的 activeassist-metadata Firestore 集合讀取中繼資料,判斷要擷取哪些建議。

  1. 按一下「在 Cloud Shell 中開啟」,開啟建議管理工具專案的 Cloud Shell。

    在 Cloud Shell 中開啟

    Cloud Shell 開啟後,會執行下列指令:

    「Open in Cloud Shell」(在 Cloud Shell 中開啟) 對話方塊隨即顯示,請選取「Trust」(信任),然後按一下「Confirm」(確認)。

  2. 將目前建議事項管理員專案的專案 ID 和專案編號設為變數:

    export RECO_MGR_PROJECT=PROJECT_ID
    gcloud config set project $RECO_MGR_PROJECT
    export RECO_MGR_PROJECT_NUMBER=$(gcloud projects describe $DEVSHELL_PROJECT_ID --format='value(projectNumber)')
    

    PROJECT_ID 替換為專案 ID。輸入指令後,系統會提示您授權,請按一下「授權」

  3. 設定部署地區的變數:

    export REGION=us-central1
    

    雖然本教學課程使用的是 us-central1 地區,但您可以使用任何可使用 Cloud Run 的地區

  4. 為 Docker 映像檔建立環境變數:

    export RECOMMENDER_IMAGE=gcr.io/$RECO_MGR_PROJECT/recommendation-collector:1.0
    
  5. 建構 Docker 映像檔並上傳至 Container Registry

     gcloud builds submit --tag $RECOMMENDER_IMAGE
    
  6. recommendation-collector 服務建立服務帳戶,以便與管道中的其他 Google Cloud 服務互動:

    gcloud iam service-accounts create recommendation-collector-sa \
      --description "Service Account that the recommendation-collector service uses to invoke other Google Cloud services" \
      --display-name "recommendation-collector-sa" \
      --project $RECO_MGR_PROJECT
    

    最佳做法是將預先定義的角色指派給服務帳戶,為 Cloud Run 服務授予精細的權限。詳情請參閱服務身分

  7. 授予 recommendation-collector 服務的服務帳戶存取 Firestore 和 Recommender API 的權限:

    gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
      --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/datastore.user
    gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
      --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/pubsub.publisher
    
  8. 如果您是使用複製存放區中提供的範例 stub 執行本教學課程,請跳至下一個步驟。

    如果您是使用為現有 Google Cloud 專案產生的建議,在本教學課程中建構管道,則必須將 IAM 權限指派給您建立的服務帳戶,才能執行這兩項 Cloud Run 服務。

    執行指令前,請先使用要執行此管道的專案 ID 設定環境變數 TEST_PROJECT_ID

    export TEST_PROJECT_ID=TEST_PROJECT_ID
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/recommender.iamAdmin
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/serviceusage.serviceUsageConsumer
    gcloud services enable recommender.googleapis.com --project $TEST_PROJECT_ID
    

    請確認您使用的專案 ID 與建立 Firestore 集合時輸入的 ID 相符。

  9. 在本教學課程中,您會使用名為 STUB_RECOMMENDATIONS 的環境變數部署服務。這個變數可讓您使用存根測試管道。

    部署 Cloud Run 服務:

    gcloud run deploy recommendation-collector \
      --image=$RECOMMENDER_IMAGE \
      --no-allow-unauthenticated \
      --region $REGION \
      --platform managed \
      --service-account recommendation-collector-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --set-env-vars="STUB_RECOMMENDATIONS=true" \
      --project $RECO_MGR_PROJECT \
    

    接受所有系統提示。

    如要使用為 Google Cloud 專案產生的 Active Assist 建議執行管道,請先從指令中移除下列程式碼行,再部署指令:

    --set-env-vars="STUB_RECOMMENDATIONS=true"
    

設定 Cloud Scheduler 工作,以執行 recommender-collector service

  1. 在 Cloud Shell 中,建立供 Cloud Scheduler 工作使用的服務帳戶,以執行 recommendation-collector 服務:

    gcloud iam service-accounts create recommender-scheduler-sa \
      --description "Service Account used by Cloud Scheduler to invoke the recommender-parser service" \
      --display-name "recommender-scheduler-sa" \
      --project $RECO_MGR_PROJECT
    
  2. run/invoker 角色授予服務帳戶,讓服務帳戶能叫用 Cloud Run 服務:

    gcloud run services add-iam-policy-binding recommendation-collector \
      --member=serviceAccount:recommender-scheduler-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role=roles/run.invoker \
      --region=$REGION \
      --platform=managed
    
  3. 取得 recommendation-collector 服務網址:

    export RECOMMENDER_SERVICE_URI=`gcloud run services describe recommendation-collector \
      --platform managed \
      --project $RECO_MGR_PROJECT \
      --region $REGION \
      --format="value(status.url)"`/run
    
  4. 建立名為 recommender-iam-scheduler 的 Cloud Scheduler 工作:

    gcloud scheduler jobs create http recommender-iam-scheduler \
      --project $RECO_MGR_PROJECT \
      --time-zone "America/Los_Angeles" \
      --schedule="0 */3 * * *" \
      --uri=$RECOMMENDER_SERVICE_URI \
      --description="Scheduler job to invoke recommendation pipeline" \
      --oidc-service-account-email="recommender-scheduler-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com" \
      --headers="Content-Type=application/json" \
      --http-method="POST"
    

    設定時區,以配合您的位置。時區值格式是根據 tz 資料庫

    詳情請參閱 gcloud scheduler jobs create http

    Cloud Scheduler 工作會叫用 recommendation-collector 服務的 /run 路由。

    設定 --schedule="0 */3 * * *" 旗標會每三小時執行一次排程器工作。你可以根據需求變更這項設定。詳情請參閱「設定 Cron 工作時間表」。

建立推薦規則引擎,處理推薦內容

在本節中,您將建立名為 recommendation-rules-engine 的第二個 Cloud Run 服務,用來處理 recommendation-collector 服務收集的建議。當新建議推送到 activeassist-recommendations 主題時,Pub/Sub 會叫用 recommendation-rules-engine 服務。

這項服務會根據您在 activeassist-business-rules 集合中定義的業務規則,剖析建議。

  1. 在 Cloud Shell 中開啟 recommendation-rules-engine 目錄:

    cd ../recommendation-rules-engine
    
  2. 為 Docker 映像檔建立環境變數:

    export RULES_ENGINE_IMAGE=gcr.io/$RECO_MGR_PROJECT/recommendation-rules-engine:1.0
    
  3. 建構 Docker 映像檔並上傳至 Container Registry

    gcloud builds submit --tag $RULES_ENGINE_IMAGE
    
  4. recommendation-rules-engine 服務建立服務帳戶,以便與管道中的其他 Google Cloud 服務互動:

    gcloud iam service-accounts create recommendation-rules-sa \
     --description "Service Account that recommendation-rules-engine uses to invoke other Google Cloud services" \
     --display-name "recommendation-rules-sa" \
     --project $RECO_MGR_PROJECT
    
  5. 授予 recommendation-rules-engine 服務的服務帳戶 Firestore 存取權:

    gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
      --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/datastore.user
    

    如果您使用本教學課程提供的存根,請繼續下一個步驟。

    如果您要使用為Google Cloud 專案產生的建議測試管道,而不是本教學課程提供的虛設常式,請執行下列指令,允許規則引擎服務帳戶存取您的專案:

    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/serviceusage.serviceUsageConsumer
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/recommender.iamAdmin
    gcloud projects add-iam-policy-binding $TEST_PROJECT_ID \
      --member serviceAccount:recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/resourcemanager.projectIamAdmin
    
  6. 部署 Cloud Run 服務:

    gcloud run deploy recommendation-rules-engine \
      --image=$RULES_ENGINE_IMAGE \
      --no-allow-unauthenticated \
      --region $REGION \
      --platform managed \
      --service-account recommendation-rules-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --project $RECO_MGR_PROJECT
    

    接受所有系統提示。

  7. 取得 recommendation-rules-engine 網址:

    export RECOMMENDER_SERVICE_RULES_URI=`gcloud run services describe recommendation-rules-engine \
      --platform managed \
      --project $RECO_MGR_PROJECT \
      --region $REGION \
      --format="value(status.url)"`/process
    

    當您在下一個步驟中建立的 Pub/Sub 主題提供新建議時,系統會叫用您在這個步驟中擷取的網址。

為有效建議建立 Pub/Sub 主題

在本節中,您將為 Active Assist 建議建立 Pub/Sub 主題,recommender-collector 服務會透過呼叫 Recommender API 擷取這些建議。

  1. 在 Cloud Shell 中建立 Pub/Sub 主題:

    gcloud pubsub topics create activeassist-recommendations
    
  2. 建立服務帳戶,供 Pub/Sub 用於叫用 recommendation-rules-engine Cloud Run 服務:

    gcloud iam service-accounts create recommendation-engine-sub-sa \
      --description "Service Account used by Pub/Sub to push recommendations to the recommendation-rules-engine service" \
      --display-name "recommendation-engine-sub-sa" \
      --project $RECO_MGR_PROJECT
    
  3. Pub/Sub 服務帳戶必須與所需角色建立關聯,才能發布訊息及叫用 recommendation-rules-engine 服務:

    gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
      --member serviceAccount:recommendation-engine-sub-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role roles/run.invoker \
      --project $RECO_MGR_PROJECT
    

為 Pub/Sub 主題建立訂閱項目

  1. recommendation-rules-engine 服務建立訂閱項目:

    # grant Pub/Sub the permission to create tokens
    PUBSUB_SERVICE_ACCOUNT="service-$RECO_MGR_PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com"
    gcloud projects add-iam-policy-binding $RECO_MGR_PROJECT \
      --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\
      --role='roles/iam.serviceAccountTokenCreator'
    # configure the subscription push identity
    gcloud pubsub subscriptions create active-assist-recommendations-for-rules-engine \
      --topic=activeassist-recommendations \
      --topic-project=$RECO_MGR_PROJECT \
      --push-auth-service-account=recommendation-engine-sub-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --ack-deadline=60 \
      --push-endpoint=$RECOMMENDER_SERVICE_RULES_URI
    
  2. 允許您建立的 recommendation-engine-sub-sa 服務帳戶叫用 recommendation-rules-engine 服務:

    gcloud run services add-iam-policy-binding recommendation-rules-engine \
      --member=serviceAccount:recommendation-engine-sub-sa@$RECO_MGR_PROJECT.iam.gserviceaccount.com \
      --role=roles/run.invoker \
      --region=$REGION \
      --platform=managed
    

使用存根執行端對端測試

平台會根據使用模式和系統指標生成 Active Assist 建議。各類建議可能會使用不同的預設時間範圍,分析過去的用量資料和指標,並據此生成建議。舉例來說,平台會根據過去 90 天的使用模式,產生 IAM 建議。

如要測試端對端管道,您為本教學課程複製的存放區會提供範例建議 (存根),您可以使用這些建議執行端對端管道。

在本節中,執行以下操作:

  • 檢查存根建議。
  • 手動叫用管道。
  • 檢查系統是否產生通知,並傳送至您建立的 Slack 管道。
  1. 查看存放區中提供的範例建議:

    cat ../recommendation-collector/stub.json
    

    這個檔案提供範例建議,其中包含名為 roles/gkehub.connect 的範例角色 REMOVE 動作。

  2. 執行下列指令,讓 Cloud Scheduler 立即執行工作,不必等待下一次排定的執行時間:

    gcloud scheduler jobs run recommender-iam-scheduler
    
  3. 在「Cloud Scheduler」控制台頁面中,確認 recommender-iam-scheduler 作業的「結果」欄顯示「成功」

    如要詳細瞭解各項服務執行的步驟,您也可以查看 recommendation-collector 服務和 recommendation-rules-engine 服務的 Cloud Run 服務記錄

  4. 在本教學課程中建構的無伺服器端對端管道成功執行後,會產生 Slack 通知,其中包含建議您移除的角色繫結詳細資料。以下是您收到的通知範例:

    Project xxxxxxxx\
    **Impact**: SECURITY\
    This role has not been used during the observation window.\
    **Role**: roles/gkehub.connect\
    **Member**:
    serviceAccount:sample-sa@recommendation-sample.iam.gserviceaccount.com\
    **Action**: remove