Wählen Sie Ihre Cookie-Einstellungen aus

Wir verwenden essentielle Cookies und ähnliche Tools, die für die Bereitstellung unserer Website und Services erforderlich sind. Wir verwenden Performance-Cookies, um anonyme Statistiken zu sammeln, damit wir verstehen können, wie Kunden unsere Website nutzen, und Verbesserungen vornehmen können. Essentielle Cookies können nicht deaktiviert werden, aber Sie können auf „Anpassen“ oder „Ablehnen“ klicken, um Performance-Cookies abzulehnen.

Wenn Sie damit einverstanden sind, verwenden AWS und zugelassene Drittanbieter auch Cookies, um nützliche Features der Website bereitzustellen, Ihre Präferenzen zu speichern und relevante Inhalte, einschließlich relevanter Werbung, anzuzeigen. Um alle nicht notwendigen Cookies zu akzeptieren oder abzulehnen, klicken Sie auf „Akzeptieren“ oder „Ablehnen“. Um detailliertere Entscheidungen zu treffen, klicken Sie auf „Anpassen“.

Tokens und die AWS CDK

Fokusmodus
Tokens und die AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 in die Wartung aufgenommen und der Support wurde am 1. Juni 2023 eingestellt.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 in die Wartung aufgenommen und der Support wurde am 1. Juni 2023 eingestellt.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

In der sind Token Platzhalter für Werte AWS Cloud Development Kit (AWS CDK), die bei der Definition von Konstrukten oder der Synthese von Stacks nicht bekannt sind. Diese Werte werden bei der Bereitstellung vollständig aufgelöst, wenn Ihre eigentliche Infrastruktur erstellt wird. Bei der Entwicklung von AWS CDK Anwendungen werden Sie mit Tokens arbeiten, um diese Werte in Ihrer gesamten Anwendung zu verwalten.

Beispiel für ein Token

Im Folgenden finden Sie ein Beispiel für einen CDK-Stack, der ein Konstrukt für einen Amazon Simple Storage Service (Amazon S3) -Bucket definiert. Da der Name unseres Buckets noch nicht bekannt ist, bucketName wird der Wert für als Token gespeichert:

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); } }

Wenn wir unseren cdk synth Stack synthetisieren, myBucketName wird der Wert für im Token-Format von ${Token[TOKEN.1234]} angezeigt. Dieses Token-Format ergibt sich aus der Art und Weise, wie die Token AWS CDK codiert werden. In diesem Beispiel ist das Token als Zeichenfolge codiert:

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

Da der Wert für unseren Bucket-Namen bei der Synthese nicht bekannt ist, wird das Token als myBucket<unique-hash> gerendert. Unsere AWS CloudFormation Vorlage verwendet die Ref systeminterne Funktion, um auf ihren Wert zu verweisen, der bei der Bereitstellung bekannt sein wird:

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

Weitere Informationen darüber, wie der eindeutige Hash generiert wird, finden Sie unter. Logisch IDs in Ihrer AWS CloudFormation Vorlage generiert

Tokens weitergeben

Tokens können weitergegeben werden, als wären sie der tatsächliche Wert, den sie repräsentieren. Im Folgenden finden Sie ein Beispiel, das das Token für unseren Bucket-Namen an ein Konstrukt für eine AWS Lambda Funktion übergibt:

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 } }); } }

Wenn wir unsere Vorlage synthetisieren, werden die Funktionen Ref und die Fn::Join systemeigenen Funktionen verwendet, um die Werte zu spezifizieren, die bei der Bereitstellung bekannt sein werden:

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

Wie funktionieren Token-Kodierungen

Tokens sind Objekte, die die IResolvable Schnittstelle implementieren, die eine einzige resolve Methode enthält. Während der Synthese AWS CDK ruft er diese Methode auf, um den endgültigen Wert für Token in Ihrer CloudFormation Vorlage zu erzeugen.

Anmerkung

Sie werden selten direkt mit der IResolvable Schnittstelle arbeiten. Sie werden höchstwahrscheinlich nur string-kodierte Versionen von Tokens sehen.

Typen der Token-Codierung

Token sind am Syntheseprozess beteiligt, um beliebige Werte beliebigen Typs zu erzeugen. Andere Funktionen akzeptieren normalerweise nur Argumente grundlegender Typen wie string odernumber. Um in diesen Fällen Tokens zu verwenden, können Sie sie in einen von drei Typen codieren, indem Sie statische Methoden für die cdk.Token Klasse verwenden.

  • Token.asStringum eine Zeichenkettenkodierung zu generieren (oder das Token-Objekt .toString() aufzurufen).

  • Token.asListum eine Listenkodierung zu generieren.

  • Token.asNumberum eine numerische Kodierung zu generieren.

Diese nehmen einen beliebigen Wert, der ein sein kannIResolvable, und kodieren ihn in einen primitiven Wert des angegebenen Typs.

Wichtig

Da es sich bei jedem der vorherigen Typen potenziell um ein codiertes Token handeln kann, sollten Sie vorsichtig sein, wenn Sie ihren Inhalt analysieren oder versuchen, ihn zu lesen. Wenn Sie beispielsweise versuchen, eine Zeichenfolge zu analysieren, um daraus einen Wert zu extrahieren, und es sich bei der Zeichenfolge um ein codiertes Token handelt, schlägt die Analyse fehl. Ebenso müssen Sie, wenn Sie versuchen, die Länge eines Arrays abzufragen oder mathematische Operationen mit einer Zahl durchzuführen, zunächst überprüfen, ob es sich nicht um kodierte Token handelt.

Wie können Sie in Ihrer App nach Tokens suchen

Um zu überprüfen, ob ein Wert ein ungelöstes Token enthält, rufen Sie die Methode Token.isUnresolved (Python:is_unresolved) auf. Das folgende Beispiel prüft, ob der Wert für unseren Amazon S3 S3-Bucket-Namen ein Token ist. Wenn es sich nicht um ein Token handelt, überprüfen wir dann die Länge des Bucket-Namens:

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.'); }; // ...

Wenn wir ausführencdk synth, myBucketName wird es als Token identifiziert:

$ cdk synth --quiet Token identified.
Anmerkung

Sie können Token-Kodierungen verwenden, um dem Typsystem zu entkommen. Sie könnten beispielsweise ein Token, das bei der Synthese einen Zahlenwert erzeugt, mit einer Zeichenkette codieren. Wenn Sie diese Funktionen verwenden, liegt es in Ihrer Verantwortung, dafür zu sorgen, dass Ihre Vorlage nach der Synthese wieder in einen brauchbaren Zustand übergeht.

Arbeiten Sie mit String-codierten Tokens

Zeichenkettencodierte Token sehen wie folgt aus.

${TOKEN[Bucket.Name.1234]}

Sie können wie normale Zeichenketten weitergegeben und verkettet werden, wie im folgenden Beispiel gezeigt.

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';

Sie können auch Zeichenketteninterpolation verwenden, sofern Ihre Sprache dies unterstützt, wie im folgenden Beispiel gezeigt.

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

Verwenden Sie fmt.Sprintf für ähnliche Funktionen:

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

Vermeiden Sie es, die Zeichenfolge auf andere Weise zu manipulieren. Wenn Sie beispielsweise eine Teilzeichenfolge einer Zeichenfolge verwenden, wird das Zeichenketten-Token wahrscheinlich beschädigt.

Mit listencodierten Tokens arbeiten

Listenkodierte Token sehen wie folgt aus:

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

Die einzig sichere Sache, die man mit diesen Listen machen kann, ist, sie direkt an andere Konstrukte weiterzugeben. Token in Form einer Zeichenkettenliste können nicht verkettet werden, und es kann auch kein Element aus dem Token entnommen werden. Der einzig sichere Weg, sie zu manipulieren, ist die Verwendung AWS CloudFormation systemeigener Funktionen wie fn.Select.

Arbeiten mit nummerencodierten Tokens

Zahlenkodierte Token sind eine Reihe winziger negativer Gleitkommazahlen, die wie folgt aussehen.

-1.8881545897087626e+289

Wie bei Listentokens können Sie den Zahlenwert nicht ändern, da das Zahlentokens dadurch wahrscheinlich beschädigt wird.

Im Folgenden finden Sie ein Beispiel für ein Konstrukt, das ein als Zahl codiertes Token enthält:

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); } }

Wenn wir ausführencdk synth, portToken wird der Wert für als nummerncodiertes Token angezeigt:

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

Übergeben Sie nummernkodierte Token

Wenn Sie nummernkodierte Token an andere Konstrukte übergeben, kann es sinnvoll sein, sie zuerst in Zeichenketten zu konvertieren. Wenn Sie beispielsweise den Wert einer nummerierten Zeichenfolge als Teil einer verketteten Zeichenfolge verwenden möchten, hilft die Konvertierung bei der Lesbarkeit.

Im folgenden Beispiel portToken ist ein nummerencodiertes Token, das wir als Teil an unsere Lambda-Funktion übergeben möchten: 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, }); } }

Wenn wir diesen Wert an übergebenconnectionString, kann der Ausgabewert bei der Ausführung aufgrund der cdk synth nummerencodierten Zeichenfolge verwirrend sein:

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

Um ein nummerenkodiertes Token in eine Zeichenfolge umzuwandeln, verwenden Sie. cdk.Tokenization.stringifyNumber(token) Im folgenden Beispiel konvertieren wir das nummerierte Token in eine Zeichenfolge, bevor wir unsere Verbindungszeichenfolge definieren:

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, }); } }

Wenn wir ausführencdk synth, wird der Wert für unsere Verbindungszeichenfolge in einem übersichtlicheren und klareren Format dargestellt:

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

Faule Werte

Neben der Darstellung von Bereitstellungszeitwerten, wie z. B. AWS CloudFormation Parametern, werden Tokens häufig auch zur Darstellung verzögerter Werte für die Synthesedauer verwendet. Dabei handelt es sich um Werte, für die der endgültige Wert bestimmt wird, bevor die Synthese abgeschlossen ist, jedoch nicht an dem Punkt, an dem der Wert konstruiert wird. Verwenden Sie Tokens, um einen literalen Zeichenketten- oder Zahlenwert an ein anderes Konstrukt zu übergeben, wobei der tatsächliche Wert zum Zeitpunkt der Synthese von einer Berechnung abhängen kann, die noch nicht durchgeführt wurde.

Sie können Tokens erstellen, die verzögerte Synth-Time-Werte darstellen, indem Sie statische Methoden für die Lazy Klasse verwenden, z. B. und. Lazy.string Lazy.number Diese Methoden akzeptieren ein Objekt, dessen produce Eigenschaft eine Funktion ist, die ein Kontextargument akzeptiert und beim Aufruf den endgültigen Wert zurückgibt.

Im folgenden Beispiel wird eine Auto Scaling Scaling-Gruppe erstellt, deren Kapazität nach ihrer Erstellung bestimmt wird.

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;

Konvertierung nach JSON

Manchmal möchten Sie eine JSON-Zeichenfolge mit beliebigen Daten erstellen, und Sie wissen möglicherweise nicht, ob die Daten Token enthalten. Um jede Datenstruktur korrekt mit JSON zu codieren, unabhängig davon, ob sie Token enthält, verwenden Sie die Methodestack.toJsonString, wie im folgenden Beispiel gezeigt.

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 });
DatenschutzNutzungsbedingungen für die WebsiteCookie-Einstellungen
© 2025, Amazon Web Services, Inc. oder Tochtergesellschaften. Alle Rechte vorbehalten.