런타임 구성
런타임 구성은 Nx Plugin for AWS가 생성된 프로젝트와 컴포넌트 간에 배포 시점 값을 전달하여 서로 연결할 수 있도록 하는 메커니즘입니다. 예를 들어, API를 생성하면 해당 URL이 자동으로 런타임 구성에 등록되어 연결된 웹사이트가 이를 검색할 수 있습니다.
작동 방식
섹션 제목: “작동 방식”런타임 구성은 네임스페이스로 구성됩니다. 각 네임스페이스는 관련 구성 값의 논리적 그룹입니다. 배포 시점에 모든 네임스페이스는 AWS AppConfig에 구성 프로필로 저장됩니다.
생성된 구성 요소에서 사용하는 네 가지 내장 네임스페이스가 있습니다:
connection— 생성된 프로젝트가 서로 연결될 수 있도록 하는 구성:- API URL — API 구성 요소에 의해 자동으로 등록됨
- Cognito 설정 — UserIdentity 구성 요소에 의해 자동으로 등록됨
- Agent 런타임 ARN — React 웹사이트를 Agent에 연결할 때 연결 생성기에 의해 추가됨
agentcore— 에이전트 및 MCP 서버를 위한 AgentCore 런타임 ARN. 에이전트/MCP 구성 요소에 의해 자동으로 등록되며 서버 측 검색(A2A를 통한 에이전트 → 에이전트, 에이전트 → MCP 서버)에 사용됩니다.dynamodb— 테이블 이름, DynamoDB 테이블 구성 요소에 의해 자동으로 등록되며 생성된 테이블 클라이언트에 의해 읽힙니다.database— Aurora 연결 세부 정보, 관계형 데이터베이스 구성 요소에 의해 자동으로 등록되며 생성된 데이터베이스 클라이언트에 의해 읽힙니다.
connection 네임스페이스는 웹사이트의 S3 버킷에 runtime-config.json 파일로도 배포되어 백엔드 리소스의 클라이언트 측 검색을 가능하게 합니다. 다른 네임스페이스는 서버 측 전용(AppConfig를 통해)이므로 웹사이트를 명시적으로 연결하지 않는 한 에이전트 런타임 ARN 및 테이블 이름과 같은 값이 프론트엔드에 노출되지 않습니다.
원하는 만큼 추가 네임스페이스를 정의할 수 있으며, 이는 배포 시점 값을 Lambda 함수나 기타 컴퓨팅 리소스에 전달하기 위한 환경 변수의 편리한 대안을 제공합니다.
인프라
섹션 제목: “인프라”구성 작성
섹션 제목: “구성 작성”생성된 구성 요소는 자동으로 관련 구성을 connection 네임스페이스에 작성합니다. 모든 네임스페이스에 자신의 값을 작성할 수도 있습니다.
RuntimeConfig CDK 구성 요소는 스테이지 범위 싱글톤입니다. set()을 사용하여 네임스페이스에 키를 작성합니다:
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,});합성/배포 시점에 RuntimeConfig는 다음을 포함하는 AWS AppConfig 애플리케이션을 생성합니다:
- 각 네임스페이스에 대한 구성 프로필
- 각 프로필의 JSON 데이터가 포함된 호스팅 구성 버전
default환경에 대한 즉시 배포
Terraform은 세 개의 core/runtime-config/* 모듈을 통해 런타임 구성을 연결합니다. 루트 모듈에서 다음 순서로 선언합니다:
-
core/runtime-config/appconfig— 루트 모듈의 상단 근처에 한 번 선언됩니다. AppConfig 애플리케이션, 환경, 배포 전략 및 네임스페이스당 하나의 구성 프로필을 생성합니다.application_id및application_arn출력은 런타임에 런타임 구성을 읽는 모든 모듈(에이전트, MCP 서버, Lambda 함수 등)에 전달됩니다.packages/infra/src/main.tf module "runtime_config_appconfig" {source = "../../common/terraform/src/core/runtime-config/appconfig"application_name = "my-app-runtime-config"}namespaces변수는 기본적으로 모든 내장 네임스페이스로 설정되므로 생성된 모듈은 구성 없이 작동합니다. 자신의 네임스페이스를 추가하려면 내장 네임스페이스와 함께 나열합니다:packages/infra/src/main.tf module "runtime_config_appconfig" {source = "../../common/terraform/src/core/runtime-config/appconfig"application_name = "my-app-runtime-config"namespaces = ["connection", "agentcore", "database", "dynamodb", "tables"]} -
core/runtime-config/entry— 기여당 하나의 호출. 생성된 API, 에이전트 및 MCP 모듈은 내부적으로 이를 호출하여 URL 및 ARN을 게시합니다. 사용자 정의 구성을 게시하려면 직접 호출합니다.packages/infra/src/main.tf # Automatic — done inside generated modulesmodule "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.namearn = aws_dynamodb_table.users.arn}} -
core/runtime-config/appconfig-deployment— 루트 모듈의 끝에 한 번 선언되며, 항목을 기여하는 모든 모듈을 포함하는depends_on이 있습니다. 기여된 항목을 네임스페이스당 하나의 JSON으로 집계하고 공유 애플리케이션에 대해 호스팅 구성 버전 + 배포를 생성합니다.packages/infra/src/main.tf module "runtime_config_appconfig_deployment" {source = "../../common/terraform/src/core/runtime-config/appconfig-deployment"application_id = module.runtime_config_appconfig.application_idenvironment_id = module.runtime_config_appconfig.environment_iddeployment_strategy_id = module.runtime_config_appconfig.deployment_strategy_idconfiguration_profile_ids = module.runtime_config_appconfig.configuration_profile_idsnamespaces = module.runtime_config_appconfig.namespacesdepends_on = [module.my_api,module.add_table_config,# ...every module that contributes an entry]}
구성 읽기
섹션 제목: “구성 읽기”서버 측 소비자는 런타임에 구성을 읽기 위해 AppConfig 애플리케이션 ID와 IAM 권한이 필요합니다. 생성된 구성 요소는 이를 자동으로 처리합니다.
appConfigApplicationId를 사용하여 AppConfig 애플리케이션 ID를 가져오고, grantReadAppConfig()를 사용하여 읽기 권한을 부여합니다:
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);공유 runtime_config_appconfig 모듈의 application_id 출력을 참조하여 AppConfig 애플리케이션 ID를 가져오고, 적절한 IAM 정책 문을 추가합니다:
# Pass the AppConfig Application ID as an environment variableresource "aws_lambda_function" "my_function" { # ... environment { variables = { RUNTIME_CONFIG_APP_ID = module.runtime_config_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.runtime_config_appconfig.application_arn}/*"] }] })}AppConfig를 통한 서버 측 액세스
섹션 제목: “AppConfig를 통한 서버 측 액세스”Lambda 함수 및 에이전트와 같은 서버 측 소비자는 AWS Lambda Powertools를 사용하여 AWS AppConfig에서 런타임 구성을 검색할 수 있습니다.
생성된 모든 API 및 에이전트 구성 요소는 다음과 함께 자동으로 구성됩니다:
RUNTIME_CONFIG_APP_ID환경 변수(AppConfig 애플리케이션 ID)- AppConfig에서 읽을 수 있는 IAM 권한
@aws-lambda-powertools/parameters의 getAppConfig를 사용합니다:
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;사용자 정의 네임스페이스도 검색할 수 있습니다:
// 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;aws_lambda_powertools.utilities.parameters의 get_app_config를 사용합니다:
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")사용자 정의 네임스페이스도 검색할 수 있습니다:
# 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")클라이언트 측 액세스
섹션 제목: “클라이언트 측 액세스”웹사이트의 경우 connection 네임스페이스는 S3 버킷에 runtime-config.json 파일로 배포됩니다. 프론트엔드 코드에서 이러한 값에 액세스하는 방법에 대한 자세한 내용은 React 웹사이트 런타임 구성 가이드를 참조하세요.