這是 AWS CDK v2 開發人員指南。較舊的 CDK 第 1 版已於 2022 年 6 月 1 日進入維護,並於 2023 年 6 月 1 日結束支援。
本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用支援的 AWS CDK 程式設計語言
使用以使用支援的程式設計語言 AWS Cloud Development Kit (AWS CDK)來定義您的 AWS 雲端 基礎結構。
匯入建 AWS 構資源庫
包 AWS CDK 括 AWS 構造庫,按 AWS 服務組織的結構的集合。該庫的穩定構造在單個模塊中提供,由其TypeScript包名稱調用:aws-cdk-lib
。實際的套件名稱因語言而異。
- TypeScript
-
安裝 |
故宮安裝 aws-cdk-lib |
匯入 |
常量 CDK = 需要('aws-cdk-lib'); |
- JavaScript
-
安裝 |
故宮安裝 aws-cdk-lib |
匯入 |
常量 CDK = 需要('aws-cdk-lib'); |
- Python
-
安裝 |
蟒蛇-m 點子安裝 aws-cdk-lib |
匯入 |
將 aws_cdk 導入為 CDK |
- Java
-
新增至 pom.xml |
Group 軟件. 亞馬遜. ; artifact aws-cdk-lib |
匯入 |
導入軟件. 亞馬遜. (for example) |
- C#
-
安裝 |
點網添加軟件包亞馬遜. |
匯入 |
使用亞馬遜 .cdk; |
construct
基底類別和支援程式碼位於constructs
模組中。API 仍在進行細化的實驗結構作為單獨的模塊分發。
AWS CDK API 參考資料
AWS CDK API 參考提供程式庫中建構 (和其他元件) 的詳細文件。每種受支援的程式設計語言都會提供 API 參考的版本。
每個模塊的參考材料分為以下幾個部分。
-
概觀:使用中的服務所需知道的介紹性材料 AWS CDK,包括概念和範例。
-
建構:代表一或多個具體 AWS 資源的程式庫類別。這些是「策劃」(L2)資源或模式(L3 資源),它們提供具有理智默認值的高級接口。
-
類別:提供模組中建構所使用之功能的非建構類別。
-
結構:定義複合值結構的數據結構(屬性包),例如屬性(構造的props
參數)和選項。
-
接口:名稱全部以「I」開頭的接口,定義相應構造或其他類的絕對最小功能。CDK 使用構造接口來表示 AWS 在應用程 AWS CDK 序外部定義並由諸如Bucket.fromBucketArn()
.
-
枚舉:用於指定某些構造參數的命名值的集合。使用列舉值可讓 CDK 在合成期間檢查這些值的有效性。
-
CloudFormation 資源:這些名稱以「Cfn」開頭的 L1 結構,代表規範中定義的資源完全相同。 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(節點 Package 管理器)或紗線 |
Python |
PIP (適用於 Python 的 Package 安裝程式) |
Java |
Maven |
C# |
NuGet |
Go |
圍棋模塊 |
當您使用 AWS CDK CLIcdk init
指令建立新專案時,CDK 核心程式庫和穩定建構的相依性會自動指定。
如需管理支援之程式設計語言之相依性的詳細資訊,請參閱下列內容:
TypeScript與其他語言比 AWS CDK 較
TypeScript 是開發 AWS CDK 應用程式所支援的第一種語言。因此,大量的示例 CDK 代碼被寫入 TypeScript。如果您使用另一種語言進行開發,則比較 AWS CDK 代碼的實現方式 TypeScript 與您選擇的語言相比可能會很有用。這可以幫助您在整個文檔中使用示例。
導入模塊
- 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 服務名稱,例如 Amazon S3 的 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式與. 每個 import 語句從給定的包或導入一個單一的類名,或者在該包中定義的所有類(使用*
)。類可以使用任一類名本身,如果它已被導入,或包括它的包合格的類名進行訪問。
庫的命名類似software.amazon.awscdk.services.xxx
於 AWS 構造庫(主庫是software.amazon.awscdk
)。 AWS CDK 套件的 Maven 群組識別碼是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
指示詞匯入型別。有兩種樣式。一個使您可以通過使用它們的普通名稱訪問指定名稱空間中的所有類型。另一方面,您可以使用別名來引用命名空間本身。
包被命名Amazon.CDK.AWS.xxx
為類似於 AWS 構造庫包。(核心模塊是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
指的是當前實例。(self
按慣例使用 Python。) 您應該將參數作為scope
參數傳遞給當前實例的引用到您創建的每個構造。
構造的第三個參數是props
,包含 AWS CDK 構建構所需屬性的對象。這個參數可能是可選的,但是當需要時,支持的語言以慣用方式處理它。屬性的名稱也會根據語言的標準命名模式進行調整。
- TypeScript/JavaScript
-
// Instantiate default Bucket
const bucket = new s3.Bucket(this, 'MyBucket');
// Instantiate Bucket with bucketName and versioned properties
const bucket = new s3.Bucket(this, 'MyBucket', {
bucketName: 'my-bucket',
versioned: true,
});
// Instantiate Bucket with websiteRedirect, which has its own sub-properties
const bucket = new s3.Bucket(this, 'MyBucket', {
websiteRedirect: {host: 'aws.amazon.com'}});
- Python
-
Python 在實例化類時不使用new
關鍵字。屬性參數使用關鍵字參數表示,並使用命名參數snake_case
。
如果 prop 值本身就是一組屬性,則會以屬性命名的類別來表示,該類別會接受子屬性的關鍵字引數。
在 Python 中,當前實例被傳遞給方法作為第一個參數,這是self
由約定命名。
# Instantiate default Bucket
bucket = s3.Bucket(self, "MyBucket")
# Instantiate Bucket with bucket_name and versioned properties
bucket = s3.Bucket(self, "MyBucket", bucket_name="my-bucket", versioned=true)
# Instantiate Bucket with website_redirect, which has its own sub-properties
bucket = s3.Bucket(self, "MyBucket", website_redirect=s3.WebsiteRedirect(
host_name="aws.amazon.com"))
- Java
-
在 Java 中,prop 參數由一個名為的類表示XxxxProps
(例如,BucketProps
對於Bucket
構造的 prop)。您可以使用構建器模式構建道具參數。
每個XxxxProps
類都有一個構建器。另外,每個建構都有一個方便的建構器,它們只需一個步驟即可建立道具和建構,如下列範例所示。
道具的名稱與中的名稱相同 TypeScript,使用camelCase
。
// Instantiate default Bucket
Bucket bucket = Bucket(self, "MyBucket");
// Instantiate Bucket with bucketName and versioned properties
Bucket bucket = Bucket.Builder.create(self, "MyBucket")
.bucketName("my-bucket").versioned(true)
.build();
# Instantiate Bucket with websiteRedirect, which has its own sub-properties
Bucket bucket = Bucket.Builder.create(self, "MyBucket")
.websiteRedirect(new websiteRedirect.Builder()
.hostName("aws.amazon.com").build())
.build();
- C#
-
在 C# 中,prop 使用對象初始值設定項指定到名為的類XxxxProps
(例如,BucketProps
對於Bucket
構造的 prop)。
道具的名稱類似於 TypeScript,除了使用PascalCase
。
實例化構造時使用var
關鍵字很方便,因此您不需要鍵入兩次類名。但是,您的本地代碼樣式指南可能會有所不同。
// Instantiate default Bucket
var bucket = Bucket(self, "MyBucket");
// Instantiate Bucket with BucketName and Versioned properties
var bucket = Bucket(self, "MyBucket", new BucketProps {
BucketName = "my-bucket",
Versioned = true});
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
var bucket = Bucket(self, "MyBucket", 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("MyBucket"), nil)
// Instantiate Bucket with BucketName and Versioned properties
bucket1 := awss3.NewBucket(stack, jsii.String("MyBucket"), &awss3.BucketProps{
BucketName: jsii.String("my-bucket"),
Versioned: jsii.Bool(true),
})
// Instantiate Bucket with WebsiteRedirect, which has its own sub-properties
bucket2 := awss3.NewBucket(stack, jsii.String("MyBucket"), &awss3.BucketProps{
WebsiteRedirect: &awss3.RedirectTarget{
HostName: jsii.String("aws.amazon.com"),
}})
存取成員
它是常見的引用屬性或構造和其他 AWS CDK 類的屬性,並使用這些值作為,例如,輸入來構建其他構造。上述方法的命名差異也適用於此處。此外,在 Java 中,無法直接訪問成員。相反,提供了一個吸氣方法。
- 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())
}