OSGi es un elemento fundamental en la pila de tecnología de Adobe Experience Manager (AEM). Se utiliza para controlar los paquetes compuestos de AEM y sus configuraciones.
OSGi proporciona los primitivos estandarizados que permiten construir aplicaciones a partir de componentes pequeños, reutilizables y de colaboración. Estos componentes se pueden componer en una aplicación y se pueden implementar. Esto permite administrar fácilmente los paquetes OSGi, ya que se pueden detener, instalar e iniciar individualmente. Las interdependencias se gestionan automáticamente. Cada componente OSGi está contenido en uno de los distintos paquetes. Para obtener más información, consulte la especificación OSGi.
Puede administrar la configuración de los componentes de OSGi mediante archivos de configuración que formen parte de un proyecto de código de AEM.
Los cambios de configuración se definen en los paquetes de código del proyecto de AEM (ui.apps
) como archivos de configuración (.cfg.json
) en carpetas de configuración específicas del modo de ejecución:
/apps/example/config.<runmode>
El formato de los archivos de configuración OSGi se basa en JSON con el formato .cfg.json
definido por el proyecto Apache Sling.
Las configuraciones de OSGi destinatario los componentes de OSGi a través de su Identidad persistente (PID), que se establece de forma predeterminada en el nombre de clase Java del componente OSGi. Por ejemplo, para proporcionar la configuración OSGi para un servicio OSGi implementado por:
com.example.workflow.impl.ApprovalWorkflow.java
un archivo de configuración OSGi se define en:
/apps/example/config/com.example.workflow.impl.ApprovalWorkflow.cfg.json
siguiendo el formato de configuración cfg.json OSGi.
Versiones anteriores de AEM archivos de configuración OSGi compatibles con diferentes formatos de archivo como .cfg., .config y como definiciones de recursos XML sling:OsgiConfig. Estos formatos se sustituyen por el formato de configuración de OSGi cfg.json.
Las configuraciones de OSGi específicas se pueden dirigir a instancias de AEM específicas mediante modos de ejecución. Para utilizar runmode, cree carpetas de configuración en /apps/example
(donde ejemplo es el nombre del proyecto), en el formato:
/apps/example/config.<author|publish>.<dev|stage|prod>/
Se utilizará cualquier configuración OSGi en dichas carpetas si los modos de ejecución definidos en el nombre de la carpeta de configuración coinciden con los modos de ejecución utilizados por AEM.
Por ejemplo, si AEM utiliza el autor y el dev de los modos de ejecución, se aplicarán los nodos de configuración en /apps/example/config.author/
y /apps/example/config.author.dev/
, mientras que los nodos de configuración en /apps/example/config.publish/
y /apps/example/config.author.stage/
no se aplicarán.
Si se aplican varias configuraciones para el mismo PID, se aplica la configuración con el mayor número de modos de ejecución coincidentes.
La granularidad de esta regla se encuentra en un nivel PID. Esto significa que no puede definir algunas propiedades para el mismo PID en /apps/example/config.author/
y otras más específicas en /apps/example/config.author.dev/
para el mismo PID. La configuración con el mayor número de modos de ejecución coincidentes será efectiva para todo el PID.
Cuando se desarrolla localmente, se puede pasar un parámetro de inicio runmode para dictar qué configuración OSGI de modo de ejecución se utilizará.
Existen tres variedades de valores de configuración OSGi que pueden utilizarse con AEM como Cloud Service.
Valores en línea, que son valores que están codificados en la configuración OSGi y almacenados en Git. Por ejemplo:
{
"connection.timeout": 1000
}
Valores secretos, que son valores que no deben almacenarse en Git por motivos de seguridad. Por ejemplo:
{
"api-key": "$[secret:server-api-key]"
}
Los valores específicos de entorno, que son valores que varían entre los entornos de desarrollo y, por lo tanto, no se pueden definir correctamente como objetivos en el modo de ejecución (ya que hay un solo dev
modo de ejecución en AEM como Cloud Service). Por ejemplo:
{
"url": "$[env:server-url]"
}
Tenga en cuenta que un solo archivo de configuración OSGi puede utilizar cualquier combinación de estos tipos de valores de configuración en forma conjunta. Por ejemplo:
{
"connection.timeout": 1000,
"api-key": "$[secret:server-api-key]",
"url": "$[env:server-url]"
}
El caso común para OSGi utiliza valores de configuración OSGi en línea. Las configuraciones específicas del entorno se utilizan solamente para casos de uso específicos en los que un valor difiere entre entornos de desarrollo.
Las configuraciones específicas de entorno amplían las configuraciones OSGi tradicionales y definidas estáticamente que contienen valores en línea, lo que permite administrar los valores de configuración OSGi externamente mediante la API de Cloud Manager. Es importante comprender cuándo se debe utilizar el enfoque común y tradicional de definir valores en línea y almacenarlos en Git, en lugar de abstraer los valores en configuraciones específicas del entorno.
La siguiente guía indica cuándo utilizar configuraciones no secretas y específicas de entorno secreto:
Los valores de configuración en línea se consideran el método estándar y deben utilizarse cuando sea posible. Las configuraciones en línea proporcionan los beneficios de:
Siempre que se define un valor de configuración OSGi, se realiza un inicio con valores en línea, cualquier configuración sólo selecciona configuraciones secretas o específicas de entorno si es necesario para el caso de uso.
Utilice únicamente configuraciones específicas de entorno ($[env:ENV_VAR_NAME]
) para valores de configuración no secretos cuando los valores varíen entre los entornos de desarrollo. Esto incluye instancias de desarrollo local y cualquier AEM como entornos de desarrollo Cloud Service. Evite utilizar configuraciones no secretas específicas de entorno para AEM como una etapa de Cloud Service o entornos de producción.
AEM como Cloud Service requiere el uso de configuraciones específicas del entorno ($[secret:SECRET_VAR_NAME]
) para cualquier valor de configuración OSGi secreto, como contraseñas, claves de API privadas o cualquier otro valor que no pueda almacenarse en Git por motivos de seguridad.
Utilice configuraciones secretas específicas de entorno para almacenar el valor de los secretos en todos los AEM como entornos de Cloud Service, incluidos el escenario y la producción.
Existen dos maneras de crear nuevas configuraciones de OSGi, como se describe a continuación. El método anterior se utiliza generalmente para configurar componentes OSGi personalizados que tienen propiedades y valores OSGi conocidos por parte del desarrollador, y el último para componentes OSGi proporcionados por AEM.
Los archivos de configuración OSGi con formato JSON se pueden escribir a mano directamente en el proyecto de AEM. Esta es la forma más rápida de crear configuraciones OSGi para componentes OSGi conocidos, y especialmente componentes OSGi personalizados que han sido diseñados y desarrollados por el mismo desarrollador que define las configuraciones. Este método también se puede aprovechar para copiar/pegar y actualizar configuraciones para el mismo componente OSGi en varias carpetas de modo de ejecución.
ui.apps
, busque o cree la carpeta de configuración (/apps/.../config.<runmode>
) que destinatario los modos de ejecución que la nueva configuración OSGi debe aplicar<PID>.cfg.json
. El PID es la identidad persistente del componente OSGi que suele ser el nombre completo de la clase de la implementación del componente OSGi. Por ejemplo:/apps/.../config/com.example.workflow.impl.ApprovalWorkflow.cfg.json
<PID>-<factory-name>.cfg.json
nomenclatura.cfg.json
y defina las combinaciones de clave y valor para los pares de propiedades y valores OSGi, siguiendo el formato de configuración JSON OSGi..cfg.json
La consola web AEM del SDK de AEM Quickstart Jar se puede utilizar para configurar componentes OSGi y exportar configuraciones OSGi como JSON. Esto resulta útil para configurar componentes OSGi proporcionados por AEM cuyas propiedades OSGi y sus formatos de valor pueden no ser bien entendidos por el desarrollador que define las configuraciones OSGi en el proyecto AEM. Tenga en cuenta que el uso de la interfaz de usuario de configuración de la consola web de AEM sí escribe .cfg.json
archivos en el repositorio, por lo que tenga en cuenta esto para evitar un comportamiento inesperado potencial durante el desarrollo local, cuando las configuraciones de OSGi definidas por el AEM proyecto pueden diferir de las configuraciones generadas.
ui.apps
, ubique o cree la carpeta de configuración (/apps/.../config.<runmode>
) que destinatario los modos de ejecución en los que debería aplicarse la nueva configuración de OSGi.<PID>.cfg.json
. El PID es el mismo valor del paso 5..cfg.json
..cfg.json
.Como es de esperar, los valores en línea tienen el formato de pares de nombre-valor estándar, siguiendo la sintaxis estándar JSON. Por ejemplo:
{
"my_var1": "val",
"my_var2": [ "abc", "def" ],
"my_var3": 500
}
La configuración de OSGi debe asignar un marcador de posición para la variable que se va a definir por entorno:
use $[env:ENV_VAR_NAME]
Los clientes solo deben utilizar esta técnica para las propiedades de configuración OSGI relacionadas con su código personalizado; no debe utilizarse para anular la configuración OSGI definida por el Adobe.
La configuración OSGi debe asignar un marcador de posición para el secreto que se va a definir por entorno:
use $[secret:SECRET_VAR_NAME]
Lo siguiente se aplica tanto a los valores de configuración secreta como a los específicos del entorno.
Los nombres de las variables deben seguir las siguientes reglas:
[a-zA-Z_][a-zA-Z_0-9]*
Los valores de las variables no deben superar los 2048 caracteres.
Lo siguiente se aplica tanto a los valores de configuración secreta como a los específicos del entorno.
Si no se establece ningún valor por entorno, en tiempo de ejecución el marcador de posición no se reemplazará ni se dejará en su lugar, ya que no se produjo ninguna interpolación. Para evitarlo, se puede proporcionar un valor predeterminado como parte del marcador de posición con la siguiente sintaxis:
$[env:ENV_VAR_NAME;default=<value>]
Con un valor predeterminado proporcionado, el marcador de posición se reemplazará por el valor por entorno, si se proporciona, o por el valor predeterminado proporcionado.
Lo siguiente se aplica tanto a los valores de configuración secreta como a los específicos del entorno.
Las variables se pueden definir en el entorno local para que el AEM local las recoja en tiempo de ejecución. Por ejemplo, en Linux:
export ENV_VAR_NAME=my_value
Se recomienda escribir una secuencia de comandos bash simple que establezca las variables de entorno utilizadas en las configuraciones y que la ejecute antes de iniciar AEM. Herramientas como https://direnv.net/ ayudan a simplificar este enfoque. Según el tipo de valores, se pueden registrar en la administración de código fuente, si todos los usuarios pueden compartirlos.
Los valores de los secretos se leen de los archivos. Por lo tanto, para cada marcador de posición que utilice un secreto debe crearse un archivo de texto que contenga el valor secreto.
Por ejemplo, si se utiliza $[secret:server_password]
, se debe crear un archivo de texto con el nombre server_password. Todos estos archivos secretos deben almacenarse en el mismo directorio y la propiedad org.apache.felix.configadmin.plugin.interpolation.secretsdir
del marco de trabajo debe configurarse con ese directorio local.
Si una propiedad OSGI requiere valores diferentes para el autor y para la publicación:
config.author
y config.publish
OSGi independientes, tal como se describe en la sección Resolución del modo de ejecución.author_<variablename>
y publish_<variablename>
donde los nombres de las variables son los mismosEn los ejemplos siguientes, supongamos que hay tres entornos dev, además de los entornos de etapa y prod.
Ejemplo 1
La intención es que el valor de la propiedad OSGI my_var1
sea el mismo para stage y prod, pero difiere para cada uno de los 3 entornos dev.
Carpeta | Contenido de myfile.cfg.json |
config |
{ "my_var1": "val", "my_var2": "abc", "my_var3": 500 } |
config.dev |
{ "my_var1" : "$[env:my_var1]" "my_var2": "abc", "my_var3": 500 } |
Ejemplo 2
La intención es que el valor de la propiedad OSGI my_var1
difiera para stage, prod y para cada uno de los 3 entornos dev. Por lo tanto, será necesario llamar a la API de Cloud Manager para establecer el valor de my_var1
para cada env de desarrollo.
Carpeta | Contenido de myfile.cfg.json |
config.stage |
{ "my_var1": "val1", "my_var2": "abc", "my_var3": 500 } |
config.prod |
{ "my_var1": "val2", "my_var2": "abc", "my_var3": 500 } |
config.dev |
{ "my_var1" : "$[env:my_var1]" "my_var2": "abc", "my_var3": 500 } |
Ejemplo 3
El propósito es que el valor de la propiedad OSGi my_var1
sea el mismo para la etapa, la producción y sólo uno de los entornos de desarrollo, pero difiera para los otros dos entornos de desarrollo. En este caso, será necesario llamar a la API de Cloud Manager para establecer el valor de my_var1
para cada uno de los entornos de desarrollo, incluso para el entorno de desarrollo que debería tener el mismo valor que stage y production. No heredará el valor establecido en la carpeta config.
Carpeta | Contenido de myfile.cfg.json |
config |
{ "my_var1": "val1", "my_var2": "abc", "my_var3": 500 } |
config.dev |
{ "my_var1" : "$[env:my_var1]" "my_var2": "abc", "my_var3": 500 } |
Otra manera de lograrlo sería establecer un valor predeterminado para el token de reemplazo en la carpeta config.dev de manera que sea el mismo valor que en la carpeta config.
Carpeta | Contenido de myfile.cfg.json |
config |
{ "my_var1": "val1", "my_var2": "abc", "my_var3": 500 } |
config.dev |
{ "my_var1": "$[env:my_var1;default=val1]" "my_var2": "abc", "my_var3": 500 } |
Consulte esta página acerca de cómo se debe configurar la API.
Asegúrese de que la API de Cloud Manager utilizada ha asignado la función "Administrador de implementación - Cloud Service". Otros roles no pueden ejecutar todos los comandos de abajo.
Al llamar a la API, se implementarán las nuevas variables y valores en un entorno de Cloud, de forma similar a un flujo de implementación de código de cliente habitual. Los servicios de creación y publicación se reiniciarán y harán referencia a los nuevos valores, tardando normalmente unos minutos.
PATCH /program/{programId}/environment/{environmentId}/variables
]
{
"name" : "MY_VAR1",
"value" : "plaintext value",
"type" : "string" <---default
},
{
"name" : "MY_VAR2",
"value" : "<secret value>",
"type" : "secretString"
}
]
Tenga en cuenta que las variables predeterminadas no se configuran mediante API, sino en la propiedad OSGi misma.
Consulte esta página para obtener más información.
GET /program/{programId}/environment/{environmentId}/variables
Consulte esta página para obtener más información.
PATCH /program/{programId}/environment/{environmentId}/variables
Para eliminar una variable, inclúyala con un valor vacío.
Consulte esta página para obtener más información.
$ aio cloudmanager:list-environment-variables ENVIRONMENT_ID
Name Type Value
MY_VAR1 string plaintext value
MY_VAR2 secretString ****
$ aio cloudmanager:set-environment-variables ENVIRONMENT_ID --variable MY_VAR1 "plaintext value" --secret MY_VAR2 "some secret value"
$ aio cloudmanager:set-environment-variables ENVIRONMENT_ID --delete MY_VAR1 MY_VAR2
Consulte esta página para obtener más información sobre cómo configurar valores mediante el complemento Cloud Manager para Adobe I/O CLI.
Se pueden declarar hasta 200 variables por entorno.
Debido a que los valores de configuración específicos de entorno y secreto residen fuera de Git y, por lo tanto, no forman parte del AEM formal como mecanismos de implementación de Cloud Service, el cliente debe administrar, gobernar e integrar en el AEM como proceso de implementación de Cloud Service.
Como se ha mencionado anteriormente, llamar a la API implementará las nuevas variables y valores en entornos de nube, de forma similar a un flujo de implementación de código de cliente habitual. Los servicios de creación y publicación se reiniciarán y harán referencia a los nuevos valores, tardando normalmente unos minutos. Tenga en cuenta que las puertas y pruebas de calidad que ejecuta Cloud Manager durante una implementación de código normal no se realizan durante este proceso.
Normalmente, los clientes llamaban a la API para establecer variables de entorno antes de implementar código que dependa de ellas en Cloud Manager. En algunas situaciones, es posible que se desee modificar una variable existente después de que el código ya se haya implementado.
Tenga en cuenta que la API puede no tener éxito cuando se está utilizando una canalización, ya sea una actualización AEM o una implementación del cliente, según la parte de la canalización de extremo a extremo que se esté ejecutando en ese momento. La respuesta de error indicará que la solicitud no se realizó correctamente, aunque no indicará el motivo específico.
Es posible que haya situaciones en las que la implementación de código de cliente programado dependa de variables existentes para tener nuevos valores, lo que no sería apropiado con el código actual. Si esto es un problema, se recomienda realizar modificaciones variables de manera aditiva. Para ello, cree nuevos nombres de variables en lugar de simplemente cambiar el valor de variables antiguas, de modo que el código antiguo nunca haga referencia al nuevo valor. Luego, cuando la nueva versión del cliente se vea estable, se puede optar por eliminar los valores anteriores.
Del mismo modo, como los valores de una variable no tienen versiones, una reversión del código podría hacer que haga referencia a valores más recientes que causen problemas. La estrategia de variables aditivas antes mencionada también sería útil en este caso.
Esta estrategia de variable aditiva también es útil para situaciones de recuperación ante desastres en las que si se necesita reimplementar el código de varios días antes de que sea necesario, los nombres y valores de las variables a los que hace referencia seguirán intactos. Esto depende de una estrategia en la que un cliente espera unos días antes de eliminar esas variables antiguas; de lo contrario, el código anterior no tendría las variables adecuadas a las que hacer referencia.