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

Last reviewed 2021-06-09 UTC

本文適用於企業架構師和軟體開發人員,協助他們建構自動化管道,在 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 服務會使用這些屬性,判斷要擷取的建議類型。
    • 第二個集合會儲存處理建議時套用的業務規則。

目標

  • 建立範例 Cloud Run 服務,擷取範例專案的 Active Assist 建議,並將這些建議推送至 Pub/Sub 主題。
  • 建立兩個 Firestore 集合,分別儲存範例中繼資料和業務規則。
  • 建立第二個 Cloud Run 服務,根據您在本教學課程中定義的範例業務規則處理建議。
  • 建立 Slack 頻道,讓 Cloud Run 服務傳送 Active Assist 建議範例。
  • 使用 Active Assist 建議範例測試端對端管道。

費用

在本文件中,您會使用 Google Cloud的下列計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator

初次使用 Google Cloud 的使用者可能符合免費試用資格。

完成本文所述工作後,您可以刪除已建立的資源,避免繼續計費。詳情請參閱清除所用資源一節。

事前準備

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Google Cloud project.

  3. 記下建議管理工具專案的 Google Cloud 專案 ID。下節設定環境會需要用到此 ID。
  4. Enable the Cloud Build, Firestore, App Engine,Pub/Sub, Cloud Run, Cloud Scheduler, and Cloud Source Repositories APIs.

    Enable the APIs

    在本教學課程中,您會使用預設應用程式憑證。如果系統在「將憑證新增至專案」頁面中提示您建立憑證,請按一下「取消」
  5. Verify that billing is enabled for your Google Cloud project.

  6. 建立下列項目:
    • Slack 頻道範例。
    • 範例 Slack 應用程式和連入 Webhook,可接收名為 recommendation-rules-engine 的引擎產生的通知。本教學課程稍後會引導您設定引擎。
    詳情請參閱「建立 Slack 頻道」和「使用傳入 Webhook 傳送訊息」。

    建立 Slack 應用程式和連入 Webhook 網址後,請記下該網址,本教學課程稍後會用到。

建構無伺服器管道

在本節中,您將建立建構無伺服器管道所需的元件。平台會根據使用模式和系統指標產生 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
    

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程中所用資源的相關費用,請刪除含有該項資源的專案,或者保留專案但刪除個別資源。

  • In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  • In the project list, select the project that you want to delete, and then click Delete.
  • In the dialog, type the project ID, and then click Shut down to delete the project.
  • 後續步驟