設定工作的密鑰

您的工作可能需要 API 金鑰、密碼、憑證或其他機密資訊,才能滿足依附元件的需求。如果是 Cloud Run,Google 建議您將這類機密資訊儲存在 Secret Manager 中建立的密鑰。

透過下列其中一種方式,讓容器可存取密鑰:

  • 將每個密鑰掛接為磁碟區後,Cloud Run 會以檔案形式將密鑰提供給容器。讀取磁碟區時,Cloud Run 一律會從 Secret Manager 擷取密鑰值,以便使用最新版本的值。這個方法也很適合用於密鑰輪替。
  • 使用環境變數傳遞密鑰。系統會在執行個體啟動時解析環境變數,因此如果您使用這個方法,Google 建議您將密鑰固定在特定版本,而不是使用 latest 做為版本。

詳情請參閱「Secret Manager 最佳做法」。

部署和執行階段如何檢查密鑰

建立工作時,Cloud Run 會檢查您使用的所有密鑰。這項檢查可確保執行容器的服務帳戶有權存取這些密鑰。

在執行階段,當執行個體啟動時:

  • 如果密鑰是環境變數,Cloud Run 會在啟動執行個體前擷取密鑰值。如果密鑰擷取程序失敗,執行個體就不會啟動。
  • 如果將密鑰掛接為磁碟區,Cloud Run 就不會在執行個體啟動期間執行任何檢查。不過,在執行階段,如果無法存取密鑰,嘗試讀取已掛接的磁碟區就會失敗。

音量擁有權

Cloud Run 密碼磁碟區的擁有權會因執行環境和部署類型而異。

使用第二代執行環境 (一律用於作業) 掛接密鑰磁碟區時,磁碟區會由根目錄擁有。

事前準備

  1. Enable the Secret Manager API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  2. 使用現有的密鑰,或按照「 建立密鑰」一文的說明,在 Secret Manager 中建立密鑰。

必要的角色

如要取得設定密鑰所需的權限,請要求管理員授予下列 IAM 角色:

如要允許 Cloud Run 存取密鑰,服務身分必須具備下列角色:

如需如何將服務身分主體新增至 Secret Manager 密鑰存取者角色的操作說明,請參閱「管理密鑰存取權」。

如需與 Cloud Run 相關聯的 IAM 角色和權限清單,請參閱 Cloud Run IAM 角色Cloud Run IAM 權限。如果 Cloud Run 作業與Google Cloud API (例如 Cloud 用戶端程式庫) 介接,請參閱服務身分設定指南。 如要進一步瞭解如何授予角色,請參閱部署權限管理存取權

讓 Cloud Run 存取密鑰

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 YAML,讓工作存取密鑰:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run 作業頁面:

    前往 Cloud Run

  2. 從選單中選取「工作」,然後按一下「部署容器」,填寫初始工作設定頁面。如要設定現有工作,請選取該工作,然後按一下「編輯」

  3. 按一下「容器、磁碟區、連線與安全性」,展開工作屬性頁面。

  4. 按一下「變數與密鑰」分頁標籤。

    圖片

    • 在「變數與密鑰」分頁中:

      • 如要以環境變數形式公開密鑰,請按照下列步驟操作:

        1. 按一下「容器」分頁標籤。
        2. 在「變數和密鑰」分頁中,按一下「參照密鑰」
        3. 在「Name 1」(名稱 1) 欄位中,輸入環境變數的名稱。
        4. 從「祕密」清單中,選取要使用的祕密。
        5. 在「版本 1」清單中,選取要參照的密鑰版本。
        6. 按一下 [完成]
        7. 按一下 [Create] (建立) 或 [Deploy] (部署)
      • 如要將密鑰掛接為磁碟區,請按照下列步驟操作:

        1. 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」
        2. 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)
        3. 在「Volume name」(磁碟區名稱) 欄位中輸入名稱,或接受預設名稱。
        4. 從「祕密」清單中,選取要使用的祕密。
        5. 在「Path 1」欄位中,輸入要掛接的檔案名稱。
        6. 在「Version 1」清單中,選取要參照的密鑰版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。
        7. 按一下 [完成]
        8. 前往「容器」分頁,將密鑰掛接到容器。
        9. 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)
        10. 從「名稱 1」清單中選取磁碟區名稱。
        11. 在「Mount path 1」(掛接路徑 1) 欄位中,輸入這個密鑰的掛接路徑。 這個目錄會存放所有版本的密鑰。
        12. 按一下 [完成]
        13. 按一下「建立」或「部署」
  5. 按一下「建立」或「更新」

gcloud

  • 如要在建立新工作時,於環境變數中指定密鑰,請按照下列步驟操作:

    gcloud run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION

    更改下列內容:

    • JOB_NAME:工作名稱。
    • ENV_VAR_NAME:用於密鑰的環境變數名稱。
    • SECRET_NAME:同一專案中的密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest

    您可以使用以半形逗號分隔的清單,指定多個環境變數/密鑰組合。

  • 如要在更新工作時,於環境變數中指定密鑰,請按照下列步驟操作:

    gcloud run jobs update JOB_NAME \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
  • 如要在建立工作時將密鑰掛接為磁碟區,請按照下列步驟操作:

    gcloud run jobs create JOB_NAME \
    --image IMAGE_URL \
    --set-secrets=PATH=SECRET_NAME:VERSION

    更改下列內容:

    • JOB_NAME:工作名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是磁碟區的掛接路徑,password 則是密鑰的檔案名稱。
    • SECRET_NAME:同一專案中的密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字,例如 2
  • 如要更新現有工作中的密鑰:

    gcloud run jobs update JOB_NAME \
    --update-secrets=PATH=SECRET_NAME:VERSION

YAML

由於 API 相容性限制,密鑰位置必須儲存在註解中。

  1. 如果您要建立新工作,請略過這個步驟。 如要更新現有工作,請下載其 YAML 設定

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. 以環境變數形式公開的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

    更改下列內容:

    • JOB:工作名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字,例如 2
    • SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如 my-secret。可以與 SECRET_NAME 相同。
  3. 如要將密鑰掛接為檔案路徑,請按照下列步驟操作:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - mountPath: MOUNT_PATH
                  name: VOLUME_NAME
              volumes:
              - name: VOLUME_NAME
                secret:
                  items:
                  - key: VERSION
                    path: FILENAME
                  secretName: SECRET_LOOKUP_NAME

    更改下列內容:

    • JOB_NAME:工作名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是磁碟區的掛接路徑,password 則是密鑰的檔案名稱。
    • PROJECT_NUMBER:建立密鑰的專案專案編號。
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字,例如 2
    • SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如 my-secret。可以與 SECRET_NAME 相同。
    • VOLUME_NAME:任何名稱,例如 my-volume。可以與 SECRET_NAME 相同。

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_job 資源:

以環境變數形式公開的密鑰:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"

        env {
          name = "SECRET_NAME"

          value_source {
            secret_key_ref {
              secret = "SECRET_NAME"
              version = "VERSION"
            }
          }
        }
      }
    }
  }
}

更改下列內容:

  • JOB_NAME:Cloud Run 工作的名稱。
  • REGION: Google Cloud 區域。例如:europe-west1
  • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  • SECRET_NAME:密鑰名稱,例如 mysecret
  • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。

對於以檔案路徑形式掛接的密鑰:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"

        volume_mounts {
          name       = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }

      volumes {
        name = "VOLUME_NAME"
        secret {
          secret = "SECRET_NAME"
        }
      }
    }
  }
}

更改下列內容:

  • JOB_NAME:Cloud Run 工作的名稱。
  • REGION: Google Cloud 區域。例如:europe-west1
  • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  • VOLUME_NAME:任何名稱,例如 my-volume。可以與 SECRET_NAME 相同。
  • MOUNT_PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是磁碟區的掛接路徑,password 則是密鑰的檔案名稱。
  • SECRET_NAME:密鑰名稱,例如 mysecret

參照其他專案的密鑰

如果專案的服務帳戶已獲准存取密鑰,您就可以參照其他專案的密鑰。

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run 作業頁面:

    前往 Cloud Run

  2. 從選單中選取「工作」,然後按一下「部署容器」,填寫初始工作設定頁面。如要設定現有工作,請選取該工作,然後按一下「編輯」

  3. 按一下「容器、磁碟區、連線與安全性」,展開工作屬性頁面。

  4. 按一下「變數與密鑰」分頁標籤。

    圖片

    • 在「變數與密鑰」分頁中:

      • 如要以環境變數形式公開密鑰,請按照下列步驟操作:

        1. 按一下「容器」分頁標籤。
        2. 在「變數和密鑰」分頁中,按一下「參照密鑰」
        3. 在「Name 1」(名稱 1) 欄位中,輸入環境變數的名稱。
        4. 在「密鑰」清單中,按一下「手動輸入密鑰」
        5. 請輸入密鑰的資源 ID,格式如下:

          projects/PROJECT_NUMBER/secrets/SECRET_NAME
          

          更改下列內容:

          • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。

          • SECRET_NAME:Secret Manager 中的密碼名稱。

        6. 在「版本 1」清單中,選取要參照的密鑰版本。

        7. 按一下 [完成]

        8. 按一下 [Create] (建立) 或 [Deploy] (部署)

      • 如要將密鑰掛接為磁碟區,請按照下列步驟操作:

        1. 按一下「磁碟區」分頁標籤,然後選取「新增磁碟區」
        2. 在「Volume type」(磁碟區類型) 清單中,選取「Secret」(密鑰)
        3. 在「Volume name」(磁碟區名稱) 欄位中輸入名稱,或接受預設名稱。
        4. 在「密鑰」清單中,按一下「手動輸入密鑰」
        5. 請輸入密鑰的資源 ID,格式如下:

          projects/PROJECT_NUMBER/secrets/SECRET_NAME
          

          更改下列內容:

          • PROJECT_NUMBER 改成您的 Google Cloud 專案編號。如需如何找出專案編號的詳細操作說明,請參閱「建立及管理專案」。

          • SECRET_NAME:Secret Manager 中的密碼名稱。

        6. 在「Path 1」欄位中,輸入要掛接的檔案名稱。

        7. 在「Version 1」清單中,選取要參照的密鑰版本。系統預設會選取最新版本。如要選取特定版本,請點選該版本。

        8. 按一下 [完成]

        9. 前往「容器」分頁,將密鑰掛接到容器。

        10. 在「Volume mounts」(磁碟區掛接) 分頁中,按一下「Mount volume」(掛接磁碟區)

        11. 從「名稱 1」清單中選取磁碟區名稱。

        12. 在「Mount path 1」(掛接路徑 1) 欄位中,輸入這個密鑰的掛接路徑。 這個目錄會存放所有版本的密鑰。

        13. 按一下 [完成]

        14. 按一下「建立」或「部署」

  5. 按一下「建立」或「更新」

gcloud

  • 如要在更新工作時將密鑰掛接為磁碟區,請進行以下操作:

    gcloud run jobs update JOB_NAME \
    --image IMAGE_URL \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
    • JOB_NAME:工作名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是磁碟區的掛接路徑,password 則是密鑰的檔案名稱。
    • PROJECT_NUMBER:建立密鑰的專案專案編號。
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字,例如 2

YAML

  1. 如果您要建立新工作,請略過這個步驟。 如要更新現有工作,請下載其 YAML 設定

    gcloud run jobs describe JOB_NAME --format export > job.yaml

由於 API 相容性限制,密鑰位置必須儲存在註解中。

  1. 以環境變數形式公開的密鑰:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - env:
                - name: SECRET_NAME
                  valueFrom:
                    secretKeyRef:
                      key: VERSION
                      name: SECRET_LOOKUP_NAME
                image: IMAGE_URL 

    更改下列內容:

    • JOB:工作名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字,例如 2
    • PROJECT_NUMBER:建立密鑰的專案專案編號。
    • SECRET_LOOKUP_NAME:任何符合有效密鑰名稱語法的名稱,例如 my-secret。可以與 SECRET_NAME 相同。
  2. 如要將密鑰掛接為檔案路徑,請按照下列步驟操作:

    apiVersion: run.googleapis.com/v1
    kind: Job
    metadata:
      name: JOB_NAME
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME
        spec:
          template:
            spec:
              containers:
              - image: IMAGE_URL
                volumeMounts:
                - mountPath: MOUNT_PATH
                  name: VOLUME_NAME
              volumes:
              - name: VOLUME_NAME
                secret:
                  items:
                  - key: VERSION
                    path: FILENAME
                  secretName: SECRET_LOOKUP_NAME

    更改下列內容:

    • JOB_NAME:工作名稱。
    • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
    • PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是磁碟區的掛接路徑,password 則是密鑰的檔案名稱。
    • PROJECT_NUMBER:建立密鑰的專案專案編號。
    • SECRET_NAME:密鑰名稱,例如 mysecret
    • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字,例如 2
    • SECRET_LOOKUP_NAME:任何具有有效密鑰名稱語法的名稱,例如 my-secret,可以與 SECRET_NAME 相同。
    • VOLUME_NAME:任何名稱,例如 my-volume,可以與 SECRET_NAME 相同。

Terraform

如要瞭解如何套用或移除 Terraform 設定,請參閱「基本 Terraform 指令」。

在 Terraform 設定中,將下列內容新增至 google_cloud_run_v2_job 資源:

以環境變數形式公開的密鑰:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"
        env {
          name = "SECRET_NAME"
          value_source {
            secret_key_ref {
              secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
              version = "VERSION"
            }
          }
        }
      }
    }
  }
}

更改下列內容:

  • JOB_NAME:Cloud Run 工作的名稱。
  • REGION: Google Cloud 區域。例如:europe-west1
  • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  • SECRET_NAME:密鑰名稱,例如 mysecret
  • PROJECT_ID:建立密鑰的專案 ID。
  • VERSION:密鑰版本。使用 latest 代表最新版本,或使用數字 (例如 2)。

對於以檔案路徑形式掛接的密鑰:

resource "google_cloud_run_v2_job" "default" {
  name     = "JOB_NAME"
  location = "REGION"

  template {
    template {
      containers {
        image = "IMAGE_URL"

        volume_mounts {
          name       = "VOLUME_NAME"
          mount_path = "MOUNT_PATH"
        }
      }

      volumes {
        name = "VOLUME_NAME"
        secret {
          secret = "projects/PROJECT_ID/secrets/SECRET_NAME"
        }
      }
    }
  }
}

更改下列內容:

  • JOB_NAME:Cloud Run 工作的名稱。
  • REGION: Google Cloud 區域,例如 europe-west1
  • IMAGE_URL容器映像檔的參照,例如 us-docker.pkg.dev/cloudrun/container/job:latest
  • VOLUME_NAME:任何名稱,例如 my-volume,可以與 SECRET_NAME 相同。
  • MOUNT_PATH:磁碟區的掛接路徑和密鑰的檔案名稱。開頭必須為正斜線,例如 /etc/secrets/dbconfig/password,其中 /etc/secrets/dbconfig/ 是磁碟區的掛接路徑,password 則是密鑰的檔案名稱。
  • PROJECT_ID:建立密鑰的專案 ID。
  • SECRET_NAME:密鑰名稱,例如 mysecret

查看密鑰設定

如要查看 Cloud Run 工作的目前密鑰設定,請按照下列步驟操作:

控制台

  1. 前往 Google Cloud 控制台的 Cloud Run 作業頁面:

    前往 Cloud Run jobs

  2. 按一下感興趣的工作,開啟「工作詳細資料」頁面。

  3. 按一下「查看及編輯工作設定」

  4. 在設定詳細資料中找出密鑰設定。

gcloud

  1. 使用下列指令:

    gcloud run jobs describe JOB_NAME
  2. 在傳回的設定中找出密鑰設定。

不允許的路徑和限制

掛接密鑰時,請注意以下限制:

  • Cloud Run 不允許您在 /dev/proc/sys 或其子目錄中掛接密鑰。
  • Cloud Run 不允許您在同一路徑掛接多個密鑰,因為兩個磁碟區掛接點無法掛接在同一位置。

覆寫目錄

如果密鑰在 Cloud Run 中以磁碟區形式掛接,且磁碟區掛接路徑中的最後一個目錄已存在,則現有目錄中的任何檔案或資料夾都會無法存取。

舉例來說,如果名為 my-secret 的密鑰已掛接至路徑 /etc/app_data,則 app_data 目錄中的所有內容都會遭到覆寫,且只會顯示 /etc/app_data/my-secret 檔案。

為避免覆寫現有目錄中的檔案,請建立新目錄來掛接密鑰,例如 /etc/app_data/secrets,這樣密鑰的掛接路徑就會是 /etc/app_data/secrets/my-secret