Configuration d'exécution
La configuration d’exécution est le mécanisme utilisé par Nx Plugin for AWS pour transmettre des valeurs au moment du déploiement entre les projets et composants générés afin qu’ils puissent se connecter les uns aux autres. Par exemple, lorsque vous générez une API, son URL est automatiquement enregistrée dans la configuration d’exécution afin qu’un site web connecté puisse la découvrir.
Comment ça fonctionne
Section intitulée « Comment ça fonctionne »La configuration d’exécution est organisée en namespaces (espaces de noms). Chaque namespace est un regroupement logique de valeurs de configuration associées. Au moment du déploiement, tous les namespaces sont stockés dans AWS AppConfig en tant que Configuration Profiles.
Le namespace intégré connection est utilisé pour la configuration qui permet aux projets générés de se connecter entre eux, par exemple :
- URLs d’API — enregistrées automatiquement par les constructs d’API
- Paramètres Cognito — enregistrés automatiquement par le construct UserIdentity
- ARNs d’exécution des agents — enregistrés automatiquement par les constructs d’agents
Le namespace connection est également déployé sous forme de fichier runtime-config.json dans le bucket S3 de votre site web, permettant la découverte côté client des ressources backend.
Vous pouvez définir autant de namespaces supplémentaires que vous le souhaitez, offrant une alternative pratique aux variables d’environnement pour transmettre des valeurs au moment du déploiement telles que les noms de tables DynamoDB à vos fonctions Lambda ou autres ressources de calcul.
Infrastructure
Section intitulée « Infrastructure »Écriture de la configuration
Section intitulée « Écriture de la configuration »Les constructs générés écrivent automatiquement la configuration pertinente dans le namespace connection. Vous pouvez également écrire vos propres valeurs dans n’importe quel namespace.
Le construct CDK RuntimeConfig est un singleton à portée de stage. Utilisez set() pour écrire une clé dans un namespace :
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,});Au moment de la synthèse/du déploiement, RuntimeConfig crée une application AWS AppConfig contenant :
- Un Configuration Profile pour chaque namespace
- Une Hosted Configuration Version avec les données JSON pour chaque profil
- Un Deployment instantané vers l’environnement
default
Utilisez le module runtime-config/entry pour écrire une clé dans un namespace :
# 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 }}Vous devez ensuite déclarer le module runtime-config/appconfig pour créer les ressources AppConfig à partir de tous les fichiers de namespace :
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]}Lecture de la configuration
Section intitulée « Lecture de la configuration »Les consommateurs côté serveur ont besoin de l’AppConfig Application ID et des permissions IAM pour lire la configuration à l’exécution. Les constructs générés gèrent cela automatiquement.
Utilisez appConfigApplicationId pour obtenir l’AppConfig Application ID, et grantReadAppConfig() pour accorder les permissions de lecture :
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);Référencez la sortie application_id du module appconfig pour obtenir l’AppConfig Application ID, et ajoutez les déclarations de politique IAM appropriées :
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}/*"] }] })}Accès côté serveur via AppConfig
Section intitulée « Accès côté serveur via AppConfig »Les consommateurs côté serveur tels que les fonctions Lambda et les agents peuvent récupérer la configuration d’exécution depuis AWS AppConfig en utilisant AWS Lambda Powertools.
Tous les constructs d’API et d’agents générés sont automatiquement configurés avec :
- La variable d’environnement
RUNTIME_CONFIG_APP_ID(l’AppConfig Application ID) - Les permissions IAM pour lire depuis AppConfig
Utilisez getAppConfig depuis @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;Vous pouvez également récupérer des namespaces personnalisés :
// 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;Utilisez get_app_config depuis 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")Vous pouvez également récupérer des namespaces personnalisés :
# 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")Accès côté client
Section intitulée « Accès côté client »Pour les sites web, le namespace connection est déployé sous forme de fichier runtime-config.json dans le bucket S3. Consultez le guide Configuration d’exécution du site web React pour plus de détails sur la façon d’accéder à ces valeurs depuis votre code frontend.