标识符和 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

这是 AWS CDK v2 开发者指南。旧版 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。

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

标识符和 AWS CDK

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

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

如果您尝试在同一作用域内创建具有相同值的标识符,则 AWS CDK 会抛出异常。

构造 ID

最常见的标识符 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"); } }

路径

AWS CDK 应用程序中的构造形成了源于 App 类的层次结构。我们将来自给定构造、其父级和祖父级构造乃至其构造树的根的 ID 集合称为路径

AWS CDK 通常将模板中的路径显示为字符串。各层次的 ID 用斜线分隔,从紧靠根 App 实例(通常是堆栈)的节点开始。例如,在前面的代码示例中,两个 Amazon S3 存储桶资源的路径分别是 Stack1/MyBucketStack2/MyBucket

您能以编程方式访问任何构造的路径,如以下示例所示。这会得到路径 myConstruct(Python:my_construct)。由于 ID 在创建它们的作用域内必须是唯一的,因此它们的路径在 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;

唯一 ID

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

通常,您的 AWS CDK 应用程序无需知道唯一 ID。但是,您能以编程方式访问任何构造的唯一 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);

地址是另一种用于唯一区分 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;

逻辑 ID

在为代表 AWS 资源的构造生成的 AWS CloudFormation 模板中,唯一 ID 充当资源的逻辑标识符(或逻辑名称)。

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

逻辑 ID 的稳定性

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