Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Los tokens y el AWS CDK

Modo de enfoque
Los tokens y el AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Esta es la guía para AWS CDK desarrolladores de la versión 2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde el 1.° de junio de 2023.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Esta es la guía para AWS CDK desarrolladores de la versión 2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde el 1.° de junio de 2023.

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

En el AWS Cloud Development Kit (AWS CDK), los símbolos son marcadores de posición para valores que no se conocen al definir construcciones o sintetizar pilas. Estos valores se resolverán por completo en el momento de la implementación, cuando se cree la infraestructura real. Al desarrollar AWS CDK aplicaciones, trabajarás con fichas para gestionar estos valores en toda la aplicación.

Ejemplo de token

A continuación, se muestra un ejemplo de una pila de CDK que define un constructo para un bucket de Amazon Simple Storage Service (Amazon S3). Como aún no se conoce el nombre de nuestro bucket, el valor de bucketName se almacena como un token:

TypeScript
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class CdkDemoAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // Store value of the S3 bucket name const myBucketName = myBucket.bucketName; // Print the current value for the S3 bucket name at synthesis console.log("myBucketName: " + bucketName); } }
JavaScript
const { Stack, Duration } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class CdkDemoAppStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // Store value of the S3 bucket name const myBucketName = myBucket.bucketName; // Print the current value for the S3 bucket name at synthesis console.log("myBucketName: " + myBucketName); } } module.exports = { CdkDemoAppStack }
Python
from aws_cdk import ( Stack ) from constructs import Construct from aws_cdk import aws_s3 as s3 class CdkDemoAppStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define an S3 bucket my_bucket = s3.Bucket(self, "myBucket") # Store the value of the S3 bucket name my_bucket_name = my_bucket.bucket_name # Print the current value for the S3 bucket name at synthesis print(f"myBucketName: {my_bucket_name}")
Java
package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.s3.Bucket; import java.util.Map; public class CdkDemoAppStack extends Stack { public CdkDemoAppStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define an S3 bucket Bucket myBucket = Bucket.Builder.create(this, "myBucket") .build(); // Store the token for the bucket name String myBucketName = myBucket.getBucketName(); // Print the token at synthesis System.out.println("myBucketName: " + myBucketName); } }
C#
using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.S3; namespace CdkDemoApp { public class CdkDemoAppStack : Stack { internal CdkDemoAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define an S3 bucket var myBucket = new Bucket(this, "myBucket"); // Store the token for the bucket name var myBucketName = myBucket.BucketName; // Print the token at synthesis System.Console.WriteLine($"myBucketName: {myBucketName}"); } } }
Go
package main import ( "fmt" "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/aws-cdk-go/awscdk/v2/awss3" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type CdkDemoAppStackProps struct { awscdk.StackProps } func NewCdkDemoAppStack(scope constructs.Construct, id string, props *CdkDemoAppStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define an S3 bucket myBucket := awss3.NewBucket(stack, jsii.String("myBucket"), &awss3.BucketProps{}) // Store the token for the bucket name myBucketName := myBucket.BucketName() // Print the token at synthesis fmt.Println("myBucketName: ", *myBucketName) return stack } // ...
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; export class CdkDemoAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // Store value of the S3 bucket name const myBucketName = myBucket.bucketName; // Print the current value for the S3 bucket name at synthesis console.log("myBucketName: " + bucketName); } }

Cuando ejecutamos cdk synth para sintetizar nuestra pila, el valor de myBucketName aparecerá en el formato de token como ${Token[TOKEN.1234]}. Este formato de token es el resultado de cómo AWS CDK codifica los tokens. En este ejemplo, el token está codificado como una cadena:

$ cdk synth --quiet myBucketName: ${Token[TOKEN.21]}

Como el valor del nombre de nuestro bucket no se conoce en el momento de la síntesis, el token se representa como myBucket<unique-hash>. Nuestra AWS CloudFormation plantilla utiliza la función Ref intrínseca para hacer referencia a su valor, que se conocerá en el momento de la implementación:

Resources: myBucket5AF9C99B: # ... Outputs: bucketNameOutput: Description: The name of the S3 bucket Value: Ref: myBucket5AF9C99B

Para obtener más información sobre cómo se genera el hash único, consulte Generó lógica IDs en su plantilla AWS CloudFormation.

Transferencia de tokens

Los tokens se pueden transferir como si fueran el valor real que representan. A continuación, se muestra un ejemplo en el que se pasa el token del nombre de nuestro bucket a una construcción de una AWS Lambda función:

TypeScript

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as lambda from 'aws-cdk-lib/aws-lambda'; export class CdkDemoAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // ... // Define a Lambda function const myFunction = new lambda.Function(this, "myFunction", { runtime: lambda.Runtime.NODEJS_20_X, handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), functionName: myBucketName + "Function", // Pass token for the S3 bucket name environment: { BUCKET_NAME: myBucketName, // Pass token for the S3 bucket name } }); } }
JavaScript
const { Stack, Duration } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); const lambda = require('aws-cdk-lib/aws-lambda'); class CdkDemoAppStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // ... // Define a Lambda function const myFunction = new lambda.Function(this, 'myFunction', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), functionName: myBucketName + 'Function', // Pass token for the S3 bucket name environment: { BUCKET_NAME: myBucketName, // Pass token for the S3 bucket name } }); } } module.exports = { CdkDemoAppStack }
Python
from aws_cdk import ( Stack ) from constructs import Construct from aws_cdk import aws_s3 as s3 from aws_cdk import aws_lambda as _lambda class CdkDemoAppStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define an S3 bucket my_bucket = s3.Bucket(self, "myBucket") # ... # Define a Lambda function my_function = _lambda.Function(self, "myFunction", runtime=_lambda.Runtime.NODEJS_20_X, handler="index.handler", code=_lambda.Code.from_inline(""" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; """), function_name=f"{my_bucket_name}Function", # Pass token for the S3 bucket name environment={ "BUCKET_NAME": my_bucket_name # Pass token for the S3 bucket name } )
Java
package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.s3.Bucket; import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; import java.util.Map; public class CdkDemoAppStack extends Stack { public CdkDemoAppStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define an S3 bucket Bucket myBucket = Bucket.Builder.create(this, "myBucket") .build(); // ... // Define a Lambda function Function myFunction = Function.Builder.create(this, "myFunction") .runtime(Runtime.NODEJS_20_X) .handler("index.handler") .code(Code.fromInline( "exports.handler = async function(event) {" + "return {" + "statusCode: 200," + "body: JSON.stringify('Hello World!')," + "};" + "};" )) .functionName(myBucketName + "Function") // Pass the token for the s3 bucket to the function construct .environment(Map.of("BUCKET_NAME", myBucketName)) // Pass the bucket name as environment variable .build(); } }
C#
using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.S3; using Amazon.CDK.AWS.Lambda; using System; using System.Collections.Generic; namespace CdkDemoApp { public class CdkDemoAppStack : Stack { internal CdkDemoAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define an S3 bucket var myBucket = new Bucket(this, "myBucket"); // ... // Define a Lambda function var myFunction = new Function(this, "myFunction", new FunctionProps { Runtime = Runtime.NODEJS_20_X, Handler = "index.handler", Code = Code.FromInline(@" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; "), // Pass the token for the S3 bucket name Environment = new Dictionary<string, string> { { "BUCKET_NAME", myBucketName } }, FunctionName = $"{myBucketName}Function" // Pass the token for the s3 bucket to the function construct }); } } }
Go
package main import ( "fmt" "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/aws-cdk-go/awscdk/v2/awslambda" "github.com/aws/aws-cdk-go/awscdk/v2/awss3" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type CdkDemoAppStackProps struct { awscdk.StackProps } func NewCdkDemoAppStack(scope constructs.Construct, id string, props *CdkDemoAppStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define an S3 bucket myBucket := awss3.NewBucket(stack, jsii.String("myBucket"), &awss3.BucketProps{}) // ... // Define a Lambda function myFunction := awslambda.NewFunction(stack, jsii.String("myFunction"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), Handler: jsii.String("index.handler"), Code: awslambda.Code_FromInline(jsii.String(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `)), FunctionName: jsii.String(fmt.Sprintf("%sFunction", *myBucketName)), // Pass the token for the S3 bucket to the function name Environment: &map[string]*string{ "BUCKET_NAME": myBucketName, }, }) return stack } // ...

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; import * as lambda from 'aws-cdk-lib/aws-lambda'; export class CdkDemoAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // ... // Define a Lambda function const myFunction = new lambda.Function(this, "myFunction", { runtime: lambda.Runtime.NODEJS_20_X, handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), functionName: myBucketName + "Function", // Pass token for the S3 bucket name environment: { BUCKET_NAME: myBucketName, // Pass token for the S3 bucket name } }); } }

Cuando sintetizamos nuestra plantilla, las funciones intrínsecas Ref y Fn::Join se utilizan para especificar los valores, que se conocerán en el momento de la implementación:

Resources: myBucket5AF9C99B: Type: AWS::S3::Bucket # ... myFunction884E1557: Type: AWS::Lambda::Function Properties: # ... Environment: Variables: BUCKET_NAME: Ref: myBucket5AF9C99B FunctionName: Fn::Join: - "" - - Ref: myBucket5AF9C99B - Function # ...

Cómo funcionan las codificaciones de tokens

Los tokens son objetos que implementan la interfaz IResolvable, que contiene un único método resolve. Durante la síntesis, AWS CDK utiliza este método para obtener el valor final de los símbolos de la CloudFormation plantilla.

nota

En raras ocasiones trabajará con la interfaz IResolvable. Lo más probable es que solo vea las versiones de los tokens codificadas en cadenas.

Tipos de codificación de token

Los tokens participan en el proceso de síntesis para producir valores arbitrarios de cualquier tipo. Por lo general, otras funciones solo aceptan argumentos de tipos básicos, como string o number. Para utilizar tokens en estos casos, puede codificarlos en uno de los tres tipos mediante métodos estáticos de la clase cdk.Token.

  • Token.asString para generar una codificación de cadena (o llamar a .toString() en el objeto token).

  • Token.asList para generar una codificación de lista.

  • Token.asNumber para generar una codificación numérica.

Estos tipos toman un valor arbitrario, que puede ser IResolvable, y lo codifican en un valor primitivo del tipo indicado.

importante

Como cualquiera de los tipos anteriores puede ser un token codificado, tenga cuidado al analizar o intentar leer su contenido. Por ejemplo, si intenta analizar una cadena para extraer un valor de ella y la cadena es un token codificado, el análisis no se realizará correctamente. Del mismo modo, si intenta consultar la longitud de una matriz o realizar operaciones matemáticas con un número, primero debe comprobar que no sean tokens codificados.

Cómo comprobar si hay tokens en la aplicación

Para comprobar si un valor contiene un token sin resolver, debe llamar al método Token.isUnresolved (Python: is_unresolved). A continuación, se muestra un ejemplo que comprueba si el valor del nombre del bucket de Amazon S3 es un token. Si no es un token, entonces se valida la longitud del nombre del bucket:

TypeScript

// ... export class CdkDemoAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // ... // Check if bucket name is a token. If not, check if length is less than 10 characters if (cdk.Token.isUnresolved(myBucketName)) { console.log("Token identified."); } else if (!cdk.Token.isUnresolved(myBucketName) && myBucketName.length > 10) { throw new Error('Maximum length for name is 10 characters.'); }; // ...
JavaScript
const { Stack, Duration, Token, CfnOutput } = require('aws-cdk-lib'); // ... class CdkDemoAppStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // ... // Check if bucket name is a token. If not, check if length is less than 10 characters if (Token.isUnresolved(myBucketName)) { console.log("Token identified."); } else if (!Token.isUnresolved(myBucketName) && myBucketName.length > 10) { throw new Error('Maximum length for name is 10 characters.'); }; // ...
Python

from aws_cdk import ( Stack, Token ) # ... class CdkDemoAppStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define an S3 bucket my_bucket = s3.Bucket(self, "myBucket") # ... # Check if bucket name is a token. If not, check if length is less than 10 characters if Token.is_unresolved(my_bucket_name): print("Token identified.") elif not Token.is_unresolved(my_bucket_name) and len(my_bucket_name) < 10: raise ValueError("Maximum length for name is 10 characters.") # ...
Java
// ... import software.amazon.awscdk.Token; // ... public class CdkDemoAppStack extends Stack { public CdkDemoAppStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define an S3 bucket Bucket myBucket = Bucket.Builder.create(this, "myBucket") .build(); // ... // Check if the bucket name is a token. If not, check if length is less than 10 characters if (Token.isUnresolved(myBucketName)) { System.out.println("Token identified."); } else if (!Token.isUnresolved(myBucketName) && myBucketName.length() > 10) { throw new IllegalArgumentException("Maximum length for name is 10 characters."); } // ... } }
C#
using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.S3; using Amazon.CDK.AWS.Lambda; using System; using System.Collections.Generic; namespace CdkDemoApp { public class CdkDemoAppStack : Stack { internal CdkDemoAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define an S3 bucket var myBucket = new Bucket(this, "myBucket"); // ... // Check if bucket name is a token. If not, check if length is less than 10 characters if (Token.IsUnresolved(myBucketName)) { System.Console.WriteLine("Token identified."); } else if (!Token.IsUnresolved(myBucketName) && myBucketName.Length > 10) { throw new System.Exception("Maximum length for name is 10 characters."); } // ...
Go
// ... func NewCdkDemoAppStack(scope constructs.Construct, id string, props *CdkDemoAppStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define an S3 bucket myBucket := awss3.NewBucket(stack, jsii.String("myBucket"), &awss3.BucketProps{}) // ... // Check if the bucket name is unresolved (a token) if tokenUnresolved := awscdk.Token_IsUnresolved(myBucketName); tokenUnresolved != nil && *tokenUnresolved { fmt.Println("Token identified.") } else if tokenUnresolved != nil && !*tokenUnresolved && len(*myBucketName) > 10 { panic("Maximum length for name is 10 characters.") } // ...

// ... export class CdkDemoAppStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define an S3 bucket const myBucket = new s3.Bucket(this, 'myBucket'); // ... // Check if bucket name is a token. If not, check if length is less than 10 characters if (cdk.Token.isUnresolved(myBucketName)) { console.log("Token identified."); } else if (!cdk.Token.isUnresolved(myBucketName) && myBucketName.length > 10) { throw new Error('Maximum length for name is 10 characters.'); }; // ...

Cuando ejecutamos cdk synth, myBucketName se identifica como un token:

$ cdk synth --quiet Token identified.
nota

Puede utilizar codificaciones de token para escapar del sistema de tipos. Por ejemplo, puede codificar en cadena un token que produce un valor numérico en el momento de la síntesis. Si utiliza estas funciones, es su responsabilidad asegurarse de que la plantilla se resuelve a un estado utilizable después de la síntesis.

Cómo trabajar con tokens codificados en cadena

Así se ven los tokens codificados en cadena.

${TOKEN[Bucket.Name.1234]}

Se pueden transferir como cadenas normales y se pueden concatenar, como se muestra en el siguiente ejemplo.

TypeScript
const functionName = bucket.bucketName + 'Function';
JavaScript
const functionName = bucket.bucketName + 'Function';
Python
function_name = bucket.bucket_name + "Function"
Java
String functionName = bucket.getBucketName().concat("Function");
C#
string functionName = bucket.BucketName + "Function";
Go
functionName := *bucket.BucketName() + "Function"
const functionName = bucket.bucketName + 'Function';

Si el idioma lo admite, también puede utilizar la interpolación de cadenas como se muestra en el siguiente ejemplo.

TypeScript
const functionName = `${bucket.bucketName}Function`;
JavaScript
const functionName = `${bucket.bucketName}Function`;
Python
function_name = f"{bucket.bucket_name}Function"
Java
String functionName = String.format("%sFunction". bucket.getBucketName());
C#
string functionName = $"${bucket.bucketName}Function";
Go

Utilice fmt.Sprintf para una funcionalidad similar:

functionName := fmt.Sprintf("%sFunction", *bucket.BucketName())
const functionName = `${bucket.bucketName}Function`;

Evite manipular la cadena de otras formas. Por ejemplo, si se toma una subcadena, es probable que se rompa el token de la cadena.

Cómo trabajar con tokens codificados en lista

Así se ven los tokens codificados en lista:

["#{TOKEN[Stack.NotificationArns.1234]}"]

Lo único seguro que se puede hacer con estas listas es transferirlas directamente a otros constructos. Los tokens en lista de cadenas no se pueden concatenar, así como tampoco se puede extraer ningún elemento del token. La única forma segura de manipularlos es mediante el uso de funciones intrínsecas AWS CloudFormation como Fn.select.

Cómo trabajar con tokens codificados en números

Los tokens codificados en números son un conjunto de pequeños números negativos de coma flotante con el siguiente aspecto.

-1.8881545897087626e+289

Al igual que ocurre con los tokens en lista, no se puede modificar el valor numérico, ya que es probable que se rompa el token numérico.

A continuación, se muestra un ejemplo de un constructo que contiene un token codificado como un número:

TypeScript
import { Stack, Duration, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as rds from 'aws-cdk-lib/aws-rds'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; export class CdkDemoAppStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Define a new VPC const vpc = new ec2.Vpc(this, 'MyVpc', { maxAzs: 3, // Maximum number of availability zones to use }); // Define an RDS database cluster const dbCluster = new rds.DatabaseCluster(this, 'MyRDSCluster', { engine: rds.DatabaseClusterEngine.AURORA, instanceProps: { vpc, }, }); // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // Print the value for our token at synthesis console.log("portToken: " + portToken); } }
JavaScript
const { Stack, Duration } = require('aws-cdk-lib'); const lambda = require('aws-cdk-lib/aws-lambda'); const rds = require('aws-cdk-lib/aws-rds'); const ec2 = require('aws-cdk-lib/aws-ec2'); class CdkDemoAppStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define a new VPC const vpc = new ec2.Vpc(this, 'MyVpc', { maxAzs: 3, // Maximum number of availability zones to use }); // Define an RDS database cluster const dbCluster = new rds.DatabaseCluster(this, 'MyRDSCluster', { engine: rds.DatabaseClusterEngine.AURORA, instanceProps: { vpc, }, }); // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // Print the value for our token at synthesis console.log("portToken: " + portToken); } } module.exports = { CdkDemoAppStack }
Python
from aws_cdk import ( Duration, Stack, ) from aws_cdk import aws_rds as rds from aws_cdk import aws_ec2 as ec2 from constructs import Construct class CdkDemoAppStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define a new VPC vpc = ec2.Vpc(self, 'MyVpc', max_azs=3 # Maximum number of availability zones to use ) # Define an RDS database cluster db_cluster = rds.DatabaseCluster(self, 'MyRDSCluster', engine=rds.DatabaseClusterEngine.AURORA, instance_props=rds.InstanceProps( vpc=vpc ) ) # Get the port token (this is a token encoded as a number) port_token = db_cluster.cluster_endpoint.port # Print the value for our token at synthesis print(f"portToken: {port_token}")
Java
package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.ec2.Vpc; import software.amazon.awscdk.services.rds.DatabaseCluster; import software.amazon.awscdk.services.rds.DatabaseClusterEngine; import software.amazon.awscdk.services.rds.InstanceProps; public class CdkDemoAppStack extends Stack { public CdkDemoAppStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define a new VPC Vpc vpc = Vpc.Builder.create(this, "MyVpc") .maxAzs(3) // Maximum number of availability zones to use .build(); // Define an RDS database cluster DatabaseCluster dbCluster = DatabaseCluster.Builder.create(this, "MyRDSCluster") .engine(DatabaseClusterEngine.AURORA) .instanceProps(InstanceProps.builder() .vpc(vpc) .build()) .build(); // Get the port token (this is a token encoded as a number) Number portToken = dbCluster.getClusterEndpoint().getPort(); // Print the value for our token at synthesis System.out.println("portToken: " + portToken); } }
C#
using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.EC2; using Amazon.CDK.AWS.RDS; using System; using System.Collections.Generic; namespace CdkDemoApp { public class CdkDemoAppStack : Stack { internal CdkDemoAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define a new VPC var vpc = new Vpc(this, "MyVpc", new VpcProps { MaxAzs = 3 // Maximum number of availability zones to use }); // Define an RDS database cluster var dbCluster = new DatabaseCluster(this, "MyRDSCluster", new DatabaseClusterProps { Engine = DatabaseClusterEngine.AURORA, // Remove parentheses InstanceProps = new Amazon.CDK.AWS.RDS.InstanceProps // Specify RDS InstanceProps { Vpc = vpc } }); // Get the port token (this is a token encoded as a number) var portToken = dbCluster.ClusterEndpoint.Port; // Print the value for our token at synthesis System.Console.WriteLine($"portToken: {portToken}"); } } }
Go
package main import ( "fmt" "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/aws-cdk-go/awscdk/v2/awsec2" "github.com/aws/aws-cdk-go/awscdk/v2/awsrds" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type CdkDemoAppStackProps struct { awscdk.StackProps } func NewCdkDemoAppStack(scope constructs.Construct, id string, props *CdkDemoAppStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define a new VPC vpc := awsec2.NewVpc(stack, jsii.String("MyVpc"), &awsec2.VpcProps{ MaxAzs: jsii.Number(3), // Maximum number of availability zones to use }) // Define an RDS database cluster dbCluster := awsrds.NewDatabaseCluster(stack, jsii.String("MyRDSCluster"), &awsrds.DatabaseClusterProps{ Engine: awsrds.DatabaseClusterEngine_AURORA(), InstanceProps: &awsrds.InstanceProps{ Vpc: vpc, }, }) // Get the port token (this is a token encoded as a number) portToken := dbCluster.ClusterEndpoint().Port() // Print the value for our token at synthesis fmt.Println("portToken: ", portToken) return stack } // ...
import { Stack, Duration, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as rds from 'aws-cdk-lib/aws-rds'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; export class CdkDemoAppStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Define a new VPC const vpc = new ec2.Vpc(this, 'MyVpc', { maxAzs: 3, // Maximum number of availability zones to use }); // Define an RDS database cluster const dbCluster = new rds.DatabaseCluster(this, 'MyRDSCluster', { engine: rds.DatabaseClusterEngine.AURORA, instanceProps: { vpc, }, }); // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // Print the value for our token at synthesis console.log("portToken: " + portToken); } }

Cuando ejecutamos cdk synth, el valor de portToken se muestra como un token codificado en números:

$ cdk synth --quiet portToken: -1.8881545897087968e+289

Transferencia de tokens codificados en números

Al transferir tokens codificados en números a otros constructos, puede que tenga sentido convertirlos primero en cadenas. Por ejemplo, si desea utilizar el valor de una cadena codificada en números como parte de una cadena concatenada, su conversión mejora la legibilidad.

En el siguiente ejemplo, portToken es un token codificado en números que queremos transferir a nuestra función de Lambda como parte de connectionString:

TypeScript
import { Stack, Duration, CfnOutput, StackProps } from 'aws-cdk-lib'; // ... import * as lambda from 'aws-cdk-lib/aws-lambda'; export class CdkDemoAppStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // ... // Example connection string with the port token as a number const connectionString = `jdbc:mysql://mydb.cluster.amazonaws.com:${portToken}/mydatabase`; // Use the connection string as an environment variable in a Lambda function const myFunction = new lambda.Function(this, 'MyLambdaFunction', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), environment: { DATABASE_CONNECTION_STRING: connectionString, // Using the port token as part of the string }, }); // Output the value of our connection string at synthesis console.log("connectionString: " + connectionString); // Output the connection string new CfnOutput(this, 'ConnectionString', { value: connectionString, }); } }
JavaScript
const { Stack, Duration, CfnOutput } = require('aws-cdk-lib'); // ... const lambda = require('aws-cdk-lib/aws-lambda'); class CdkDemoAppStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // ... // Example connection string with the port token as a number const connectionString = `jdbc:mysql://mydb.cluster.amazonaws.com:${portToken}/mydatabase`; // Use the connection string as an environment variable in a Lambda function const myFunction = new lambda.Function(this, 'MyLambdaFunction', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), environment: { DATABASE_CONNECTION_STRING: connectionString, // Using the port token as part of the string }, }); // Output the value of our connection string at synthesis console.log("connectionString: " + connectionString); // Output the connection string new CfnOutput(this, 'ConnectionString', { value: connectionString, }); } } module.exports = { CdkDemoAppStack }
Python
from aws_cdk import ( Duration, Stack, CfnOutput, ) from aws_cdk import aws_lambda as _lambda # ... class CdkDemoAppStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define a new VPC # ... # Define an RDS database cluster # ... # Get the port token (this is a token encoded as a number) port_token = db_cluster.cluster_endpoint.port # ... # Example connection string with the port token as a number connection_string = f"jdbc:mysql://mydb.cluster.amazonaws.com:{port_token}/mydatabase" # Use the connection string as an environment variable in a Lambda function my_function = _lambda.Function(self, 'MyLambdaFunction', runtime=_lambda.Runtime.NODEJS_20_X, handler='index.handler', code=_lambda.Code.from_inline(""" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; """), environment={ 'DATABASE_CONNECTION_STRING': connection_string # Using the port token as part of the string } ) # Output the value of our connection string at synthesis print(f"connectionString: {connection_string}") # Output the connection string CfnOutput(self, 'ConnectionString', value=connection_string )
Java

// ... import software.amazon.awscdk.CfnOutput; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; import software.amazon.awscdk.services.lambda.Code; import java.util.Map; public class CdkDemoAppStack extends Stack { public CdkDemoAppStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) Number portToken = dbCluster.getClusterEndpoint().getPort(); // ... // Example connection string with the port token as a number String connectionString = "jdbc:mysql://mydb.cluster.amazonaws.com:" + portToken + "/mydatabase"; // Use the connection string as an environment variable in a Lambda function Function myFunction = Function.Builder.create(this, "MyLambdaFunction") .runtime(Runtime.NODEJS_20_X) .handler("index.handler") .code(Code.fromInline( "exports.handler = async function(event) {\n" + " return {\n" + " statusCode: 200,\n" + " body: JSON.stringify('Hello World!'),\n" + " };\n" + "};")) .environment(Map.of( "DATABASE_CONNECTION_STRING", connectionString // Using the port token as part of the string )) .build(); // Output the value of our connection string at synthesis System.out.println("connectionString: " + connectionString); // Output the connection string CfnOutput.Builder.create(this, "ConnectionString") .value(connectionString) .build(); } }
C#
// ... using Amazon.CDK.AWS.Lambda; namespace CdkDemoApp { public class CdkDemoAppStack : Stack { internal CdkDemoAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define a new VPC // ... // Define an RDS database cluster var dbCluster = new DatabaseCluster(this, "MyRDSCluster", new DatabaseClusterProps // ... // Get the port token (this is a token encoded as a number) var portToken = dbCluster.ClusterEndpoint.Port; // ... // Example connection string with the port token as a number var connectionString = $"jdbc:mysql://mydb.cluster.amazonaws.com:{portToken}/mydatabase"; // Use the connection string as an environment variable in a Lambda function var myFunction = new Function(this, "MyLambdaFunction", new FunctionProps { Runtime = Runtime.NODEJS_20_X, Handler = "index.handler", Code = Code.FromInline(@" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; "), Environment = new Dictionary<string, string> { { "DATABASE_CONNECTION_STRING", connectionString } // Using the port token as part of the string } }); // Output the value of our connection string at synthesis Console.WriteLine($"connectionString: {connectionString}"); // Output the connection string new CfnOutput(this, "ConnectionString", new CfnOutputProps { Value = connectionString }); } } }
Go
// ... "github.com/aws/aws-cdk-go/awscdk/v2/awslambda" ) type CdkDemoAppStackProps struct { awscdk.StackProps } func NewCdkDemoAppStack(scope constructs.Construct, id string, props *CdkDemoAppStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) portToken := dbCluster.ClusterEndpoint().Port() // ... // Example connection string with the port token as a number connectionString := fmt.Sprintf("jdbc:mysql://mydb.cluster.amazonaws.com:%s/mydatabase", portToken) // Use the connection string as an environment variable in a Lambda function myFunction := awslambda.NewFunction(stack, jsii.String("MyLambdaFunction"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), Handler: jsii.String("index.handler"), Code: awslambda.Code_FromInline(jsii.String(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `)), Environment: &map[string]*string{ "DATABASE_CONNECTION_STRING": jsii.String(connectionString), // Using the port token as part of the string }, }) // Output the value of our connection string at synthesis fmt.Println("connectionString: ", connectionString) // Output the connection string awscdk.NewCfnOutput(stack, jsii.String("ConnectionString"), &awscdk.CfnOutputProps{ Value: jsii.String(connectionString), }) return stack } // ...
import { Stack, Duration, CfnOutput, StackProps } from 'aws-cdk-lib'; // ... import * as lambda from 'aws-cdk-lib/aws-lambda'; export class CdkDemoAppStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // ... // Example connection string with the port token as a number const connectionString = `jdbc:mysql://mydb.cluster.amazonaws.com:${portToken}/mydatabase`; // Use the connection string as an environment variable in a Lambda function const myFunction = new lambda.Function(this, 'MyLambdaFunction', { runtime: lambda.Runtime.NODEJS_20_X, handler: 'index.handler', code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), environment: { DATABASE_CONNECTION_STRING: connectionString, // Using the port token as part of the string }, }); // Output the value of our connection string at synthesis console.log("connectionString: " + connectionString); // Output the connection string new CfnOutput(this, 'ConnectionString', { value: connectionString, }); } }

Si transferimos este valor a connectionString, el valor de salida al ejecutar cdk synth puede resultar confuso debido a la cadena codificada en números:

$ cdk synth --quiet connectionString: jdbc:mysql://mydb.cluster.amazonaws.com:-1.888154589708796e+289/mydatabase

Para convertir un token codificado en números en una cadena, utilice cdk.Tokenization.stringifyNumber(token). En el siguiente ejemplo, convertimos el token codificado en números en una cadena antes de definir nuestra cadena de conexión:

TypeScript
import { Stack, Duration, Tokenization, CfnOutput, StackProps } from 'aws-cdk-lib'; // ... export class CdkDemoAppStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // ... // Convert the encoded number to an encoded string for use in the connection string const portAsString = Tokenization.stringifyNumber(portToken); // Example connection string with the port token as a string const connectionString = `jdbc:mysql://mydb.cluster.amazonaws.com:${portAsString}/mydatabase`; // Use the connection string as an environment variable in a Lambda function const myFunction = new lambda.Function(this, 'MyLambdaFunction', { // ... environment: { DATABASE_CONNECTION_STRING: connectionString, // Using the port token as part of the string }, }); // Output the value of our connection string at synthesis console.log("connectionString: " + connectionString); // Output the connection string new CfnOutput(this, 'ConnectionString', { value: connectionString, }); } }
JavaScript
const { Stack, Duration, Tokenization, CfnOutput } = require('aws-cdk-lib'); // ... class CdkDemoAppStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // ... // Convert the encoded number to an encoded string for use in the connection string const portAsString = Tokenization.stringifyNumber(portToken); // Example connection string with the port token as a string const connectionString = `jdbc:mysql://mydb.cluster.amazonaws.com:${portAsString}/mydatabase`; // Use the connection string as an environment variable in a Lambda function const myFunction = new lambda.Function(this, 'MyLambdaFunction', { // ... environment: { DATABASE_CONNECTION_STRING: connectionString, // Using the port token as part of the string }, }); // Output the value of our connection string at synthesis console.log("connectionString: " + connectionString); // Output the connection string new CfnOutput(this, 'ConnectionString', { value: connectionString, }); } } module.exports = { CdkDemoAppStack }
Python
from aws_cdk import ( Duration, Stack, Tokenization, CfnOutput, ) # ... class CdkDemoAppStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define a new VPC # ... # Define an RDS database cluster # ... # Get the port token (this is a token encoded as a number) port_token = db_cluster.cluster_endpoint.port # Convert the encoded number to an encoded string for use in the connection string port_as_string = Tokenization.stringify_number(port_token) # Example connection string with the port token as a string connection_string = f"jdbc:mysql://mydb.cluster.amazonaws.com:{port_as_string}/mydatabase" # Use the connection string as an environment variable in a Lambda function my_function = _lambda.Function(self, 'MyLambdaFunction', # ... environment={ 'DATABASE_CONNECTION_STRING': connection_string # Using the port token as part of the string } ) # Output the value of our connection string at synthesis print(f"connectionString: {connection_string}") # Output the connection string CfnOutput(self, 'ConnectionString', value=connection_string )
Java
// ... import software.amazon.awscdk.Tokenization; public class CdkDemoAppStack extends Stack { public CdkDemoAppStack(final Construct scope, final String id) { this(scope, id, null); } public CdkDemoAppStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) Number portToken = dbCluster.getClusterEndpoint().getPort(); // ... // Convert the encoded number to an encoded string for use in the connection string String portAsString = Tokenization.stringifyNumber(portToken); // Example connection string with the port token as a string String connectionString = "jdbc:mysql://mydb.cluster.amazonaws.com:" + portAsString + "/mydatabase"; // Use the connection string as an environment variable in a Lambda function Function myFunction = Function.Builder.create(this, "MyLambdaFunction") // ... .environment(Map.of( "DATABASE_CONNECTION_STRING", connectionString // Using the port token as part of the string )) .build(); // Output the value of our connection string at synthesis System.out.println("connectionString: " + connectionString); // Output the connection string CfnOutput.Builder.create(this, "ConnectionString") .value(connectionString) .build(); } }
C#
// ... namespace CdkDemoApp { public class CdkDemoAppStack : Stack { internal CdkDemoAppStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) var portToken = dbCluster.ClusterEndpoint.Port; // ... // Convert the encoded number to an encoded string for use in the connection string var portAsString = Tokenization.StringifyNumber(portToken); // Example connection string with the port token as a string var connectionString = $"jdbc:mysql://mydb.cluster.amazonaws.com:{portAsString}/mydatabase"; // Use the connection string as an environment variable in a Lambda function var myFunction = new Function(this, "MyLambdaFunction", new FunctionProps { // ... Environment = new Dictionary<string, string> { { "DATABASE_CONNECTION_STRING", connectionString } // Using the port token as part of the string } }); // Output the value of our connection string at synthesis Console.WriteLine($"connectionString: {connectionString}"); // Output the connection string new CfnOutput(this, "ConnectionString", new CfnOutputProps { Value = connectionString }); } } }
Go
// ... func NewCdkDemoAppStack(scope constructs.Construct, id string, props *CdkDemoAppStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) portToken := dbCluster.ClusterEndpoint().Port() // ... // Convert the encoded number to an encoded string for use in the connection string portAsString := awscdk.Tokenization_StringifyNumber(portToken) // Example connection string with the port token as a string connectionString := fmt.Sprintf("jdbc:mysql://mydb.cluster.amazonaws.com:%s/mydatabase", portAsString) // Use the connection string as an environment variable in a Lambda function myFunction := awslambda.NewFunction(stack, jsii.String("MyLambdaFunction"), &awslambda.FunctionProps{ // ... Environment: &map[string]*string{ "DATABASE_CONNECTION_STRING": jsii.String(connectionString), // Using the port token as part of the string }, }) // Output the value of our connection string at synthesis fmt.Println("connectionString: ", connectionString) // Output the connection string awscdk.NewCfnOutput(stack, jsii.String("ConnectionString"), &awscdk.CfnOutputProps{ Value: jsii.String(connectionString), }) fmt.Println(myFunction) return stack } // ...
import { Stack, Duration, Tokenization, CfnOutput, StackProps } from 'aws-cdk-lib'; // ... export class CdkDemoAppStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); // Define a new VPC // ... // Define an RDS database cluster // ... // Get the port token (this is a token encoded as a number) const portToken = dbCluster.clusterEndpoint.port; // ... // Convert the encoded number to an encoded string for use in the connection string const portAsString = Tokenization.stringifyNumber(portToken); // Example connection string with the port token as a string const connectionString = `jdbc:mysql://mydb.cluster.amazonaws.com:${portAsString}/mydatabase`; // Use the connection string as an environment variable in a Lambda function const myFunction = new lambda.Function(this, 'MyLambdaFunction', { // ... environment: { DATABASE_CONNECTION_STRING: connectionString, // Using the port token as part of the string }, }); // Output the value of our connection string at synthesis console.log("connectionString: " + connectionString); // Output the connection string new CfnOutput(this, 'ConnectionString', { value: connectionString, }); } }

Cuando ejecutamos cdk synth, el valor de nuestra cadena de conexión se representa en un formato más limpio y claro:

$ cdk synth --quiet connectionString: jdbc:mysql://mydb.cluster.amazonaws.com:${Token[TOKEN.242]}/mydatabase

Valores diferidos

Además de representar los valores del tiempo de despliegue, como los AWS CloudFormation parámetros, los tokens también se utilizan habitualmente para representar valores perezosos en el tiempo de síntesis. Estos son valores para los que el valor final se determinará antes de que se complete la síntesis, pero no en el punto en el que se crea el valor. Utilice tokens para pasar una cadena literal o un valor numérico a otro constructo, mientras que el valor real en el momento de la síntesis podría depender de algún cálculo que aún no se ha producido.

Puede crear tokens que representen valores diferidos en el momento de la síntesis utilizando los métodos estáticos de la clase Lazy, como Lazy.string y Lazy.number. Estos métodos aceptan un objeto cuya propiedad produce es una función que acepta un argumento de contexto y devuelve el valor final cuando se llama.

El siguiente ejemplo crea un grupo de escalado automático cuya capacidad se determina después de su creación.

TypeScript
let actualValue: number; new AutoScalingGroup(this, 'Group', { desiredCapacity: Lazy.numberValue({ produce(context) { return actualValue; } }) }); // At some later point actualValue = 10;
JavaScript
let actualValue; new AutoScalingGroup(this, 'Group', { desiredCapacity: Lazy.numberValue({ produce(context) { return (actualValue); } }) }); // At some later point actualValue = 10;
Python
class Producer: def __init__(self, func): self.produce = func actual_value = None AutoScalingGroup(self, "Group", desired_capacity=Lazy.number_value(Producer(lambda context: actual_value)) ) # At some later point actual_value = 10
Java
double actualValue = 0; class ProduceActualValue implements INumberProducer { @Override public Number produce(IResolveContext context) { return actualValue; } } AutoScalingGroup.Builder.create(this, "Group") .desiredCapacity(Lazy.numberValue(new ProduceActualValue())).build(); // At some later point actualValue = 10;
C#
public class NumberProducer : INumberProducer { Func<Double> function; public NumberProducer(Func<Double> function) { this.function = function; } public Double Produce(IResolveContext context) { return function(); } } double actualValue = 0; new AutoScalingGroup(this, "Group", new AutoScalingGroupProps { DesiredCapacity = Lazy.NumberValue(new NumberProducer(() => actualValue)) }); // At some later point actualValue = 10;
let actualValue: number; new AutoScalingGroup(this, 'Group', { desiredCapacity: Lazy.numberValue({ produce(context) { return actualValue; } }) }); // At some later point actualValue = 10;

Conversión a JSON

A veces, desea generar una cadena JSON de datos arbitrarios y es posible que no sepa si los datos contienen tokens. Para codificar correctamente en JSON cualquier estructura de datos, independientemente de si contiene o no tokens, utilice el método stack.toJsonString como se muestra en el siguiente ejemplo.

TypeScript
const stack = Stack.of(this); const str = stack.toJsonString({ value: bucket.bucketName });
JavaScript
const stack = Stack.of(this); const str = stack.toJsonString({ value: bucket.bucketName });
Python
stack = Stack.of(self) string = stack.to_json_string(dict(value=bucket.bucket_name))
Java
Stack stack = Stack.of(this); String stringVal = stack.toJsonString(java.util.Map.of( // Map.of requires Java 9+ put("value", bucket.getBucketName())));
C#
var stack = Stack.Of(this); var stringVal = stack.ToJsonString(new Dictionary<string, string> { ["value"] = bucket.BucketName });
const stack = Stack.of(this); const str = stack.toJsonString({ value: bucket.bucketName });
PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.