选择您的 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 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在构建 AWS Cloud Development Kit (AWS CDK) 应用程序时,您将使用多种类型的标识符和名称。为了 AWS CDK 有效使用标识符并避免错误,了解标识符的类型非常重要。

标识符在创建其的作用域内必须是唯一的;它们在 AWS CDK 应用程序中不必是全局唯一的。

如果您尝试在同一范围内创建具有相同值的标识符,则会 AWS CDK 引发异常。

构造 IDs

最常见的标识符 id 是在实例化构造对象时作为第二个参数传递的标识符。与所有标识符一样,此标识符只需要在创建它的作用域内是唯一的,该作用域是实例化构造对象时的第一个参数。

注意

堆栈的 id 的也是您在 AWS CDK CLI 参考 中用来对其进行引用的标识符。

我们来看一个示例,其中我们的应用程序中有两个带有标识符 MyBucket 的构造。第一个是在堆栈的作用域中定义的,标识符为 Stack1。第二个是在堆栈的作用域中定义的,标识符为 Stack2。因为它们是在不同的作用域中定义的,所以这不会造成任何冲突,而且它们可以共存于同一个应用程序中而不会导致问题。

TypeScript
import { App, Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; class MyStack extends Stack { constructor(scope: Construct, id: string, props: StackProps = {}) { super(scope, id, props); new s3.Bucket(this, 'MyBucket'); } } const app = new App(); new MyStack(app, 'Stack1'); new MyStack(app, 'Stack2');
JavaScript
const { App , Stack } = require('aws-cdk-lib'); const s3 = require('aws-cdk-lib/aws-s3'); class MyStack extends Stack { constructor(scope, id, props = {}) { super(scope, id, props); new s3.Bucket(this, 'MyBucket'); } } const app = new App(); new MyStack(app, 'Stack1'); new MyStack(app, 'Stack2');
Python
from aws_cdk import App, Construct, Stack, StackProps from constructs import Construct from aws_cdk import aws_s3 as s3 class MyStack(Stack): def __init__(self, scope: Construct, id: str, **kwargs): super().__init__(scope, id, **kwargs) s3.Bucket(self, "MyBucket") app = App() MyStack(app, 'Stack1') MyStack(app, 'Stack2')
Java
// MyStack.java package com.myorg; import software.amazon.awscdk.App; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.constructs.Construct; import software.amazon.awscdk.services.s3.Bucket; public class MyStack extends Stack { public MyStack(final Construct scope, final String id) { this(scope, id, null); } public MyStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); new Bucket(this, "MyBucket"); } } // Main.java package com.myorg; import software.amazon.awscdk.App; public class Main { public static void main(String[] args) { App app = new App(); new MyStack(app, "Stack1"); new MyStack(app, "Stack2"); } }
C#
using Amazon.CDK; using constructs; using Amazon.CDK.AWS.S3; public class MyStack : Stack { public MyStack(Construct scope, string id, IStackProps props) : base(scope, id, props) { new Bucket(this, "MyBucket"); } } class Program { static void Main(string[] args) { var app = new App(); new MyStack(app, "Stack1"); new MyStack(app, "Stack2"); } }
import { App, Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as s3 from 'aws-cdk-lib/aws-s3'; class MyStack extends Stack { constructor(scope: Construct, id: string, props: StackProps = {}) { super(scope, id, props); new s3.Bucket(this, 'MyBucket'); } } const app = new App(); new MyStack(app, 'Stack1'); new MyStack(app, 'Stack2');

路径

AWS CDK 应用程序中的构造形成了植根于该App类的层次结构。我们将 IDs 从给定构造、其父构造、其祖父构造等到构造树根部的集合称为路径

AWS CDK 通常将模板中的路径显示为字符串。各个关卡之间用斜线隔开, IDs 从根实例正下方的节点开始,根App实例通常是堆栈。例如,在前面的代码示例中,两个 Amazon S3 存储桶资源的路径分别是 Stack1/MyBucketStack2/MyBucket

您能以编程方式访问任何构造的路径,如以下示例所示。这会得到路径 myConstruct(Python:my_construct)。由于它们在创建的范围内 IDs 必须是唯一的,因此它们的路径在 AWS CDK 应用程序中始终是唯一的。

TypeScript
const path: string = myConstruct.node.path;
JavaScript
const path = myConstruct.node.path;
Python
path = my_construct.node.path
Java
String path = myConstruct.getNode().getPath();
C#
string path = myConstruct.Node.Path;
const path: string = myConstruct.node.path;

独特 IDs

AWS CloudFormation 要求模板 IDs 中的所有逻辑都必须是唯一的。因此, AWS CDK 必须能够为应用程序中的每个构造生成唯一标识符。资源的路径是全局唯一的(从堆栈到特定资源的所有作用域的名称)。因此,通过连接路径的元素并添加一个 8 位数的哈希来 AWS CDK 生成必要的唯一标识符。(哈希值是区分不同路径(例如A/B/C和)所必需的A/BC,因为这些路径会生成相同的 AWS CloudFormation 标识符。 AWS CloudFormation 标识符是字母数字,不能包含斜杠或其他分隔符。) AWS CDK 称此字符串为构造的唯一 ID

通常,您的 AWS CDK 应用程序不需要知道唯一性 IDs。但是,您能以编程方式访问任何构造的唯一 ID,如以下示例所示。

TypeScript
const uid: string = Names.uniqueId(myConstruct);
JavaScript
const uid = Names.uniqueId(myConstruct);
Python
uid = Names.unique_id(my_construct)
Java
String uid = Names.uniqueId(myConstruct);
C#
string uid = Names.Uniqueid(myConstruct);
const uid: string = Names.uniqueId(myConstruct);

地址是另一种用于唯一区分 CDK 资源的唯一标识符。它源自路径的 SHA-1 哈希值,人类不可读。但是,长度恒定、相对较短(始终为 42 个十六进制字符)的特点使其在“传统”唯一 ID 可能过长的情况下非常有用。某些构造可能会使用合成 AWS CloudFormation 模板中的地址而不是唯一 ID。同样,您的应用程序通常不需要知道其构造的地址,但您可以按如下方式检索构造的地址。

TypeScript
const addr: string = myConstruct.node.addr;
JavaScript
const addr = myConstruct.node.addr;
Python
addr = my_construct.node.addr
Java
String addr = myConstruct.getNode().getAddr();
C#
string addr = myConstruct.Node.Addr;
const addr: string = myConstruct.node.addr;

逻辑 IDs

在 IDs 为代表 AWS 资源的构造生成的 AWS CloudFormation 模板中,unique 用作资源的逻辑标识符(或逻辑名称)。

例如,上一个示例中在 Stack2 中创建的 Amazon S3 存储桶会生成一个 AWS::S3::Bucket 资源。资源的逻辑 ID Stack2MyBucket4DD88B4F 位于生成的 AWS CloudFormation 模板中。(有关如何生成此标识符的详细信息,请参阅独特 IDs。)

逻辑 ID 的稳定性

避免在资源创建后更改其逻辑 ID。 AWS CloudFormation 通过资源的逻辑 ID 来标识资源。因此,如果您更改资源的逻辑 ID,则使用新的逻辑 ID AWS CloudFormation 创建新资源,然后删除现有资源。根据资源的类型,这可能会导致服务中断或数据丢失,或同时导致这两种问题。

下一主题:

令牌

上一主题:

资源

本页内容

隐私网站条款Cookie 首选项
© 2025, Amazon Web Services, Inc. 或其附属公司。保留所有权利。