Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Di dalamnya AWS Cloud Development Kit (AWS CDK), token adalah placeholder untuk nilai yang tidak diketahui saat mendefinisikan konstruksi atau mensintesis tumpukan. Nilai-nilai ini akan sepenuhnya diselesaikan pada penerapan, ketika infrastruktur Anda yang sebenarnya dibuat. Saat mengembangkan AWS CDK aplikasi, Anda akan bekerja dengan token untuk mengelola nilai-nilai ini di seluruh aplikasi Anda.
Contoh token
Berikut ini adalah contoh tumpukan CDK yang mendefinisikan konstruksi untuk bucket Amazon Simple Storage Service (Amazon S3). Karena nama bucket kami belum diketahui, nilai untuk bucketName
disimpan sebagai token:
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);
}
}
Ketika kita menjalankan cdk synth
untuk mensintesis tumpukan kita, nilai untuk myBucketName
akan ditampilkan dalam format token. ${Token[TOKEN.
Format token ini adalah hasil dari cara AWS CDK mengkodekan token. Dalam contoh ini, token dikodekan sebagai string:1234
]}
$
cdk synth --quiet
myBucketName: ${Token[TOKEN.21
]}
Karena nilai untuk nama bucket kami tidak diketahui saat sintesis, token dirender sebagaimyBucket
. AWS CloudFormation Template kami menggunakan fungsi <unique-hash>
Ref
intrinsik untuk mereferensikan nilainya, yang akan diketahui saat penerapan:
Resources:
myBucket5AF9C99B
:
# ...
Outputs:
bucketNameOutput:
Description: The name of the S3 bucket
Value:
Ref: myBucket5AF9C99B
Untuk informasi lebih lanjut tentang bagaimana hash unik dihasilkan, lihatDihasilkan logis IDs di AWS CloudFormation template Anda.
Melewati token
Token dapat diedarkan seolah-olah itu adalah nilai aktual yang mereka wakili. Berikut ini adalah contoh yang meneruskan token untuk nama bucket kami ke konstruksi untuk suatu AWS Lambda fungsi:
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
}
});
}
}
Saat kita mensintesis template kita, fungsi Ref
dan Fn::Join
intrinsik digunakan untuk menentukan nilai, yang akan diketahui saat penerapan:
Resources:
myBucket5AF9C99B
:
Type: AWS::S3::Bucket
# ...
myFunction884E1557
:
Type: AWS::Lambda::Function
Properties:
# ...
Environment:
Variables:
BUCKET_NAME:
Ref: myBucket5AF9C99B
FunctionName:
Fn::Join:
- ""
- - Ref: myBucket5AF9C99B
- Function
# ...
Cara kerja pengkodean token
Token adalah objek yang mengimplementasikan IResolvable
antarmuka, yang berisi satu resolve
metode. Selama sintesis, AWS CDK memanggil metode ini untuk menghasilkan nilai akhir untuk token dalam CloudFormation template Anda.
catatan
Anda jarang akan bekerja secara langsung dengan IResolvable
antarmuka. Anda kemungkinan besar hanya akan melihat versi token yang disandikan string.
Jenis pengkodean token
Token berpartisipasi dalam proses sintesis untuk menghasilkan nilai arbitrer dari jenis apa pun. Fungsi lain biasanya hanya menerima argumen tipe dasar, seperti string
ataunumber
. Untuk menggunakan token dalam kasus ini, Anda dapat menyandikannya menjadi salah satu dari tiga jenis dengan menggunakan metode statis pada cdk.Token
kelas.
-
Token.asString
untuk menghasilkan pengkodean string (atau memanggil.toString()
objek token). -
Token.asList
untuk menghasilkan encoding daftar. -
Token.asNumber
untuk menghasilkan pengkodean numerik.
Ini mengambil nilai arbitrer, yang bisa berupaIResolvable
, dan menyandikannya menjadi nilai primitif dari tipe yang ditunjukkan.
penting
Karena salah satu tipe sebelumnya berpotensi menjadi token yang dikodekan, berhati-hatilah saat Anda mengurai atau mencoba membaca isinya. Misalnya, jika Anda mencoba mengurai string untuk mengekstrak nilai darinya, dan string adalah token yang dikodekan, penguraian Anda gagal. Demikian pula, jika Anda mencoba menanyakan panjang array atau melakukan operasi matematika dengan angka, Anda harus terlebih dahulu memverifikasi bahwa itu bukan token yang dikodekan.
Cara memeriksa token di aplikasi Anda
Untuk memeriksa apakah suatu nilai memiliki token yang belum terselesaikan di dalamnya, panggil metode Token.isUnresolved
(Pythonis_unresolved
:). Berikut ini adalah contoh yang memeriksa apakah nilai untuk nama bucket Amazon S3 kami adalah token. Jika bukan token, kami kemudian memvalidasi panjang nama bucket:
// ...
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.');
};
// ...
Ketika kita menjalankan cdk synth
myBucketName
, diidentifikasi sebagai token:
$
cdk synth --quiet
Token identified.
catatan
Anda dapat menggunakan pengkodean token untuk keluar dari sistem tipe. Misalnya, Anda dapat mengkodekan string token yang menghasilkan nilai angka pada waktu sintesis. Jika Anda menggunakan fungsi-fungsi ini, Anda bertanggung jawab untuk memastikan bahwa template Anda menyelesaikan ke status yang dapat digunakan setelah sintesis.
Bekerja dengan token yang disandikan string
Token yang disandikan string terlihat seperti berikut ini.
${TOKEN[Bucket.Name.1234]}
Mereka dapat diteruskan seperti string biasa, dan dapat digabungkan, seperti yang ditunjukkan pada contoh berikut.
const functionName = bucket.bucketName + 'Function';
Anda juga dapat menggunakan interpolasi string, jika bahasa Anda mendukungnya, seperti yang ditunjukkan pada contoh berikut.
const functionName = `${bucket.bucketName}Function`;
Hindari memanipulasi string dengan cara lain. Misalnya, mengambil substring string kemungkinan akan merusak token string.
Bekerja dengan token yang dikodekan daftar
Token yang dikodekan daftar terlihat seperti berikut:
["#{TOKEN[Stack.NotificationArns.1234]}"]
Satu-satunya hal yang aman untuk dilakukan dengan daftar ini adalah meneruskannya langsung ke konstruksi lain. Token dalam bentuk daftar string tidak dapat digabungkan, juga elemen tidak dapat diambil dari token. Satu-satunya cara aman untuk memanipulasinya adalah dengan menggunakan fungsi AWS CloudFormation intrinsik seperti fn.Select.
Bekerja dengan token yang dikodekan angka
Token yang dikodekan angka adalah sekumpulan angka floating-point negatif kecil yang terlihat seperti berikut ini.
-1.8881545897087626e+289
Seperti halnya token daftar, Anda tidak dapat mengubah nilai angka, karena hal itu kemungkinan akan merusak token angka.
Berikut ini adalah contoh konstruksi yang berisi token yang dikodekan sebagai angka:
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);
}
}
Saat kita menjalankancdk synth
, nilai untuk ditampilkan sebagai token yang portToken
dikodekan angka:
$
cdk synth --quiet
portToken: -1.8881545897087968e+289
Lulus token yang dikodekan nomor
Saat Anda meneruskan token yang dikodekan angka ke konstruksi lain, mungkin masuk akal untuk mengonversinya menjadi string terlebih dahulu. Misalnya, jika Anda ingin menggunakan nilai string yang dikodekan angka sebagai bagian dari string gabungan, mengonversinya membantu keterbacaan.
Dalam contoh berikut, portToken
adalah token yang dikodekan angka yang ingin kita teruskan ke fungsi Lambda kita sebagai bagian dari: connectionString
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,
});
}
}
Jika kita meneruskan nilai iniconnectionString
, nilai output saat kita menjalankan cdk synth
mungkin membingungkan karena string yang dikodekan angka:
$
cdk synth --quiet
connectionString: jdbc:mysql://mydb.cluster.amazonaws.com:-1.888154589708796e+289/mydatabase
Untuk mengonversi token yang dikodekan angka menjadi string, gunakan. cdk.Tokenization.stringifyNumber(
Dalam contoh berikut, kita mengubah token yang dikodekan angka menjadi string sebelum mendefinisikan string koneksi kita:token
)
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,
});
}
}
Saat kami menjalankancdk synth
, nilai untuk string koneksi kami direpresentasikan dalam format yang lebih bersih dan lebih jelas:
$
cdk synth --quiet
connectionString: jdbc:mysql://mydb.cluster.amazonaws.com:${Token[TOKEN.242]}/mydatabase
Nilai malas
Selain mewakili nilai deploy-time, seperti AWS CloudFormation parameter, token juga biasa digunakan untuk mewakili nilai malas waktu sintesis. Ini adalah nilai yang nilai akhirnya akan ditentukan sebelum sintesis selesai, tetapi tidak pada titik di mana nilai dibangun. Gunakan token untuk meneruskan string literal atau nilai angka ke konstruksi lain, sedangkan nilai aktual pada waktu sintesis mungkin bergantung pada beberapa perhitungan yang belum terjadi.
Anda dapat membuat token yang mewakili nilai malas synth-time menggunakan metode statis pada Lazy
kelas, seperti dan. Lazy.string
Lazy.number
Metode ini menerima objek yang produce
propertinya adalah fungsi yang menerima argumen konteks dan mengembalikan nilai akhir ketika dipanggil.
Contoh berikut membuat grup Auto Scaling yang kapasitasnya ditentukan setelah pembuatannya.
let actualValue: number;
new AutoScalingGroup(this, 'Group', {
desiredCapacity: Lazy.numberValue({
produce(context) {
return actualValue;
}
})
});
// At some later point
actualValue = 10;
Konversi ke JSON
Terkadang Anda ingin menghasilkan string JSON dari data arbitrer, dan Anda mungkin tidak tahu apakah data tersebut berisi token. Untuk mengkodekan struktur data dengan benar JSON, terlepas dari apakah itu berisi token, gunakan metode inistack.toJsonString
, seperti yang ditunjukkan pada contoh berikut.
const stack = Stack.of(this);
const str = stack.toJsonString({
value: bucket.bucketName
});