Es posible que tu servicio deba tener dependencias que requieran claves de API, contraseñas, certificados o cualquier otra información sensible. Para Cloud Run, Google recomienda que almacenes este tipo de información sensible en un Secret creado en Secret Manager.
Puedes hacer que un Secret esté disponible para los contenedores de dos maneras:
- Activa cada Secret como un volumen, lo que hace que el Secret esté disponible para el contenedor como archivos. La lectura de un volumen siempre recupera el valor del Secret de Secret Manager, de modo que se puede usar con la versión más reciente. Este método también funciona bien con la rotación de Secrets.
- Pasa un secreto mediante variables de entorno. Las variables de entorno se resuelven en el momento del inicio de la instancia, por lo que si usas este método, Google te recomienda fijar el secreto en una versión específica en lugar de usar la versión más reciente.
Para obtener más información, consulta el documento Prácticas recomendadas de Secret Manager.
Cómo se verifican los secretos en la implementación y el entorno de ejecución
Durante la implementación del servicio, se verifican todos los secretos en uso, ya sea como variables de entorno o activados como un volumen, para garantizar que la cuenta de servicio que se usa en la ejecución del contenedor tenga acceso a ellos. Si alguna verificación falla, la implementación del servicio falla.
Durante el tiempo de ejecución, cuando se inician las instancias:
- Si el secreto es una variable de entorno, su valor se recupera antes de iniciar la instancia, por lo que si se recuperan los secretos, la instancia no se inicia.
- Si el secreto se activa como un volumen, no se realiza ninguna verificación durante el inicio de la instancia. Sin embargo, durante el tiempo de ejecución, si no se puede acceder a un secreto, los intentos de leer el volumen activado fallarán.
La propiedad del volumen difiere según el entorno de ejecución y el tipo de implementación
Cuando activas un volumen secreto, la identidad que posee los archivos y directorios difiere según el entorno de ejecución de la carga de trabajo y si la implementación consta de uno o varios contenedores.
En el entorno de ejecución de primera generación en el que implementas un solo contenedor, el volumen secreto es propiedad de la identidad que se usa para el contenedor. En todos los demás casos, el volumen es propiedad de la raíz. Esto incluye lo siguiente:
- Entorno de ejecución de primera generación en el que implementas varios contenedores
- El entorno de segunda generación
Antes de comenzar
-
Enable the Secret Manager API.
- Usa un secreto existente o crea uno en Secret Manager, como se describe en Crea un Secret.
Roles obligatorios
Para obtener los permisos que necesitas para configurar los objetos Secret, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Administrador de Cloud Run (
roles/run.admin
) en el servicio de Cloud Run -
Usuario de la cuenta de servicio (
roles/iam.serviceAccountUser
) en la identidad del servicio
Para permitir que Cloud Run acceda al Secret, la identidad del servicio debe tener el siguiente rol:
- Descriptor de acceso de secretos de Secret Manager (
roles/secretmanager.secretAccessor
)
Si deseas obtener instrucciones para agregar el principal de identidad del servicio al rol de descriptor de acceso a secretos de Secret Manager, consulta Administra el acceso a los objetos Secret.
Para obtener una lista de los roles y los permisos de IAM asociados con Cloud Run, consulta Roles de IAM de Cloud Run y Permisos de IAM de Cloud Run. Si tu servicio de Cloud Run interactúa con las APIs de Google Cloud, como las bibliotecas cliente de Cloud, consulta la guía de configuración de identidades del servicio. Para obtener más información acerca de cómo otorgar roles, consulta Permisos de implementación y Administra el acceso.
Haz que Cloud Run tenga acceso a un Secret
Cualquier cambio en la configuración conlleva la creación de una revisión nueva. Las revisiones posteriores también adoptarán esta configuración de manera automática, a menos que realices actualizaciones explícitas para cambiarla.
Puedes hacer que un servicio sea accesible para tu servicio con la consola de Google Cloud, Google Cloud CLI o un archivo de YAML cuando implementas un servicio nuevo o actualizas un servicio existente y, luego, implementas una revisión. Haz clic en la pestaña que elijas:
Console
En la consola de Google Cloud ve a Cloud Run:
Haz clic en Implementar contenedor y selecciona Servicio para configurar un servicio nuevo. Completa la página de configuración inicial del servicio y, luego, haz clic en Contenedores, volúmenes, herramientas de redes y seguridad para expandir la página de configuración del servicio.
Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Implementar y editar una nueva revisión.
Sigue los pasos para activar el Secret como un volumen o exponerlo como una variable de entorno.
Para activar el Secret como un volumen, sigue estos pasos:
- Haz clic en la pestaña Volúmenes y selecciona Agregar volumen.
- En la lista Tipo de volumen, selecciona Secreto.
- En el campo Nombre del volumen, ingresa un nombre o acepta el nombre predeterminado.
- En la lista Secret, selecciona el Secret que quieres usar.
- En el campo Ruta de acceso 1, ingresa el nombre del archivo que deseas activar.
- En la lista Versión 1, selecciona la versión del Secret que deseas consultar. De forma predeterminada, se selecciona la versión más reciente. Si lo deseas, puedes seleccionar una versión específica.
- Haz clic en Listo.
- Navega a la pestaña Contenedor para activar el secreto en el contenedor.
- En la pestaña Activaciones de volumen, haz clic en Volumen de activación.
- En la lista Nombre 1, selecciona el nombre de tu volumen.
- En el campo Ruta de activación 1, ingresa la ruta de activación para este Secret. Este es el directorio en el que se encuentran todas las versiones de tu Secret.
- Haz clic en Listo.
- Haz clic en Crear o Implementar.
Para exponer el Secret como una variable de entorno, haz lo siguiente:
- Haz clic en la pestaña Contenedor.
- En la pestaña Variables y Secrets, haz clic en Hacer referencia a un Secret.
- En el campo Name 1, ingresa el nombre de la variable de entorno.
- En la lista Secret, selecciona el Secret que quieres usar.
- En la lista Versión 1, selecciona la versión del Secret que deseas consultar.
- Haz clic en Listo.
- Haz clic en Crear o Implementar.
gcloud
Para que un servicio sea accesible a tu Secret, ingresa uno de los siguientes comandos.
Para activar el secreto como un volumen cuando se implementa un servicio, haz lo siguiente:
gcloud run deploy SERVICE --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION
Reemplaza lo siguiente:
SERVICE
por el nombre de tu servicio- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. PATH
por la ruta de activación del volumen y el nombre de archivo del Secret Debe comenzar con una barra inicial, por ejemplo:/etc/secrets/dbconfig/password
, donde/etc/secrets/dbconfig/
es la ruta de activación del volumen ypassword
es el nombre del archivo del Secret.SECRET_NAME
por el nombre secreto en el mismo proyecto, p. ej.,mysecret
.VERSION
por la versión del Secret Usalatest
para la versión más reciente o un número, por ejemplo,2
.
Para exponer el secreto como una variable de entorno cuando implementas un servicio, haz lo siguiente:
gcloud run deploy SERVICE \ --image IMAGE_URL \ --update-secrets=ENV_VAR_NAME=SECRET_NAME:VERSION
Reemplaza lo siguiente:
SERVICE
por el nombre de tu servicio- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. ENV_VAR_NAME
por el nombre de la variable de entorno que deseas usar con el SecretSECRET_NAME
por el nombre secreto en el mismo proyecto, p. ej.,mysecret
.VERSION
por la versión del Secret Usalatest
para la versión más reciente o un número, por ejemplo,2
.
Puedes actualizar varios Secrets al mismo tiempo. Para ello, separa las opciones de configuración de cada secreto mediante una coma. Con el siguiente comando, se actualiza un secreto activado como un volumen y otro expuesto como una variable de entorno.
Para actualizar los secretos existentes, ingresa el siguiente comando:
gcloud run deploy SERVICE --image IMAGE_URL \ --update-secrets=PATH=SECRET_NAME:VERSION,ENV_VAR_NAME=SECRET_NAME:VERSION
Si deseas borrar los secretos existentes y hacer que un servicio nuevo sea accesible para el servicio, usa la marca
--set-secrets
:gcloud run services update SERVICE \ --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
YAML
Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:
gcloud run services describe SERVICE --format export > service.yaml
Para los Secrets expuestos como variables de entorno, en
env
, actualiza ENV_VAR, VERSION o SECRET_NAME según lo desees. Si tienes varios Secrets activados como variables de entorno, tendrás varios de estos atributos.apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: name: REVISION spec: containers: - image: IMAGE_URL env: - name: ENV_VAR valueFrom: secretKeyRef: key: VERSION name: SECRET_NAME
Para los Secrets activados como rutas de acceso a archivos, actualiza MOUNT_PATH, VOLUME_NAME, VERSION, FILENAME o SECRET_NAME según lo desees. Si tienes varios Secrets activados como rutas de archivo, tendrás varios de estos atributos.
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: name: REVISION spec: containers: - image: IMAGE_URL volumeMounts: - mountPath: MOUNT_PATH name: VOLUME_NAME volumes: - name: VOLUME_NAME secret: items: - key: VERSION path: FILENAME secretName: SECRET_NAME
Ten en cuenta que
VOLUME_NAME
se puede establecer en cualquier nombre.Reemplazar
- SERVICE por el nombre del servicio de Cloud Run
- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - REVISION por un nombre de revisión nuevo o bórralo (si está presente). Si proporcionas un nuevo nombre de revisión, debe cumplir con los siguientes criterios:
- Comienza con
SERVICE-
- Solo contiene letras minúsculas, números y
-
- No termina con
-
- No supera los 63 caracteres
- Comienza con
Reemplaza el servicio por la configuración nueva mediante el siguiente comando:
gcloud run services replace service.yaml
Terraform
Crea un secreto y una versión de secreto.
Crea una cuenta de servicio y otórgale acceso al secreto:
Se puede acceder a los secretos de Secret Manager desde Cloud Run como rutas de archivos activadas o como variables de entorno.
Para los secretos activados como rutas de acceso a archivos, haz referencia al recurso de Secret Manager en el parámetro
volumes
. Elname
corresponde a una entrada en el parámetrovolume_mounts
:Para los secretos expuestos como variables de entorno, haz referencia al recurso de Secret Manager en el parámetro
env
:
Cómo hacer referencia a Secrets de otros proyectos
Para hacer referencia a un Secret de otro proyecto, verifica que la cuenta de servicio de tu proyecto tenga acceso al Secret.
Console
En la consola de Google Cloud ve a Cloud Run:
Haz clic en Implementar contenedor y selecciona Servicio para configurar un servicio nuevo. Completa la página de configuración inicial del servicio y, luego, haz clic en Contenedores, volúmenes, herramientas de redes y seguridad para expandir la página de configuración del servicio.
Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Implementar y editar una nueva revisión.
Sigue los pasos para activar el Secret como un volumen o exponerlo como una variable de entorno.
Para activar el Secret como un volumen, sigue estos pasos:
- Haz clic en la pestaña Volúmenes y selecciona Agregar volumen.
- En la lista Tipo de volumen, selecciona Secreto.
- En el campo Nombre del volumen, ingresa un nombre o acepta el nombre predeterminado.
- En la lista Secret, haz clic en Ingresar Secret manualmente.
Ingresa el ID de recurso del Secret en el siguiente formato:
projects/PROJECT_NUMBER/secrets/SECRET_NAME
Reemplaza lo siguiente:
PROJECT_NUMBER por tu número de proyecto de Google Cloud Para obtener instrucciones detalladas sobre cómo encontrar el número de tu proyecto, consulta Crea y administra proyectos.
SECRET_NAME: Es el nombre del Secret en Secret Manager.
En el campo Ruta de acceso 1, ingresa el nombre del archivo que deseas activar.
En la lista Versión 1, selecciona la versión del Secret que deseas consultar. De forma predeterminada, se selecciona la versión más reciente. Si lo deseas, puedes seleccionar una versión específica.
Haz clic en Listo.
Navega a la pestaña Contenedor para activar el secreto en el contenedor.
En la pestaña Activaciones de volumen, haz clic en Volumen de activación.
En la lista Nombre 1, selecciona el nombre de tu volumen.
En el campo Ruta de activación 1, ingresa la ruta de activación para este Secret. Este es el directorio en el que se encuentran todas las versiones de tu Secret.
Haz clic en Listo.
Haz clic en Crear o Implementar.
Para exponer el Secret como una variable de entorno, haz lo siguiente:
- Haz clic en la pestaña Contenedor.
- En la pestaña Variables y Secrets, haz clic en Hacer referencia a un Secret.
- En el campo Name 1, ingresa el nombre de la variable de entorno.
- En la lista Secret, haz clic en Ingresar Secret manualmente.
Ingresa el ID de recurso del Secret en el siguiente formato:
projects/PROJECT_NUMBER/secrets/SECRET_NAME
Reemplaza lo siguiente:
PROJECT_NUMBER por tu número de proyecto de Google Cloud Para obtener instrucciones detalladas sobre cómo encontrar el número de tu proyecto, consulta Crea y administra proyectos.
SECRET_NAME: Es el nombre del Secret en Secret Manager.
En la lista Versión 1, selecciona la versión del Secret que deseas consultar.
Haz clic en Listo.
Haz clic en Crear o Implementar.
gcloud
Para activar el Secret como un volumen cuando se implementa un servicio, haz lo siguiente:
gcloud run deploy SERVICE --image IMAGE_URL \ --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
Reemplaza lo siguiente:
SERVICE
por el nombre de tu servicio- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. PATH
por la ruta de activación del volumen y el nombre de archivo del Secret Debe comenzar con una barra inicial, por ejemplo:/etc/secrets/dbconfig/password
, donde/etc/secrets/dbconfig/
es la ruta de activación del volumen ypassword
es el nombre del archivo del Secret.PROJECT_NUMBER
por el número del proyecto en el que se creó el SecretSECRET_NAME
por el nombre del secreto, p. ej.,mysecret
.VERSION
por la versión del Secret Usalatest
para la versión más reciente o un número, por ejemplo,2
.
YAML
Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:
gcloud run services describe SERVICE --format export > service.yaml
Debido a las restricciones en torno a la compatibilidad de la API, las ubicaciones del secreto deben almacenarse en una anotación.
Para los secretos expuestos como variables de entorno:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME spec: containers: - image: IMAGE_URL env: - name: ENV_VAR valueFrom: secretKeyRef: key: VERSION name: SECRET_LOOKUP_NAME
Reemplaza lo siguiente:
SERVICE
por el nombre de tu servicio- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. ENV_VAR
PROJECT_NUMBER
por el número del proyecto en el que se creó el SecretSECRET_NAME
por el nombre del secreto, p. ej.,mysecret
.VERSION
por la versión del Secret Usalatest
para la versión más reciente o un número, por ejemplo,2
.SECRET_LOOKUP_NAME
por cualquier nombre que tenga una sintaxis de nombre de secreto válida (p. ej.,my-secret
). Puede ser igual aSECRET_NAME
Para los secretos activados como rutas de acceso de archivo:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE spec: template: metadata: annotations: run.googleapis.com/secrets: SECRET_LOOKUP_NAME:projects/PROJECT_NUMBER/secrets/SECRET_NAME 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
Reemplaza lo siguiente:
SERVICE
por el nombre de tu servicio- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. PATH
por la ruta de activación del volumen y el nombre de archivo del Secret Debe comenzar con una barra inicial, por ejemplo:/etc/secrets/dbconfig/password
, donde/etc/secrets/dbconfig/
es la ruta de activación del volumen ypassword
es el nombre del archivo del Secret.PROJECT_NUMBER
por el número del proyecto en el que se creó el SecretSECRET_NAME
por el nombre del secreto, p. ej.,mysecret
.VERSION
por la versión del Secret Usalatest
para la versión más reciente o un número, por ejemplo,2
.SECRET_LOOKUP_NAME
por cualquier nombre que tenga una sintaxis de nombre de secreto válida (p. ej.,my-secret
). Puede ser igual aSECRET_NAME
VOLUME_NAME
por cualquier nombre (p. ej.,my-volume
). Puede ser igual aSECRET_NAME
Visualiza la configuración de los Secrets
Para ver la configuración actual de los Secrets del servicio de Cloud Run, sigue estos pasos:
Console
En la consola de Google Cloud ve a Cloud Run:
Haz clic en el servicio que te interesa para abrir la página Detalles del servicio.
Haz clic en la pestaña Revisiones.
En el panel de detalles a la derecha, la configuración de los Secret aparece en la pestaña Contenedor.
gcloud
Usa el siguiente comando:
gcloud run services describe SERVICE
Busca la configuración de Secrets en la configuración mostrada.
Quita secretos de un servicio
Puedes quitar Secrets de un servicio con la consola de Google Cloud o gcloud CLI:
Console
En la consola de Google Cloud ve a Cloud Run:
Selecciona tu servicio de la lista y haz clic en Editar e implementar nueva revisión.
Haz clic en la pestaña Contenedor.
Para borrar secretos activados como volumen, selecciona la pestaña Volume mounts, mantén el puntero sobre el secreto que deseas quitar y, luego, haz clic en
Delete.Para borrar secretos expuestos como una variable de entorno, selecciona la pestaña Variables y Secrets, mantén el puntero sobre el secreto que deseas quitar y, luego, haz clic en
Borrar.Haz clic en Implementar.
gcloud
Puedes quitar todos los Secrets de un servicio o especificar uno o más Secrets para quitarlos:
Para quitar todos los Secrets, ejecuta el siguiente comando:
gcloud run deploy SERVICE --image IMAGE_URL \ --clear-secrets
Reemplaza lo siguiente:
- SERVICE por el nombre de tu servicio
- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
.
Para especificar una lista de Secrets que deseas quitar, usa la marca
--remove-secrets
. Con el siguiente comando, se quita un Secret activado como un volumen y otro expuesto como una variable de entorno.gcloud run deploy SERVICE --image IMAGE_URL \ --remove-secrets=ENV_VAR_NAME,SECRET_FILE_PATH
Reemplaza lo siguiente:
- SERVICE por el nombre de tu servicio
- IMAGE_URL por una referencia a la imagen del contenedor, como
us-docker.pkg.dev/cloudrun/container/hello:latest
Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL tiene el formatoLOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
. - ENV_VAR_NAME: es el nombre de la variable de entorno.
SECRET_FILE_PATH: La ruta completa del Secret. Por ejemplo,
/mnt/secrets/primary/latest
, en el que/mnt/secrets/primary/
es la ruta de activación ylatest
es la ruta del Secret. También puedes especificar las rutas de activación y de Secret por separado:--set-secrets MOUNT_PATH:SECRET_PATH=SECRET:VERSION
Usa secretos en tu código
Para ver ejemplos sobre cómo acceder a los secretos en tu código como variables de entorno, consulta el instructivo sobre la autenticación de usuario final, en especial la sección Maneja la configuración sensible con Secret Manager.
Rutas no permitidas y limitaciones
Cloud Run no te permite activar secretos en /dev
, /proc
y /sys
, ni en sus subdirectorios.
Si activas secretos en /tmp
y usas el entorno de ejecución de primera generación, consulta el problema conocido sobre activar secretos en /tmp
.
Cloud Run no te permite activar varios Secrets en la misma ruta porque dos activaciones de volumen no se pueden activar en la misma ubicación.
Anula un directorio
Si el Secret se activa como un volumen en Cloud Run y el último directorio en la ruta de activación de volumen ya existe, los archivos o las carpetas en del directorio existente se vuelven inaccesibles.
Por ejemplo, si un Secret llamado my-secret
se activa en la ruta de acceso
/etc/app_data
, se reemplazará todo el contenido dentro del directorio app_data
y el único archivo visible es /etc/app_data/my-secret
.
Si deseas evitar reemplazar archivos en un directorio existente, crea un directorio nuevo para
activar el Secret, por ejemplo, /etc/app_data/secrets
, para que la ruta de
activación del Secret sea /etc/app_data/secrets/my-secret
.