這是 AWS CDK v2 開發人員指南。較舊的 CDK v1 於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS CDK 程式庫
匯入並使用 AWS Cloud Development Kit (AWS CDK) 程式庫,以支援的程式設計語言 定義您的 AWS 雲端 基礎設施。
匯入 AWS CDK 程式庫
AWS CDK 程式庫通常由其 TypeScript 套件名稱aws-cdk-lib
。實際套件名稱會因語言而異。以下是如何安裝和匯入 CDK Library 的範例:
- TypeScript
-
安裝 |
npm install aws-cdk-lib |
Import |
import * as cdk from 'aws-cdk-lib'; |
- JavaScript
-
安裝 |
npm install aws-cdk-lib |
Import |
const cdk = require('aws-cdk-lib'); |
- Python
-
安裝 |
python -m pip install aws-cdk-lib |
Import |
import aws_cdk as cdk |
- Java
-
在 中pom.xml ,新增 |
群組 software.amazon.awscdk ;成品 aws-cdk-lib |
Import |
import software.amazon.awscdk.App; |
- C#
-
安裝 |
dotnet add package Amazon.CDK.Lib |
Import |
using Amazon.CDK; |
- Go
-
安裝 |
go get github.com/aws/aws-cdk-go/awscdk/v2 |
Import |
import (
"github.com/aws/aws-cdk-go/awscdk/v2"
)
|
construct
基本類別和支援程式碼位於constructs
程式庫中。API 仍在進行精簡的實驗建構會以個別模組形式分發。
使用 AWS CDK API 參考
當您使用 開發時,請使用 AWS CDK API參考 AWS CDK。
每個模組的參考材料都分為以下各節。
-
概觀 :使用 中的 服務時,您需要知道的介紹材料 AWS CDK,包括概念和範例。
-
建構 :代表一或多個具體 AWS 資源的程式庫類別。這些是「已策劃」 (L2) 資源或模式 (L3 資源),可提供具有 Sane 預設值的高階介面。
-
類別 :提供模組中建構所使用的功能的非建構類別。
-
結構 :定義複合值結構的資料結構 (屬性套件),例如屬性 (建構的props
引數) 和選項。
-
介面 :名稱全部以「I」開頭的介面,會定義對應建構或其他類別的絕對最小功能。CDK 使用建構介面來表示在 AWS CDK 應用程式外部定義並由 等方法參考 AWS 的資源Bucket.fromBucketArn()
。
-
列舉 :用於指定特定建構參數的具名值集合。使用列舉值可讓 在合成期間CDK檢查這些值的有效性。
-
CloudFormation 資源 :這些 L1 建構名稱以 "Cfn" 開頭,完全代表 CloudFormation 規格中定義的資源。每個CDK版本都會自動從該規格產生。每個 L2 或 L3 建構會封裝一或多個 CloudFormation 資源。
-
CloudFormation 屬性類型 :指定值的集合,可定義每個 CloudFormation 資源的屬性。
與建構類別相比的介面
會以可能不明顯的特定方式 AWS CDK 使用介面,即使您熟悉介面做為程式設計概念。
AWS CDK 支援使用 等方法定義的外部CDK應用程式資源Bucket.fromBucketArn()
。外部資源無法修改,而且可能無法擁有CDK應用程式中所定義資源的所有可用功能,例如 Bucket
類別。然後,介面代表CDK指定 AWS 資源類型的 中可用的裸機最小功能,包括外部資源。
在CDK應用程式中實現資源時,您應該一律使用具體類別,例如 Bucket
。指定在自己的其中一個建構中接受的引數類型時,請使用介面類型,例如IBucket
您是否準備好處理外部資源 (也就是說,您不需要變更它們)。如果您需要 CDK定義的建構,請指定您可以使用的最一般類型。
有些介面是與特定類別相關聯的屬性或選項套件的最小版本,而不是建構。當子分類接受您要傳遞給父類別的引數時,這類介面很有用。如果您需要一或多個其他屬性,則需要實作或衍生自此介面,或更具體的類型。
支援的某些程式設計語言 AWS CDK 沒有介面功能。在這些語言中,介面只是一般類別。您可以依名稱來識別它們,其遵循初始「I」模式,後面接著其他建構的名稱 (例如 IBucket
)。適用相同的規則。
管理相依性
AWS CDK 應用程式或程式庫的相依性會使用套件管理工具進行管理。這些工具通常與程式設計語言搭配使用。
一般而言,如果有語言的標準或官方套件管理工具, 會 AWS CDK 支援該語言。否則, AWS CDK 將支援語言最受歡迎或廣泛支援的語言。您也可以使用其他工具,特別是使用支援的工具時。不過,其他工具的官方支援有限。
AWS CDK 支援下列套件管理員:
語言 |
支援的套件管理工具 |
TypeScript/JavaScript |
NPM (節點套件管理員) 或 Yarn |
Python |
PIP (Package Installer for Python) |
Java |
Maven |
C# |
NuGet |
Go |
Go 模組 |
當您使用 建立新專案時 AWS CDK CLI cdk init
命令、CDK核心程式庫的相依性以及穩定的建構會自動指定。
如需管理支援程式設計語言相依性的詳細資訊,請參閱下列內容:
在 AWS CDK 中比較 TypeScript 使用其他語言
TypeScript 是支援開發 AWS CDK 應用程式的第一個語言。因此,大量範例CDK程式碼會寫入 TypeScript。如果您使用其他語言進行開發,相較於 TypeScript 您選擇的語言,比較 中的 AWS CDK 程式碼實作方式可能很有用。這可協助您在整個文件中使用範例。
匯入模組
- TypeScript/JavaScript
-
TypeScript 支援從命名空間匯入整個命名空間或個別物件。每個命名空間都包含要與指定 AWS 服務搭配使用的建構和其他類別。
// Import main CDK library as cdk
import * as cdk from 'aws-cdk-lib'; // ES6 import preferred in TS
const cdk = require('aws-cdk-lib'); // Node.js require() preferred in JS
// Import specific core CDK classes
import { Stack, App } from 'aws-cdk-lib';
const { Stack, App } = require('aws-cdk-lib');
// Import AWS S3 namespace as s3 into current namespace
import { aws_s3 as s3 } from 'aws-cdk-lib'; // TypeScript
const s3 = require('aws-cdk-lib/aws-s3'); // JavaScript
// Having imported cdk already as above, this is also valid
const s3 = cdk.aws_s3;
// Now use s3 to access the S3 types
const bucket = s3.Bucket(...);
// Selective import of s3.Bucket
import { Bucket } from 'aws-cdk-lib/aws-s3'; // TypeScript
const { Bucket } = require('aws-cdk-lib/aws-s3'); // JavaScript
// Now use Bucket to instantiate an S3 bucket
const bucket = Bucket(...);
- Python
-
與 一樣 TypeScript,Python 支援命名空間模組匯入和選擇性匯入。Python 中的命名空間看起來像 aws_cdk.xxx,其中 xxx 代表 AWS 服務名稱,例如 s3 for Amazon S3。(Amazon S3 用於這些範例)。
# Import main CDK library as cdk
import aws_cdk as cdk
# Selective import of specific core classes
from aws_cdk import Stack, App
# Import entire module as s3 into current namespace
import aws_cdk.aws_s3 as s3
# s3 can now be used to access classes it contains
bucket = s3.Bucket(...)
# Selective import of s3.Bucket into current namespace
from aws_cdk.s3 import Bucket
# Bucket can now be used to instantiate a bucket
bucket = Bucket(...)
- Java
-
Java 的匯入運作方式與 不同 TypeScript。每個匯入陳述式會從指定的套件匯入單一類別名稱,或匯入該套件中定義的所有類別 (使用 *
)。如果已匯入類別名稱,或包含其套件的合格類別名稱,則可以使用類別名稱單獨存取類別。
程式庫的名稱與 AWS Construct Library software.amazon.awscdk.services.xxx
相同 (主要程式庫為 software.amazon.awscdk
)。 AWS CDK 套件的 Maven 群組 ID 為 software.amazon.awscdk
。
// Make certain core classes available
import software.amazon.awscdk.Stack;
import software.amazon.awscdk.App;
// Make all Amazon S3 construct library classes available
import software.amazon.awscdk.services.s3.*;
// Make only Bucket and EventType classes available
import software.amazon.awscdk.services.s3.Bucket;
import software.amazon.awscdk.services.s3.EventType;
// An imported class may now be accessed using the simple class name (assuming that name
// does not conflict with another class)
Bucket bucket = Bucket.Builder.create(...).build();
// We can always use the qualified name of a class (including its package) even without an
// import directive
software.amazon.awscdk.services.s3.Bucket bucket =
software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
.build();
// Java 10 or later can use var keyword to avoid typing the type twice
var bucket =
software.amazon.awscdk.services.s3.Bucket.Builder.create(...)
.build();
- C#
-
在 C# 中,您可以使用 using
指令匯入類型。有兩種樣式。一個可讓您使用其純名稱來存取指定命名空間中的所有類型。使用另一個 時,您可以使用別名來參考命名空間本身。
套件的名稱與 AWS Construct Library 套件Amazon.CDK.AWS.xxx
相同。(核心模組為 Amazon.CDK
。)
// Make CDK base classes available under cdk
using cdk = Amazon.CDK;
// Make all Amazon S3 construct library classes available
using Amazon.CDK.AWS.S3;
// Now we can access any S3 type using its name
var bucket = new Bucket(...);
// Import the S3 namespace under an alias
using s3 = Amazon.CDK.AWS.S3;
// Now we can access an S3 type through the namespace alias
var bucket = new s3.Bucket(...);
// We can always use the qualified name of a type (including its namespace) even without a
// using directive
var bucket = new Amazon.CDK.AWS.S3.Bucket(...)
- Go
-
每個 AWS 建構程式庫模組都以 Go 套件的形式提供。
import (
"github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package
"github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module
)
// now instantiate a bucket
bucket := awss3.NewBucket(...)
// use aliases for brevity/clarity
import (
cdk "github.com/aws/aws-cdk-go/awscdk/v2" // CDK core package
s3 "github.com/aws/aws-cdk-go/awscdk/v2/awss3" // AWS S3 construct library module
)
bucket := s3.NewBucket(...)
實例化建構
AWS CDK 建構類別在所有支援的語言中具有相同的名稱。大多數語言都使用 new
關鍵字來實例化 類別 (Python 和 Go 不會)。此外,在大多數語言中,關鍵字this
是指目前的執行個體。(Python self
依慣例使用。) 您應該將參考傳遞給目前執行個體,做為您建立的每個建構的scope
參數。
AWS CDK 建構的第三個引數是 props
,此物件包含建置建構所需的屬性。此引數可能是選用的,但當需要時,支援的語言會以慣用方式處理。屬性的名稱也會根據語言的標準命名模式進行調整。
- TypeScript/JavaScript
-
// Instantiate default Bucket
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket');
// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
bucketName: 'amzn-s3-demo-bucket',
versioned: true,
});
// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'amzn-s3-demo-bucket', {
websiteRedirect: {host: 'aws.amazon.com'}});
- Python
-
Python 在實例化類別時不使用new
關鍵字。屬性引數使用關鍵字引數表示,引數則使用 命名snake_case
。
如果 props 值本身是一組屬性,則由以 屬性命名的類別表示,該類別接受子屬性的關鍵字引數。
在 Python 中,目前的執行個體會傳遞至 方法作為第一個引數,以self
慣例命名。
# Instantiate default Bucket
bucket = s3.Bucket(self, "amzn-s3-demo-bucket")
# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", bucket_name="amzn-s3-demo-bucket", versioned=true)
# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "amzn-s3-demo-bucket", website_redirect=s3.WebsiteRedirect(
host_name="aws.amazon.com"))
- Java
-
在 Java 中,props 引數由名為 的類別表示 Bucket
XxxxProps
(例如,BucketProps
針對建構的 props)。您可以使用建置器模式建置 props 引數。
每個XxxxProps
類別都有建置器。每個建構體也有一個方便的建置器,可在一個步驟中建置道具和建構體,如下列範例所示。
道具的名稱與 中的相同 TypeScript,使用 camelCase
。
// Instantiate default Bucket
Bucket bucket = Bucket(self, "amzn-s3-demo-bucket");
// Instantiate Bucket with bucketName and versioned properties
Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket")
.bucketName("amzn-s3-demo-bucket").versioned(true)
.build();
# Instantiate Bucket with websiteRedirect, which has its own sub-properties
Bucket bucket = Bucket.Builder.create(self, "amzn-s3-demo-bucket")
.websiteRedirect(new websiteRedirect.Builder()
.hostName("aws.amazon.com").build())
.build();
- C#
-
在 C# 中,props 會使用物件初始化器指定為名為 的類別 Bucket
XxxxProps
(例如,BucketProps
針對建構的 props)。
除了使用 之外 TypeScript,道具的名稱與 類似PascalCase
。
在實例化建構時,使用var
關鍵字非常方便,因此您不需要輸入類別名稱兩次。不過,您的本機程式碼樣式指南可能會有所不同。
// Instantiate default Bucket
var bucket = Bucket(self, "amzn-s3-demo-bucket");
// Instantiate Bucket with BucketName and Versioned properties
var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps {
BucketName = "amzn-s3-demo-bucket",
Versioned = true});
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
var bucket = Bucket(self, "amzn-s3-demo-bucket", new BucketProps {
WebsiteRedirect = new WebsiteRedirect {
HostName = "aws.amazon.com"
}});
- Go
-
若要在 Go 中建立建構,請呼叫 函數,NewXxxxxx
其中 Xxxxxxx
是建構的名稱。建構的屬性定義為 結構。
在 Go 中,所有建構參數都是指標,包括數值、布林值和字串等值。使用類似 的便利函數jsii.String
來建立這些指標。
// Instantiate default Bucket
bucket := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), nil)
// Instantiate Bucket with BucketName and Versioned properties
bucket1 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
BucketName: jsii.String("amzn-s3-demo-bucket"),
Versioned: jsii.Bool(true),
})
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
bucket2 := awss3.NewBucket(stack, jsii.String("amzn-s3-demo-bucket"), &awss3.BucketProps{
WebsiteRedirect: &awss3.RedirectTarget{
HostName: jsii.String("aws.amazon.com"),
}})
存取成員
參考建構和其他 AWS CDK 類別的屬性或屬性,並使用這些值作為例如,輸入來建置其他建構是常見的。上述方法的命名差異也適用於此處。此外,在 Java 中,無法直接存取成員。而是提供 getter 方法。
- TypeScript/JavaScript
-
名稱為 camelCase
。
bucket.bucketArn
- Python
-
名稱為 snake_case
。
bucket.bucket_arn
- Java
-
每個屬性都會提供 getter 方法;這些名稱為 camelCase
。
bucket.getBucketArn()
- C#
-
名稱為 PascalCase
。
bucket.BucketArn
- Go
-
名稱為 PascalCase
。
bucket.BucketArn
列舉常數
列舉常數範圍為 類別,且具有大寫名稱,所有語言都有底線 (有時稱為 SCREAMING_SNAKE_CASE
)。由於類別名稱也在所有支援的語言中使用相同的外殼,但 Go 除外,因此在這些語言中,合格的列舉名稱也相同。
s3.BucketEncryption.KMS_MANAGED
在 Go 中,列舉常數是模組命名空間的屬性,寫入方式如下。
awss3.BucketEncryption_KMS_MANAGED
物件介面
AWS CDK 使用 TypeScript 物件介面來指示類別實作預期的方法和屬性集。您可以識別物件界面,因為其名稱開頭為 I
。混凝土類別表示其使用implements
關鍵字實作的介面。
- TypeScript/JavaScript
-
JavaScript 沒有介面功能。您可以忽略implements
關鍵字及其後面的類別名稱。
import { IAspect, IConstruct } from 'aws-cdk-lib';
class MyAspect implements IAspect {
public visit(node: IConstruct) {
console.log('Visited', node.node.path);
}
}
- Python
-
Python 沒有介面功能。不過,對於 AWS CDK ,您可以透過使用 裝飾您的類別來指示介面實作@jsii.implements(interface)
。
from aws_cdk import IAspect, IConstruct
import jsii
@jsii.implements(IAspect)
class MyAspect():
def visit(self, node: IConstruct) -> None:
print("Visited", node.node.path)
- Java
-
import software.amazon.awscdk.IAspect;
import software.amazon.awscdk.IConstruct;
public class MyAspect implements IAspect {
public void visit(IConstruct node) {
System.out.format("Visited %s", node.getNode().getPath());
}
}
- C#
-
using Amazon.CDK;
public class MyAspect : IAspect
{
public void Visit(IConstruct node)
{
System.Console.WriteLine($"Visited ${node.Node.Path}");
}
}
- Go
-
Go 結構不需要明確宣告其實作的介面。Go 編譯器會根據結構上可用的方法和屬性來決定實作。例如,在下列程式碼中, 會MyAspect
實作 IAspect
介面,因為它提供採用建構Visit
的方法。
type MyAspect struct {
}
func (a MyAspect) Visit(node constructs.IConstruct) {
fmt.Println("Visited", *node.Node().Path())
}