Token dan AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 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.

Token dan AWS CDK

Token mewakili nilai yang hanya dapat diselesaikan di lain waktu dalam siklus hidup aplikasi. Misalnya, nama bucket Amazon Simple Storage Service (Amazon S3) Simple Storage Service (Amazon S3) yang ditentukan di CDK aplikasi hanya dialokasikan saat AWS CloudFormation template disintesis. Jika Anda mencetak bucket.bucketName atribut, yang merupakan string, Anda akan melihat bahwa itu berisi sesuatu seperti berikut:

${TOKEN[Bucket.Name.1234]}

Ini adalah bagaimana AWS CDK mengkodekan token yang nilainya belum diketahui pada waktu konstruksi, tetapi akan tersedia nanti. AWS CDK Panggilan token placeholder ini. Dalam hal ini, ini adalah token yang dikodekan sebagai string.

Anda dapat melewatkan string ini seolah-olah itu adalah nama ember. Dalam contoh berikut, nama bucket ditentukan sebagai variabel lingkungan untuk AWS Lambda fungsi.

TypeScript
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket'); const fn = new lambda.Function(stack, 'MyLambda', { // ... environment: { BUCKET_NAME: bucket.bucketName, } });
JavaScript
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket'); const fn = new lambda.Function(stack, 'MyLambda', { // ... environment: { BUCKET_NAME: bucket.bucketName } });
Python
bucket = s3.Bucket(self, "amzn-s3-demo-bucket") fn = lambda_.Function(stack, "MyLambda", environment=dict(BUCKET_NAME=bucket.bucket_name))
Java
final Bucket bucket = new Bucket(this, "amzn-s3-demo-bucket"); Function fn = Function.Builder.create(this, "MyLambda") .environment(java.util.Map.of( // Map.of requires Java 9+ "BUCKET_NAME", bucket.getBucketName())) .build();
C#
var bucket = new s3.Bucket(this, "amzn-s3-demo-bucket"); var fn = new Function(this, "MyLambda", new FunctionProps { Environment = new Dictionary<string, string> { ["BUCKET_NAME"] = bucket.BucketName } });

Ketika AWS CloudFormation template akhirnya disintesis, token dirender sebagai intrinsik. AWS CloudFormation { "Ref": "amzn-s3-demo-bucket" } Pada waktu penerapan, AWS CloudFormation ganti intrinsik ini dengan nama sebenarnya dari bucket yang dibuat.

Token dan pengkodean token

Token adalah objek yang mengimplementasikan IResolvableantarmuka, yang berisi satu resolve metode. AWS CDK Memanggil metode ini selama sintesis untuk menghasilkan nilai akhir untuk AWS CloudFormation template. Token berpartisipasi dalam proses sintesis untuk menghasilkan nilai arbitrer dari jenis apa pun.

catatan

Anda jarang akan bekerja secara langsung dengan IResolvable antarmuka. Anda kemungkinan besar hanya akan melihat versi token yang disandikan string.

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 kelas CDK.token.

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.

Untuk memeriksa apakah suatu nilai memiliki token yang belum terselesaikan di dalamnya, panggil metode Token.isUnresolved (Pythonis_unresolved:).

Contoh berikut memvalidasi bahwa nilai string, yang bisa berupa token, panjangnya tidak lebih dari 10 karakter.

TypeScript
if (!Token.isUnresolved(name) && name.length > 10) { throw new Error(`Maximum length for name is 10 characters`); }
JavaScript
if ( !Token.isUnresolved(name) && name.length > 10) { throw ( new Error(`Maximum length for name is 10 characters`)); }
Python
if not Token.is_unresolved(name) and len(name) > 10: raise ValueError("Maximum length for name is 10 characters")
Java
if (!Token.isUnresolved(name) && name.length() > 10) throw new IllegalArgumentException("Maximum length for name is 10 characters");
C#
if (!Token.IsUnresolved(name) && name.Length > 10) throw new ArgumentException("Maximum length for name is 10 characters");

Jika nama adalah token, validasi tidak dilakukan, dan kesalahan masih dapat terjadi di tahap selanjutnya dalam siklus hidup, seperti selama penerapan.

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.

Token yang dikodekan 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.

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

Anda juga dapat menggunakan interpolasi string, jika bahasa Anda mendukungnya, seperti yang ditunjukkan pada contoh berikut.

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

Hindari memanipulasi string dengan cara lain. Misalnya, mengambil substring string kemungkinan akan merusak token string.

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.

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. Satu-satunya operasi yang diizinkan adalah meneruskan nilai ke konstruksi lain.

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 lazy.String dan 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.

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;

Konversi ke JSON

Terkadang Anda ingin menghasilkan JSON serangkaian data arbitrer, dan Anda mungkin tidak tahu apakah data tersebut berisi token. Untuk JSON menyandikan struktur data dengan benar, terlepas dari apakah itu berisi token, gunakan tumpukan metode. toJsonString, seperti yang ditunjukkan pada contoh berikut.

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