Usa Secrets

Es posible que tu servicio tenga dependencias que requieran claves de API, contraseñas o cualquier otra información sensible. Para Cloud Run, Google recomienda que almacenes este tipo de información sensible en un secreto 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. Nota: 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, 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 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.

Permite que Cloud Run acceda a un Secret

Puedes usar un Secret de Secret Manager existente o crear uno nuevo. Sin embargo, para permitir que un servicio de Cloud Run acceda al secreto, debes otorgar la función de descriptor de acceso a secretos de Secret Manager a la cuenta de servicio de Cloud Run:

  1. Ve a la página de Secret Manager en Cloud Console:

  2. Selecciona el Secret y, en la pestaña de permisos del lado derecho, haz clic en Agregar miembro.

  3. En el cuadro de texto Nuevos miembros, ingresa el correo electrónico de la cuenta de servicio para el servicio de Cloud Run.

  4. Otórgale la función Descriptor de acceso a los Secrets de Secret Manager.

Haz que un secreto esté disponible para un servicio

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 Cloud Console, la herramienta de línea de comandos de gcloud o un archivo YAML cuando implementas un servicio nuevo o actualizas un servicio existente y, luego, implementas una revisión:

Console

  1. Ir a Cloud Run

  2. Haz clic en Crear servicio si quieres configurar un servicio nuevo en el que realizarás la implementación. Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Editar e implementar nueva revisión.

  3. Si estás configurando un servicio nuevo, llena la página de configuración inicial del servicio como desees y haz clic en Siguiente > Configuración avanzada para acceder a la página de configuración del servicio.

  4. Haz clic en la pestaña Variables y Secrets.

    image

  5. En la pestaña Variables y Secrets, haz lo siguiente:

    • En Secretos, haz clic en Hacer referencia a un Secret.
    • Selecciona el Secret que quieres usar de la lista desplegable Secret.
    • En el menú desplegable Reference Method (Método de referencia), selecciona la forma en la que deseas usar el Secret, activado como un volumen o expuesto como variables de entorno.
    • Si activas el secreto como un volumen, haz lo siguiente:
      1. En Ruta de activación, especifica la ruta de activación que usas para los Secrets.
      2. De forma predeterminada, se selecciona la versión más reciente. Si lo deseas, puedes seleccionar una versión específica. En Rutas especificadas para las versiones de secretos, especifica la ruta a la versión y su número.
      3. Haga clic en Listo.
    • Si deseas exponer el Secret como una variable de entorno, sigue estos pasos:
      1. Proporciona el Nombre de la variable y selecciona la versión del Secret, o la más reciente, para usar siempre la versión actual del Secret.
      2. Haga clic en Listo.

  6. Haz clic en Crear o Implementar.

Línea de comandos

Para que un servicio sea accesible a tu secreto, ingresa uno de los siguientes comandos.

  • Para activar el secreto como un volumen cuando se implementa un servicio, haz lo siguiente:

    gcloud beta 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 de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
    • 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 y password es el nombre del archivo del Secret.
    • SECRET_NAME por el nombre del Secret
    • VERSION por la versión del Secret Usa latest para la versión más reciente o un número entero, por ejemplo, 2.
  • Para exponer el secreto como una variable de entorno cuando implementas un servicio, haz lo siguiente:

    gcloud beta 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 de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
    • ENV_VAR_NAME por el nombre de la variable de entorno que deseas usar con el Secret
    • SECRET_NAME por el nombre del Secret
    • VERSION por la versión del Secret Usa latest para la versión más reciente o un número entero, por ejemplo, 2.
  • Puedes actualizar varios Secrets a la vez. Separa las opciones de configuración para cada secreto con 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 beta 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 beta run services update SERVICE \
    --set-secrets="ENV_VAR_NAME=SECRET_NAME:VERSION"
    

YAML

Puedes descargar y ver la configuración del servicio existente mediante el comando gcloud run services describe --format export, que genera resultados limpios en formato YAML. Luego, puedes modificar los campos que se describen a continuación y subir el YAML modificado mediante el comando gcloud run services replace. Asegúrate de modificar los campos tal como se indica en la documentación.

  1. Para ver y descargar la configuración:

    gcloud run services describe SERVICE --format export > service.yaml
  2. 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:
        spec:
          containers:
          - image: IMAGE_URL
            env:
            - name: ENV_VAR
              valueFrom:
                secretKeyRef:
                  key: VERSION
                  name: SECRET_NAME
  3. 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:
        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.

  4. Reemplaza el servicio por la configuración nueva mediante el comando siguiente:

    gcloud run services replace service.yaml

Haz referencia a Secrets de otros proyectos

Puedes hacer referencia a un secreto desde otro proyecto, si la cuenta de servicio de tu proyecto tiene permiso para acceder al Secret.

Console

  1. Ir a Cloud Run

  2. Haz clic en Crear servicio si quieres configurar un servicio nuevo en el que realizarás la implementación. Si quieres configurar un servicio existente, haz clic en el servicio y, luego, en Editar e implementar nueva revisión.

  3. Si estás configurando un servicio nuevo, llena la página de configuración inicial del servicio como desees y haz clic en Siguiente > Configuración avanzada para acceder a la página de configuración del servicio.

  4. Haz clic en la pestaña Variables y Secrets.

    image

  5. En la pestaña Variables y Secrets, haz lo siguiente:

    • En Secretos, haz clic en Hacer referencia a un Secret.
    • Selecciona ¿No ves tu Secret? Ingresa el ID del recurso del Secret de la lista desplegable Secreto para mostrar el siguiente formulario:

      Secrets de proyecto cruzado

    • En el formulario Agregar un Secret por ID de recurso, ingresa el Secret del otro proyecto, en el formato projects/PROJECT_NUMBER/secrets/SECRET_NAME. De manera alternativa, puedes copiar y pegar el ID de recurso del otro proyecto si tienes acceso a él. Para ello, selecciona el Secret y haz clic en los puntos suspensivos Actions a la derecha del secreto. Selecciona Copiar ID del recurso en el menú desplegable.
    • Haz clic en Agregar Secret.
    • En el menú desplegable Reference Method (Método de referencia), selecciona la forma en la que deseas usar el Secret, activado como un volumen o expuesto como variables de entorno.
    • Si activas el secreto como un volumen, haz lo siguiente:
      1. En Ruta de activación, especifica la ruta de activación que usas para los Secrets.
      2. De forma predeterminada, se selecciona la versión más reciente. Si lo deseas, puedes seleccionar una versión específica. En Rutas especificadas para las versiones de secretos, especifica la ruta a la versión y su número.
      3. Haga clic en Listo.
    • Si deseas exponer el Secret como una variable de entorno, sigue estos pasos:
      1. Proporciona el Nombre de la variable y selecciona la versión del Secret, o la más reciente, para usar siempre la versión actual del Secret.
      2. Haga clic en Listo.

  6. Haz clic en Crear o Implementar.

Línea de comandos

  • Para activar el Secret como un volumen cuando se implementa un servicio, haz lo siguiente:

    gcloud beta run deploy SERVICE --image IMAGE_URL  \
    --update-secrets=PATH=project/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION

    Reemplaza lo siguiente:

    • SERVICE por el nombre de tu servicio
    • IMAGE_URL por una referencia a la imagen de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
    • 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 y password es el nombre del archivo del Secret.
    • PROJECT_NUMBER por el número del proyecto en el que se creó el Secret
    • SECRET_NAME por el nombre del Secret
    • VERSION por la versión del Secret Usa latest para la versión más reciente o un número entero, por ejemplo, 2.

Visualiza la configuración de Secrets

Para ver la configuración de Secrets actual de tu servicio, haz lo siguiente:

Console

  1. Ir a Cloud Run

  2. Haz clic en el servicio que te interesa para abrir la página Detalles del servicio.

  3. Haz clic en la pestaña Revisiones (Revisions).

  4. En el panel de detalles a la derecha, la configuración de los secretos aparece en la pestaña Variables y Secrets.

Línea de comandos

  1. Usa el siguiente comando:

    gcloud run services describe SERVICE
  2. Busca la configuración de Secrets en la configuración mostrada.

YAML

Puedes descargar y ver la configuración del servicio existente mediante el comando gcloud run services describe --format export, que genera resultados limpios en formato YAML. Luego, puedes modificar los campos que se describen a continuación y subir el YAML modificado mediante el comando gcloud run services replace. Asegúrate de modificar los campos tal como se indica en la documentación.

  1. Para ver y descargar la configuración:

    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.

  1. Para los secretos expuestos como variables de entorno:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
          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 de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
    • ENV_VAR
    • PROJECT_NUMBER por el número del proyecto en el que se creó el Secret
    • SECRET_NAME por el nombre del Secret
    • VERSION por la versión del Secret Usa latest para la versión más reciente o un número entero, por ejemplo, 2.
    • SECRET_LOOKUP_NAME por cualquier nombre que tenga una sintaxis de nombre secreto válida (p.ej., my-secret), puede ser igual a SECRET_NAME
  2. Para los secretos activados como rutas de acceso de archivo:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
          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 de contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest
    • 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 y password es el nombre del archivo del Secret.
    • PROJECT_NUMBER por el número del proyecto en el que se creó el Secret
    • SECRET_NAME por el nombre del Secret
    • VERSION por la versión del Secret Usa latest para la versión más reciente o un número entero, por ejemplo, 2.
    • SECRET_LOOKUP_NAME por cualquier nombre que tenga una sintaxis de nombre secreto válida (p.ej., my-secret), puede ser igual a SECRET_NAME
    • VOLUME_NAME con cualquier nombre (p.ej., my-volume), puede ser igual a SECRET_NAME

Usa Secrets 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.