这是 AWS CDK v2 开发者指南。较旧的 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。
本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
标识符和 AWS CDK
在构建 AWS Cloud Development Kit (AWS CDK) 应用程序时,您将使用多种类型的标识符和名称。为了 AWS CDK 有效使用标识符并避免错误,了解标识符的类型非常重要。
标识符在创建时必须是唯一的;它们在您的 AWS CDK 应用程序中不必是全局唯一的。
如果您尝试在同一范围内创建具有相同值的标识符,则会 AWS CDK 引发异常。
构造 IDs
最常见的标识符是在实例化构造对象时作为第二个参数传递的标识符。id
与所有标识符一样,此标识符只需要在创建它的范围内是唯一的,这是实例化构造对象时的第一个参数。
让我们来看一个示例,其中我们的应用程序中有两个带有标识符amzn-s3-demo-bucket
的构造。第一个是在堆栈的作用域中定义的,标识符为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, 'amzn-s3-demo-bucket');
}
}
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, 'amzn-s3-demo-bucket');
}
}
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, "amzn-s3-demo-bucket")
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, "amzn-s3-demo-bucket");
}
}
// 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, "amzn-s3-demo-bucket");
}
}
class Program
{
static void Main(string[] args)
{
var app = new App();
new MyStack(app, "Stack1");
new MyStack(app, "Stack2");
}
}
路径
AWS CDK 应用程序中的构造形成了植根于该App
类的层次结构。我们将IDs从给定构造、其父构造、其祖父构造等到构造树根部的集合称为路径。
AWS CDK 通常将模板中的路径显示为字符串。各个关卡之间用斜线隔开,IDs从根实例正下方的节点开始,根App
实例通常是堆栈。例如,在前面的代码示例中,两个 Amazon S3 存储桶资源的路径是Stack1/amzn-s3-demo-bucket
和Stack2/amzn-s3-demo-bucket
。
您可以通过编程方式访问任何构造的路径,如以下示例所示。这会得到路径myConstruct
(或者my_construct
,正如 Python 开发者所写的那样)。由于它们在创建的范围内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;
独特 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);
地址是另一种用于唯一区分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;
逻辑 IDs
在IDs为代表 AWS 资源的构造生成的 AWS CloudFormation 模板中,unique 用作资源的逻辑标识符(或逻辑名称)。
例如,在上一个示例中创建的 Amazon S3 存储桶会Stack2
生成一个AWS::S3::Bucket
资源。资源的逻辑 ID Stack2amzn-s3-demo-bucket4DD88B4F
位于生成的 AWS CloudFormation 模板中。(有关如何生成此标识符的详细信息,请参阅独特 IDs。)
逻辑 ID 稳定性
避免在资源创建后更改其逻辑 ID。 AWS CloudFormation 通过资源的逻辑 ID 来标识资源。因此,如果您更改资源的逻辑 ID,则使用新的逻辑 ID AWS CloudFormation 创建新资源,然后删除现有资源。根据资源的类型,这可能会导致服务中断、数据丢失或两者兼而有之。