Configuración en Tiempo de Ejecución
La configuración en tiempo de ejecución es el mecanismo utilizado por Nx Plugin for AWS para pasar valores en tiempo de despliegue entre proyectos y componentes generados para que puedan conectarse entre sí. Por ejemplo, cuando generas una API, su URL se registra automáticamente en la configuración en tiempo de ejecución para que un sitio web conectado pueda descubrirla.
Cómo Funciona
Sección titulada «Cómo Funciona»La configuración en tiempo de ejecución se organiza en espacios de nombres. Cada espacio de nombres es una agrupación lógica de valores de configuración relacionados. En tiempo de despliegue, todos los espacios de nombres se almacenan en AWS AppConfig como Perfiles de Configuración.
El espacio de nombres connection integrado se utiliza para la configuración que permite que los proyectos generados se conecten entre sí, por ejemplo:
- URLs de API — registradas automáticamente por los constructos de API
- Configuración de Cognito — registrada automáticamente por el constructo UserIdentity
- ARNs de runtime de agentes — registrados automáticamente por los constructos de agentes
El espacio de nombres connection también se despliega como un archivo runtime-config.json en el bucket S3 de tu sitio web, permitiendo el descubrimiento del lado del cliente de los recursos del backend.
Puedes definir tantos espacios de nombres adicionales como desees, proporcionando una alternativa conveniente a las variables de entorno para pasar valores en tiempo de despliegue como nombres de tablas de DynamoDB a tus funciones Lambda u otros recursos de cómputo.
Infraestructura
Sección titulada «Infraestructura»Escribir Configuración
Sección titulada «Escribir Configuración»Los constructos generados escriben automáticamente la configuración relevante en el espacio de nombres connection. También puedes escribir tus propios valores en cualquier espacio de nombres.
El constructo CDK RuntimeConfig es un singleton con ámbito de stage. Usa set() para escribir una clave en un espacio de nombres:
import { RuntimeConfig } from ':my-scope/common-constructs';
const rc = RuntimeConfig.ensure(this);
// Built-in 'connection' namespace (written automatically by generated constructs)rc.set('connection', 'apis', { ...rc.get('connection').apis, MyApi: api.url,});
// Custom namespaces for server-side configurationrc.set('tables', 'users', { tableName: usersTable.tableName, tableArn: usersTable.tableArn,});En tiempo de synth/deploy, RuntimeConfig crea una aplicación de AWS AppConfig que contiene:
- Un Configuration Profile para cada espacio de nombres
- Una Hosted Configuration Version con los datos JSON para cada perfil
- Un Deployment instantáneo al entorno
default
Usa el módulo runtime-config/entry para escribir una clave en un espacio de nombres:
# Writes to the 'connection' namespace (done automatically by generated modules)module "add_api_url" { source = "../../common/terraform/src/core/runtime-config/entry"
namespace = "connection" key = "apis" value = { "MyApi" = module.my_api.api_url }}
# Custom namespace for server-side configurationmodule "add_table_config" { source = "../../common/terraform/src/core/runtime-config/entry"
namespace = "tables" key = "users" value = { tableName = aws_dynamodb_table.users.name arn = aws_dynamodb_table.users.arn }}Luego debes declarar el módulo runtime-config/appconfig para crear los recursos de AppConfig desde todos los archivos de espacios de nombres:
module "appconfig" { source = "../../common/terraform/src/core/runtime-config/appconfig"
application_name = "my-app-runtime-config"
depends_on = [module.add_api_url, module.add_table_config]}Leer Configuración
Sección titulada «Leer Configuración»Los consumidores del lado del servidor necesitan el AppConfig Application ID y permisos IAM para leer la configuración en tiempo de ejecución. Los constructos generados manejan esto automáticamente.
Usa appConfigApplicationId para obtener el AppConfig Application ID, y grantReadAppConfig() para otorgar permisos de lectura:
const rc = RuntimeConfig.ensure(this);
// Get the AppConfig Application ID (lazy token, resolved at synth time)const appId = rc.appConfigApplicationId;
// Pass it as an environment variable to a Lambda functionconst myFunction = new Function(this, 'MyFunction', { // ... environment: { RUNTIME_CONFIG_APP_ID: appId, },});
// Grant the function permission to read from AppConfigrc.grantReadAppConfig(myFunction);Referencia la salida application_id del módulo appconfig para obtener el AppConfig Application ID, y agrega las declaraciones de política IAM apropiadas:
module "appconfig" { source = "../../common/terraform/src/core/runtime-config/appconfig" application_name = "my-app-runtime-config"}
# Pass the AppConfig Application ID as an environment variableresource "aws_lambda_function" "my_function" { # ... environment { variables = { RUNTIME_CONFIG_APP_ID = module.appconfig.application_id } }}
# Grant the function permission to read from AppConfigresource "aws_iam_policy" "appconfig_read" { name = "AppConfigReadPolicy" policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = [ "appconfig:StartConfigurationSession", "appconfig:GetLatestConfiguration" ] Resource = ["${module.appconfig.application_arn}/*"] }] })}Acceso del Lado del Servidor vía AppConfig
Sección titulada «Acceso del Lado del Servidor vía AppConfig»Los consumidores del lado del servidor como las funciones Lambda y los agentes pueden recuperar la configuración en tiempo de ejecución desde AWS AppConfig usando AWS Lambda Powertools.
Todos los constructos de API y agentes generados se configuran automáticamente con:
- La variable de entorno
RUNTIME_CONFIG_APP_ID(el AppConfig Application ID) - Permisos IAM para leer desde AppConfig
Usa getAppConfig de @aws-lambda-powertools/parameters:
import { getAppConfig } from '@aws-lambda-powertools/parameters/appconfig';
// Retrieve the 'connection' namespace as a parsed JSON objectconst config = await getAppConfig('connection', { application: process.env.RUNTIME_CONFIG_APP_ID!, environment: 'default', transform: 'json',});
// Access valuesconst apiUrl = config.apis?.MyApi;const cognitoProps = config.cognitoProps;También puedes recuperar espacios de nombres personalizados:
// Retrieve a custom 'tables' namespaceconst tablesConfig = await getAppConfig('tables', { application: process.env.RUNTIME_CONFIG_APP_ID!, environment: 'default', transform: 'json',});
const usersTableName = tablesConfig.users?.tableName;Usa get_app_config de aws_lambda_powertools.utilities.parameters:
import osfrom aws_lambda_powertools.utilities import parameters
# Retrieve the 'connection' namespace as a parsed JSON objectconfig = parameters.get_app_config( name="connection", environment="default", application=os.environ["RUNTIME_CONFIG_APP_ID"], transform="json",)
# Access valuesapi_url = config.get("apis", {}).get("MyApi")cognito_props = config.get("cognitoProps")También puedes recuperar espacios de nombres personalizados:
# Retrieve a custom 'tables' namespacetables_config = parameters.get_app_config( name="tables", environment="default", application=os.environ["RUNTIME_CONFIG_APP_ID"], transform="json",)
users_table_name = tables_config.get("users", {}).get("tableName")Acceso del Lado del Cliente
Sección titulada «Acceso del Lado del Cliente»Para sitios web, el espacio de nombres connection se despliega como un archivo runtime-config.json en el bucket S3. Consulta la guía React Website Runtime Configuration para obtener detalles sobre cómo acceder a estos valores desde tu código frontend.