Nilai konteks 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.

Nilai konteks dan AWS CDK

Nilai konteks adalah pasangan nilai kunci yang dapat dikaitkan dengan aplikasi, tumpukan, atau konstruksi. Mereka dapat diberikan ke aplikasi Anda dari file (biasanya salah satu cdk.json atau cdk.context.json di direktori proyek Anda) atau pada baris perintah.

CDKToolkit menggunakan konteks untuk menyimpan nilai yang diambil dari AWS akun Anda selama sintesis. Nilai termasuk Availability Zone di akun Anda atau Amazon Machine Image (AMI) yang IDs saat ini tersedia untuk EC2 instans Amazon. Karena nilai-nilai ini disediakan oleh AWS akun Anda, mereka dapat berubah di antara proses CDK aplikasi Anda. Ini menjadikan mereka sumber potensial perubahan yang tidak diinginkan. Perilaku cache CDK Toolkit “membekukan” nilai-nilai ini untuk CDK aplikasi Anda hingga Anda memutuskan untuk menerima nilai baru.

Bayangkan skenario berikut tanpa cache konteks. Katakanlah Anda menentukan “Amazon Linux terbaru” sebagai EC2 contoh Amazon Anda, dan versi baru ini AMI dirilis. AMI Kemudian, lain kali Anda menerapkan CDK tumpukan Anda, instance Anda yang sudah diterapkan akan menggunakan yang sudah ketinggalan zaman (“salah”) AMI dan perlu ditingkatkan. Memutakhirkan akan mengakibatkan penggantian semua instance Anda yang ada dengan yang baru, yang mungkin tidak terduga dan tidak diinginkan.

Sebagai gantinya, CDK catatan akun Anda tersedia AMIs di cdk.context.json file proyek Anda, dan menggunakan nilai tersimpan untuk operasi sintesis masa depan. Dengan cara ini, daftar AMIs tidak lagi menjadi sumber perubahan potensial. Anda juga dapat yakin bahwa tumpukan Anda akan selalu disintesis ke templat yang sama AWS CloudFormation .

Tidak semua nilai konteks adalah nilai cache dari AWS lingkungan Anda. AWS CDK bendera fiturjuga nilai konteks. Anda juga dapat membuat nilai konteks Anda sendiri untuk digunakan oleh aplikasi atau konstruksi Anda.

Kunci konteks adalah string. Nilai dapat berupa jenis apa pun yang didukung olehJSON: angka, string, array, atau objek.

Tip

Jika konstruksi Anda membuat nilai konteksnya sendiri, sertakan nama paket perpustakaan Anda di kuncinya sehingga tidak akan bertentangan dengan nilai konteks paket lain.

Banyak nilai konteks dikaitkan dengan AWS lingkungan tertentu, dan CDK aplikasi tertentu dapat diterapkan di lebih dari satu lingkungan. Kunci untuk nilai tersebut mencakup AWS akun dan Wilayah sehingga nilai dari lingkungan yang berbeda tidak bertentangan.

Kunci konteks berikut menggambarkan format yang digunakan oleh AWS CDK, termasuk akun dan Wilayah.

availability-zones:account=123456789012:region=eu-central-1
penting

Nilai konteks cache dikelola oleh AWS CDK dan konstruksinya, termasuk konstruksi yang dapat Anda tulis. Jangan menambahkan atau mengubah nilai konteks cache dengan mengedit file secara manual. Akan tetapi, berguna untuk meninjau cdk.context.json sesekali untuk melihat nilai apa yang sedang di-cache. Nilai konteks yang tidak mewakili nilai cache harus disimpan di bawah context kunci. cdk.json Dengan cara ini, mereka tidak akan dihapus ketika nilai cache dihapus.

Sumber nilai konteks

Nilai konteks dapat diberikan ke AWS CDK aplikasi Anda dengan enam cara berbeda:

  • Secara otomatis dari AWS akun saat ini.

  • Melalui --context opsi ke cdk perintah. (Nilai-nilai ini selalu string.)

  • Dalam cdk.context.json file proyek.

  • Di context kunci cdk.json file proyek.

  • Di context kunci ~/.cdk.json file Anda.

  • Di AWS CDK aplikasi Anda menggunakan construct.node.setContext() metode ini.

File proyek cdk.context.json adalah tempat nilai konteks AWS CDK cache diambil dari akun Anda AWS . Praktik ini menghindari perubahan tak terduga pada penerapan Anda saat, misalnya, Availability Zone baru diperkenalkan. AWS CDK Tidak menulis data konteks ke salah satu file lain yang terdaftar.

penting

Karena mereka adalah bagian dari status aplikasi Anda, cdk.json dan cdk.context.json harus berkomitmen untuk kontrol sumber bersama dengan kode sumber aplikasi lainnya. Jika tidak, penerapan di lingkungan lain (misalnya, pipeline CI) mungkin menghasilkan hasil yang tidak konsisten.

Nilai-nilai konteks tercakup pada konstruksi yang menciptakannya; mereka terlihat oleh konstruksi anak, tetapi tidak untuk orang tua atau saudara kandung. Nilai konteks yang ditetapkan oleh AWS CDK Toolkit (cdkperintah) dapat diatur secara otomatis, dari file, atau dari --context opsi. Nilai konteks dari sumber-sumber ini secara implisit ditetapkan pada konstruksi. App Oleh karena itu, mereka terlihat oleh setiap konstruksi di setiap tumpukan di aplikasi.

Aplikasi Anda dapat membaca nilai konteks menggunakan construct.node.tryGetContext metode ini. Jika entri yang diminta tidak ditemukan pada konstruksi saat ini atau salah satu induknya, hasilnya adalahundefined. (Atau, hasilnya bisa setara dengan bahasa Anda, seperti None di Python.)

Metode konteks

AWS CDK Mendukung beberapa metode konteks yang memungkinkan AWS CDK aplikasi memperoleh informasi kontekstual dari lingkungan. AWS Misalnya, Anda bisa mendapatkan daftar Availability Zone yang tersedia di AWS akun dan Wilayah tertentu, menggunakan tumpukan. availabilityZonesmetode.

Berikut ini adalah metode konteksnya:

HostedZone.fromLookup

Mendapatkan zona yang dihosting di akun Anda.

tumpukan. availabilityZones

Mendapatkan Availability Zone yang didukung.

StringParameter.valueFromLookup

Mendapat nilai dari Amazon EC2 Systems Manager Parameter Store Wilayah saat ini.

Vpc. fromLookup

Mendapatkan Amazon Virtual Private Clouds yang ada di akun Anda.

LookupMachineImage

Mencari image mesin untuk digunakan dengan NAT instance di Amazon Virtual Private Cloud.

Jika nilai konteks yang diperlukan tidak tersedia, AWS CDK aplikasi akan memberi tahu CDK Toolkit bahwa informasi konteks tidak ada. Selanjutnya, CLI kueri AWS akun saat ini untuk informasi dan menyimpan informasi konteks yang dihasilkan dalam cdk.context.json file. Kemudian, ia mengeksekusi AWS CDK aplikasi lagi dengan nilai konteks.

Melihat dan mengelola konteks

Gunakan cdk context perintah untuk melihat dan mengelola informasi dalam cdk.context.json file Anda. Untuk melihat informasi ini, gunakan cdk context perintah tanpa opsi apa pun. Outputnya harus seperti berikut ini.

Context found in cdk.json:

┌───┬─────────────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────┐
│ # │ Key                                                         │ Value                                                   │
├───┼─────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ 1 │ availability-zones:account=123456789012:region=eu-central-1 │ [ "eu-central-1a", "eu-central-1b", "eu-central-1c" ]   │
├───┼─────────────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────┤
│ 2 │ availability-zones:account=123456789012:region=eu-west-1    │ [ "eu-west-1a", "eu-west-1b", "eu-west-1c" ]            │
└───┴─────────────────────────────────────────────────────────────┴─────────────────────────────────────────────────────────┘

Run cdk context --reset KEY_OR_NUMBER to remove a context key. If it is a cached value, it will be refreshed on the next cdk synth.

Untuk menghapus nilai konteks, jalankancdk context --reset, tentukan kunci atau angka yang sesuai dengan nilai. Contoh berikut menghapus nilai yang sesuai dengan kunci kedua dalam contoh sebelumnya. Nilai ini mewakili daftar Availability Zone di Wilayah Eropa (Irlandia).

cdk context --reset 2
Context value
availability-zones:account=123456789012:region=eu-west-1
reset. It will be refreshed on the next SDK synthesis run.

Oleh karena itu, jika Anda ingin memperbarui ke versi terbaru Amazon LinuxAMI, gunakan contoh sebelumnya untuk melakukan pembaruan terkontrol dari nilai konteks dan mengatur ulang. Kemudian, sintesis dan terapkan aplikasi Anda lagi.

cdk synth

Untuk menghapus semua nilai konteks yang disimpan untuk aplikasi Anda, jalankancdk context --clear, sebagai berikut.

cdk context --clear

Hanya nilai konteks yang disimpan di cdk.context.json dapat diatur ulang atau dihapus. AWS CDK Tidak menyentuh nilai konteks lainnya. Oleh karena itu, untuk melindungi nilai konteks agar tidak disetel ulang menggunakan perintah ini, Anda dapat menyalin nilainyacdk.json.

AWS CDK Bendera toolkit --context

Gunakan opsi --context (-csingkatnya) untuk meneruskan nilai konteks runtime ke CDK aplikasi Anda selama sintesis atau penerapan.

cdk synth --context key=value MyStack

Untuk menentukan beberapa nilai konteks, ulangi --context opsi beberapa kali, berikan satu pasangan kunci-nilai setiap kali.

cdk synth --context key1=value1 --context key2=value2 MyStack

Saat mensintesis beberapa tumpukan, nilai konteks yang ditentukan diteruskan ke semua tumpukan. Untuk memberikan nilai konteks yang berbeda ke tumpukan individu, gunakan kunci yang berbeda untuk nilai, atau gunakan beberapa cdk synth atau cdk deploy perintah.

Nilai konteks yang diteruskan dari baris perintah selalu string. Jika nilai biasanya dari beberapa jenis lain, kode Anda harus siap untuk mengonversi atau mengurai nilai. Anda mungkin memiliki nilai konteks non-string yang disediakan dengan cara lain (misalnya, dalamcdk.context.json). Untuk memastikan nilai semacam ini berfungsi seperti yang diharapkan, konfirmasikan bahwa nilainya adalah string sebelum mengonversinya.

Contoh

Berikut ini adalah contoh menggunakan Amazon yang ada VPC menggunakan AWS CDK konteks.

TypeScript
import * as cdk from 'aws-cdk-lib'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; import { Construct } from 'constructs'; export class ExistsVpcStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const vpcid = this.node.tryGetContext('vpcid'); const vpc = ec2.Vpc.fromLookup(this, 'VPC', { vpcId: vpcid, }); const pubsubnets = vpc.selectSubnets({subnetType: ec2.SubnetType.PUBLIC}); new cdk.CfnOutput(this, 'publicsubnets', { value: pubsubnets.subnetIds.toString(), }); } }
JavaScript
const cdk = require('aws-cdk-lib'); const ec2 = require('aws-cdk-lib/aws-ec2'); class ExistsVpcStack extends cdk.Stack { constructor(scope, id, props) { super(scope, id, props); const vpcid = this.node.tryGetContext('vpcid'); const vpc = ec2.Vpc.fromLookup(this, 'VPC', { vpcId: vpcid }); const pubsubnets = vpc.selectSubnets({subnetType: ec2.SubnetType.PUBLIC}); new cdk.CfnOutput(this, 'publicsubnets', { value: pubsubnets.subnetIds.toString() }); } } module.exports = { ExistsVpcStack }
Python
import aws_cdk as cdk import aws_cdk.aws_ec2 as ec2 from constructs import Construct class ExistsVpcStack(cdk.Stack): def __init__(scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) vpcid = self.node.try_get_context("vpcid") vpc = ec2.Vpc.from_lookup(self, "VPC", vpc_id=vpcid) pubsubnets = vpc.select_subnets(subnetType=ec2.SubnetType.PUBLIC) cdk.CfnOutput(self, "publicsubnets", value=pubsubnets.subnet_ids.to_string())
Java
import software.amazon.awscdk.CfnOutput; import software.amazon.awscdk.services.ec2.Vpc; import software.amazon.awscdk.services.ec2.VpcLookupOptions; import software.amazon.awscdk.services.ec2.SelectedSubnets; import software.amazon.awscdk.services.ec2.SubnetSelection; import software.amazon.awscdk.services.ec2.SubnetType; import software.constructs.Construct; public class ExistsVpcStack extends Stack { public ExistsVpcStack(Construct context, String id) { this(context, id, null); } public ExistsVpcStack(Construct context, String id, StackProps props) { super(context, id, props); String vpcId = (String)this.getNode().tryGetContext("vpcid"); Vpc vpc = (Vpc)Vpc.fromLookup(this, "VPC", VpcLookupOptions.builder() .vpcId(vpcId).build()); SelectedSubnets pubSubNets = vpc.selectSubnets(SubnetSelection.builder() .subnetType(SubnetType.PUBLIC).build()); CfnOutput.Builder.create(this, "publicsubnets") .value(pubSubNets.getSubnetIds().toString()).build(); } }
C#
using Amazon.CDK; using Amazon.CDK.AWS.EC2; using Constructs; class ExistsVpcStack : Stack { public ExistsVpcStack(Construct scope, string id, StackProps props) : base(scope, id, props) { var vpcId = (string)this.Node.TryGetContext("vpcid"); var vpc = Vpc.FromLookup(this, "VPC", new VpcLookupOptions { VpcId = vpcId }); SelectedSubnets pubSubNets = vpc.SelectSubnets([new SubnetSelection { SubnetType = SubnetType.PUBLIC }]); new CfnOutput(this, "publicsubnets", new CfnOutputProps { Value = pubSubNets.SubnetIds.ToString() }); } }

Anda dapat menggunakan cdk diff untuk melihat efek dari meneruskan nilai konteks pada baris perintah:

cdk diff -c vpcid=vpc-0cb9c31031d0d3e22
Stack ExistsvpcStack
Outputs
[+] Output publicsubnets publicsubnets: {"Value":"subnet-06e0ea7dd302d3e8f,subnet-01fc0acfb58f3128f"}

Nilai konteks yang dihasilkan dapat dilihat seperti yang ditunjukkan di sini.

cdk context -j
{
  "vpc-provider:account=123456789012:filter.vpc-id=vpc-0cb9c31031d0d3e22:region=us-east-1": {
    "vpcId": "vpc-0cb9c31031d0d3e22",
    "availabilityZones": [
      "us-east-1a",
      "us-east-1b"
    ],
    "privateSubnetIds": [
      "subnet-03ecfc033225be285",
      "subnet-0cded5da53180ebfa"
    ],
    "privateSubnetNames": [
      "Private"
    ],
    "privateSubnetRouteTableIds": [
      "rtb-0e955393ced0ada04",
      "rtb-05602e7b9f310e5b0"
    ],
    "publicSubnetIds": [
      "subnet-06e0ea7dd302d3e8f",
      "subnet-01fc0acfb58f3128f"
    ],
    "publicSubnetNames": [
      "Public"
    ],
    "publicSubnetRouteTableIds": [
      "rtb-00d1fdfd823c82289",
      "rtb-04bb1969b42969bcb"
    ]
  }
}