設定工作的密鑰

您的工作可能需要有依附元件,這些依附元件需要 API 金鑰、密碼、憑證或其他機密資訊。對於 Cloud Run,Google 建議您將這類機密資訊儲存在 Secret Manager 中建立的密鑰。

您可以透過下列兩種方式,讓容器使用密鑰:

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

詳情請參閱 Secret Manager 最佳做法文件。

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

建立作業時,系統會檢查所有使用的密鑰 (無論是做為環境變數或掛接為磁碟區),確保用於執行容器的服務帳戶有權存取這些密鑰。如果任何檢查失敗,作業建立就會失敗。

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

  • 如果密鑰是環境變數,系統會在啟動執行個體前擷取密鑰值,因此如果擷取失敗,執行個體就不會啟動。
  • 如果密鑰是掛接為磁碟區,執行個體啟動時不會進行檢查。不過,在執行階段,如果無法存取密鑰,嘗試讀取已掛接的磁碟區就會失敗。

磁碟區擁有權會因執行環境和部署類型而異

使用第二代執行環境 (適用於工作) 掛接 Secret 磁碟區時,該磁碟區會由根目錄擁有。

事前準備

  1. Enable the Secret Manager API.

    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. 按一下「Volumes」(磁碟區) 分頁標籤,然後選取「Add volume」(新增磁碟區)
        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/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • 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/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • 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. 按一下「Volumes」(磁碟區) 分頁標籤,然後選取「Add volume」(新增磁碟區)
        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/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • 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/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • 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/hello:latest。如果您使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址的格式為 LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
    • 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 或其子目錄中掛接密鑰。

如果您要在 /tmp 上掛接密鑰,且使用第一代執行環境,請參閱/tmp 上掛接密鑰的已知問題。

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