Configura secretos para trabajos

Es posible que tu trabajo requiera claves de API, contraseñas, certificados o cualquier otra información sensible para sus dependencias. En el caso de Cloud Run, Google recomienda almacenar esta información sensible en un secreto que crees en Secret Manager.

Puedes hacer que un secreto esté disponible para tus contenedores de una de las siguientes maneras:

  • Cuando activas cada secreto como un volumen, Cloud Run lo pone a disposición del contenedor como archivos. Cuando se lee un volumen, Cloud Run siempre recupera el valor del secreto de Secret Manager para usar el valor 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 latest como la versión.

Para obtener más información, consulta las prácticas recomendadas de Secret Manager.

Cómo se verifican los secretos en la implementación y el entorno de ejecución

Durante la creación del trabajo, Cloud Run verifica todos los secretos que usas. La verificación garantiza que la cuenta de servicio que ejecuta el contenedor tenga permiso para acceder a estos secretos.

Durante el tiempo de ejecución, cuando se inician las instancias:

  • Si el secreto es una variable de entorno, Cloud Run recupera su valor antes de iniciar la instancia. Si falla el proceso de recuperación de secretos, la instancia no se inicia.
  • Si activas el secreto como un volumen, Cloud Run no 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 Secret, los intentos de leer el volumen activado fallarán.

Propiedad del volumen

La propiedad de un volumen secreto de Cloud Run difiere según el entorno de ejecución y el tipo de implementación.

Cuando activas un volumen de Secret con el entorno de ejecución de segunda generación, que es siempre el caso de los trabajos, la raíz es propietaria del volumen.

Antes de comenzar

  1. Habilitar la API de Secret Manager.

    Roles necesarios para habilitar las APIs

    Para habilitar las APIs, necesitas el rol de IAM de administrador de Service Usage (roles/serviceusage.serviceUsageAdmin), que contiene el permiso serviceusage.services.enable. Obtén más información para otorgar roles.

    Habilitar la API

  2. Usa un secreto existente o crea uno en Secret Manager, como se describe en Crea un secreto.

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:

Para permitir que Cloud Run acceda al Secret, la identidad del servicio debe tener el siguiente rol:

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 los roles de IAM de Cloud Run y los permisos de IAM de Cloud Run. Si tu trabajo de Cloud Run interactúa con lasGoogle Cloud APIs, como las bibliotecas cliente de Cloud, consulta la guía de configuración de identidades del servicio. Para obtener más información sobre cómo otorgar roles, consulta los permisos de implementación y cómo administrar el acceso.

Haz que Cloud Run tenga acceso a un Secret

Puedes hacer que un Secret sea accesible para tu trabajo con la Google Cloud consola, Google Cloud CLI o YAML:

Console

  1. En la consola de Google Cloud , ve a la página Trabajos de Cloud Run:

    Ir a Cloud Run

  2. Haz clic en Implementar contenedor para configurar un trabajo nuevo. Completa la página de configuración del trabajo inicial y, luego, haz clic en Contenedores, Herramientas de redes, Seguridad para expandir la página de configuración.

  3. Si quieres configurar un trabajo existente, haz clic en el trabajo y, luego, en Ver y editar la configuración del trabajo.

  4. Sigue los pasos para activar el secreto como un volumen o exponerlo como una variable de entorno.

  • Para exponer el secreto como una variable de entorno, haz lo siguiente:

    1. Haz clic en la pestaña Contenedores.
    2. En la pestaña Variables y Secrets, haz clic en Hacer referencia a un Secret.
    3. En el campo Name 1, ingresa el nombre de la variable de entorno.
    4. En la lista Secret, selecciona el secreto que quieres usar.
    5. En la lista Versión 1, selecciona la versión del secreto al que deseas hacer referencia.
    6. Haz clic en Listo.
    7. Haz clic en Crear o Implementar.
  • Para activar el secreto como un volumen, sigue estos pasos:

    1. Haz clic en la pestaña Volúmenes.
    2. Haz clic en Volumen de activación.
    3. Haz clic en Secreto.
    4. En el campo Ruta de activación, ingresa la ruta de activación para este Secret. Este es el directorio en el que se encuentran todas las versiones de tu secreto.
    5. En la lista Secret, selecciona el secreto que quieres usar.
    6. En el campo Ruta 1, ingresa el nombre del archivo que deseas activar.
    7. 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.
    8. Haz clic en Guardar.
    9. Haz clic en Crear o Implementar.

gcloud

  • Para especificar el Secret en una variable de entorno cuando crees un trabajo nuevo, haz lo siguiente:

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

    Reemplaza lo siguiente:

    • JOB_NAME: el nombre de tu trabajo.
    • ENV_VAR_NAME: Es el nombre de la variable de entorno que se usará para el secreto.
    • SECRET_NAME: Es el nombre del secreto en el mismo proyecto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.

    Puedes especificar varios pares de variables entorno y Secret mediante una lista delimitada por comas.

  • Para especificar el Secret en una variable de entorno cuando actualices un trabajo, haz lo siguiente:

    gcloud run jobs update JOB_NAME \
    --set-secrets ENV_VAR_NAME=SECRET_NAME:VERSION
  • Para activar el Secret como un volumen cuando creas un trabajo, haz lo siguiente:

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

    Reemplaza lo siguiente:

    • JOB_NAME: el nombre de tu trabajo.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: Es 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: Es el nombre del secreto en el mismo proyecto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.
  • Para actualizar un Secret en un trabajo existente, haz lo siguiente:

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

YAML

Debido a las restricciones en torno a la compatibilidad de la API, las ubicaciones del secreto deben almacenarse en una anotación.

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run jobs describe JOB_NAME --format export > job.yaml
  2. Para los secretos expuestos como variables de entorno:

    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 

    Reemplaza lo siguiente:

    • JOB: el nombre de tu trabajo.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.
    • SECRET_LOOKUP_NAME: Cualquier nombre que tenga una sintaxis de nombre de secreto válida, por ejemplo, my-secret. Puede ser igual que SECRET_NAME.
  3. Para los secretos activados como rutas de acceso de archivo:

    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

    Reemplaza lo siguiente:

    • JOB_NAME: el nombre de tu trabajo.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: Es 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: Es el número del proyecto en el que se creó el secreto.
    • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.
    • SECRET_LOOKUP_NAME: Cualquier nombre que tenga una sintaxis de nombre de secreto válida, por ejemplo, my-secret. Puede ser igual que SECRET_NAME.
    • VOLUME_NAME: Cualquier nombre, por ejemplo, my-volume. Puede ser igual a la de SECRET_NAME.

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Agrega lo siguiente a un recurso google_cloud_run_v2_job en tu configuración de Terraform:

Para los secretos expuestos como variables de entorno, haz lo siguiente:

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"
            }
          }
        }
      }
    }
  }
}

Reemplaza lo siguiente:

  • JOB_NAME por el nombre del trabajo de Cloud Run.
  • REGION: La Google Cloud región Por ejemplo, europe-west1.
  • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
  • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.

Para los secretos activados como rutas de acceso a archivos, haz lo siguiente:

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"
        }
      }
    }
  }
}

Reemplaza lo siguiente:

  • JOB_NAME por el nombre del trabajo de Cloud Run.
  • REGION: La Google Cloud región Por ejemplo, europe-west1.
  • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • VOLUME_NAME: Cualquier nombre, por ejemplo, my-volume. Puede ser igual a la de SECRET_NAME.
  • MOUNT_PATH: Es 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: Es el nombre del secreto, por ejemplo, mysecret.

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. En la consola de Google Cloud , ve a la página Trabajos de Cloud Run:

    Ir a Cloud Run

  2. Haz clic en Implementar contenedor para configurar un trabajo nuevo. Completa la página de configuración del trabajo inicial y, luego, haz clic en Contenedores, Herramientas de redes, Seguridad para expandir la página de configuración.

  3. Si quieres configurar un trabajo existente, haz clic en el trabajo y, luego, en Ver y editar la configuración del trabajo.

  4. Sigue los pasos para activar el secreto como un volumen o exponerlo como una variable de entorno.

  • Para exponer el secreto como una variable de entorno, haz lo siguiente:

    1. Haz clic en la pestaña Contenedores.
    2. En la pestaña Variables y Secrets, haz clic en Hacer referencia a un Secret.
    3. En el campo Name 1, ingresa el nombre de la variable de entorno.
    4. En la lista Secret, haz clic en Ingresar Secret manualmente.
    5. Ingresa el ID de recurso del secreto en el siguiente formato:

      projects/PROJECT_NUMBER/secrets/SECRET_NAME
      

      Reemplaza lo siguiente:

      • PROJECT_NUMBER por el número de tu 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 secreto en Secret Manager.

    6. En la lista Versión 1, selecciona la versión del secreto al que deseas hacer referencia.

    7. Haz clic en Listo.

    8. Haz clic en Crear o Implementar.

  • Para activar el secreto como un volumen, sigue estos pasos:

    1. Haz clic en la pestaña Volúmenes.
    2. Haz clic en Volumen de activación.
    3. Haz clic en Secreto.
    4. En el campo Ruta de activación, ingresa la ruta de activación para este Secret. Este es el directorio en el que se encuentran todas las versiones de tu secreto.
    5. En la lista Secret, haz clic en Ingresar Secret manualmente.
    6. Ingresa el ID de recurso del secreto en el siguiente formato:

      projects/PROJECT_NUMBER/secrets/SECRET_NAME
      

      Reemplaza lo siguiente:

      • PROJECT_NUMBER por el número de tu 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 secreto en Secret Manager.

    7. En el campo Ruta 1, ingresa el nombre del archivo que deseas activar.

    8. 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.

    9. Haz clic en Guardar.

    10. Haz clic en Crear o Implementar.

gcloud

  • Para activar un Secret como volumen cuando actualizas un trabajo, haz lo siguiente:

    gcloud run jobs update JOB_NAME \
    --image IMAGE_URL \
    --update-secrets=PATH=projects/PROJECT_NUMBER/secrets/SECRET_NAME:VERSION
    • JOB_NAME: el nombre de tu trabajo.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: Es 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: Es el número del proyecto en el que se creó el secreto.
    • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.

YAML

  1. Si creas un trabajo nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run jobs describe JOB_NAME --format export > job.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: 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 

    Reemplaza lo siguiente:

    • JOB: el nombre de tu trabajo.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.
    • PROJECT_NUMBER: Es el número del proyecto en el que se creó el secreto.
    • SECRET_LOOKUP_NAME: Cualquier nombre que tenga una sintaxis de nombre de secreto válida, por ejemplo, my-secret. Puede ser igual que SECRET_NAME.
  2. Para los secretos activados como rutas de acceso de archivo:

    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

    Reemplaza lo siguiente:

    • JOB_NAME: el nombre de tu trabajo.
    • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
    • PATH: Es 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: Es el número del proyecto en el que se creó el secreto.
    • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
    • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.
    • SECRET_LOOKUP_NAME: Cualquier nombre que tenga una sintaxis de nombre de secreto válida, por ejemplo, my-secret. Puede ser igual a SECRET_NAME.
    • VOLUME_NAME: Cualquier nombre, por ejemplo, my-volume. Puede ser el mismo que SECRET_NAME.

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Agrega lo siguiente a un recurso google_cloud_run_v2_job en tu configuración de Terraform:

Para los secretos expuestos como variables de entorno, haz lo siguiente:

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"
            }
          }
        }
      }
    }
  }
}

Reemplaza lo siguiente:

  • JOB_NAME por el nombre del trabajo de Cloud Run.
  • REGION: La Google Cloud región Por ejemplo, europe-west1.
  • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.
  • PROJECT_ID: Es el ID del proyecto en el que se creó el secreto.
  • VERSION: Es la versión del secreto. Usa latest para la versión más reciente o un número, por ejemplo, 2.

Para los secretos activados como rutas de acceso a archivos, haz lo siguiente:

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"
        }
      }
    }
  }
}

Reemplaza lo siguiente:

  • JOB_NAME por el nombre del trabajo de Cloud Run.
  • REGION: La región Google Cloud , por ejemplo,europe-west1.
  • IMAGE_URL: Es una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/job:latest.
  • VOLUME_NAME: Cualquier nombre, por ejemplo, my-volume. Puede ser el mismo que SECRET_NAME.
  • MOUNT_PATH: Es 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_ID: Es el ID del proyecto en el que se creó el secreto.
  • SECRET_NAME: Es el nombre del secreto, por ejemplo, mysecret.

Visualiza la configuración de los Secrets

Para ver la configuración actual de los Secrets de tu trabajo de Cloud Run, sigue estos pasos:

Console

  1. En la Google Cloud consola, ve a la página de trabajos de Cloud Run:

    Ir a Trabajos de Cloud Run

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

  3. Haz clic en Ver y editar la configuración del trabajo.

  4. Ubica la configuración de secretos en los detalles de configuración.

gcloud

  1. Usa el siguiente comando:

    gcloud run jobs describe JOB_NAME
  2. Busca la configuración de Secrets en la configuración mostrada.

Limitaciones

En las siguientes secciones, se describen las limitaciones que se aplican al montaje de secretos.

Rutas no permitidas

  • Cloud Run no te permite activar secretos en /dev, /proc y /sys, ni en sus subdirectorios.
  • 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.

Secrets regionales

Cloud Run no admite secrets regionales.

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.