選取您的 Cookie 偏好設定

我們使用提供自身網站和服務所需的基本 Cookie 和類似工具。我們使用效能 Cookie 收集匿名統計資料,以便了解客戶如何使用我們的網站並進行改進。基本 Cookie 無法停用,但可以按一下「自訂」或「拒絕」以拒絕效能 Cookie。

如果您同意,AWS 與經核准的第三方也會使用 Cookie 提供實用的網站功能、記住您的偏好設定,並顯示相關內容,包括相關廣告。若要接受或拒絕所有非必要 Cookie,請按一下「接受」或「拒絕」。若要進行更詳細的選擇,請按一下「自訂」。

內容值和 AWS CDK

焦點模式
內容值和 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

內容值是可與應用程式、堆疊或建構相關聯的鍵值對。它們可能從 檔案 (通常是cdk.context.json您專案目錄中的 cdk.json或 ) 或在命令列上提供給應用程式。

CDK Toolkit 使用內容來快取在合成期間從您的 AWS 帳戶擷取的值。值包括您帳戶中的可用區域,或目前可用於 Amazon EC2 執行個體的 Amazon Machine Image (AMI) IDs。由於這些值是由 AWS 您的帳戶所提供,因此它們可以在 CDK 應用程式執行之間變更。這使得它們成為意外變更的潛在來源。CDK Toolkit 的快取行為「凍結」CDK 應用程式的這些值,直到您決定接受新值為止。

假設以下案例沒有內容快取。假設您指定了「最近的 Amazon Linux」作為 Amazon EC2 執行個體的 AMI,並發行了此 AMI 的新版本。然後,下次部署 CDK 堆疊時,您已部署的執行個體會使用過時的 (「錯誤」) AMI,而且需要升級。升級會導致將所有現有執行個體取代為新的執行個體,這可能會是非預期且不需要的。

反之,CDK 會將您帳戶的可用 AMIs 記錄在專案的 cdk.context.json 檔案中,並使用儲存的值進行未來的合成操作。如此一來,AMIs的清單就不再是潛在的變更來源。您也可以確定您的堆疊一律會合成至相同的 AWS CloudFormation 範本。

並非所有內容值都是來自您 AWS 環境的快取值。 AWS CDK 功能旗標 也是內容值。您也可以建立自己的內容值,以供應用程式或建構使用。

內容索引鍵是字串。值可以是 JSON 支援的任何類型:數字、字串、陣列或物件。

提示

如果您的建構建立自己的內容值,請將程式庫的套件名稱納入其金鑰中,以免與其他套件的內容值衝突。

許多內容值與特定 AWS 環境相關聯,而指定的 CDK 應用程式可以部署在多個環境中。這類值的索引鍵包含 AWS 帳戶和區域,因此來自不同環境的值不會衝突。

下列內容索引鍵說明 使用的格式 AWS CDK,包括 帳戶和 區域。

availability-zones:account=123456789012:region=eu-central-1
重要

快取內容值由 AWS CDK 及其建構管理,包括您可能寫入的建構。請勿透過手動編輯檔案來新增或變更快取內容值。不過,cdk.context.json偶爾檢閱以查看快取哪些值可能很有用。不代表快取值的內容值應存放在 的 context金鑰下cdk.json。如此一來,快取值清除時,就不會將其清除。

內容值的來源

內容值可以透過六種不同方式提供給您 AWS CDK 的應用程式:

  • 從目前 AWS 帳戶自動執行。

  • 透過 --context cdk命令的選項。(這些值一律為字串。)

  • 在專案的 cdk.context.json檔案中。

  • 在專案cdk.json檔案的 context金鑰中。

  • 在您的 ~/.cdk.json 檔案的 context金鑰中。

  • 在您的 AWS CDK 應用程式中使用 construct.node.setContext()方法。

專案檔案cdk.context.json是 AWS CDK 快取從您的 AWS 帳戶擷取的內容值的地方。例如,當引進新的可用區域時,此做法可避免意外變更您的部署。 AWS CDK 不會將內容資料寫入列出的任何其他檔案。

重要

因為它們是應用程式狀態的一部分,cdk.json因此cdk.context.json必須致力於控制原始碼以及應用程式的其餘原始碼。否則,在其他環境中的部署 (例如 CI 管道) 可能會產生不一致的結果。

內容值的範圍是建立它們的建構;子建構可以看到這些值,但不適用於父系或兄弟。 AWS CDK Toolkit ( cdk命令) 設定的內容值可以自動設定、從檔案或從 --context選項設定。來自這些來源的內容值會隱含地設定在App建構體上。因此,應用程式中每個堆疊中的每個建構都可看見它們。

您的應用程式可以使用 construct.node.tryGetContext方法讀取內容值。如果在目前的建構或其任何父項上找不到請求的項目,則結果為 undefined。(或者,結果可以是您的語言的同等項目,例如 None Python。)

內容方法

AWS CDK 支援數種內容方法,可讓 AWS CDK 應用程式從 AWS 環境取得內容資訊。例如,您可以使用 stack.availabilityZones 方法,取得指定 AWS 帳戶和區域中可用的可用區域清單。

以下是內容方法:

HostedZone.fromLookup

取得您帳戶中的託管區域。

stack.availabilityZones

取得支援的可用區域。

StringParameter.valueFromLookup

從目前區域的 Amazon EC2 Systems Manager 參數存放區取得值。

Vpc.fromLookup

取得您帳戶中現有的 Amazon Virtual Private Clouds。

LookupMachineImage

在 Amazon Virtual Private Cloud 中尋找機器映像,以搭配 NAT 執行個體使用。

如果沒有可用的必要內容值, AWS CDK 應用程式會通知 CDK Toolkit 缺少內容資訊。接下來,CLI 會查詢目前的 AWS 帳戶以取得資訊,並將產生的內容資訊儲存在cdk.context.json檔案中。然後,它會使用內容值再次執行 AWS CDK 應用程式。

檢視和管理內容

使用 cdk context命令來檢視和管理 cdk.context.json 檔案中的資訊。若要查看此資訊,請使用 cdk context命令,而不使用任何選項。輸出應該如下。

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.

若要移除內容值,請執行 cdk context --reset,指定值的對應索引鍵或數字。下列範例會移除對應至上述範例中第二個索引鍵的值。此值代表歐洲 (愛爾蘭) 區域的可用區域清單。

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.

因此,如果您想要更新至最新版本的 Amazon Linux AMI,請使用上述範例對內容值進行受控更新並加以重設。然後,再次合成和部署您的應用程式。

cdk synth

若要清除應用程式的所有儲存內容值,請執行 cdk context --clear,如下所示。

cdk context --clear

只有存放在 的內容值cdk.context.json可以重設或清除。 AWS CDK 不會觸碰其他內容值。因此,為了保護內容值不被使用這些命令重設,您可以將該值複製到 cdk.json

AWS CDK 工具組--context旗標

使用 --context(-c for short) 選項,在合成或部署期間將執行時間內容值傳遞至 CDK 應用程式。

cdk synth --context key=value MyStack

若要指定多個內容值,請重複--context選項任意次數,每次提供一個索引鍵/值對。

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

合成多個堆疊時,指定的內容值會傳遞至所有堆疊。若要為個別堆疊提供不同的內容值,請對值使用不同的索引鍵,或使用多個 cdk synthcdk deploy 命令。

從命令列傳遞的內容值一律為字串。如果值通常為其他類型,您的程式碼必須準備好轉換或剖析該值。您可能以其他方式提供非字串內容值 (例如,在 中cdk.context.json)。若要確保這類值如預期般運作,請在轉換前確認該值是字串。

範例

以下是使用 AWS CDK 內容使用現有 Amazon VPC 的範例。

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

您可以使用 cdk diff 來查看在命令列上傳遞內容值的效果:

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

產生的內容值可以檢視,如下所示。

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"
    ]
  }
}

下一個主題:

特徵旗標

上一個主題:

許可
隱私權網站條款Cookie 偏好設定
© 2025, Amazon Web Services, Inc.或其附屬公司。保留所有權利。