AWSCDK基礎(chǔ)結(jié)構(gòu)作為抽象數(shù)據(jù)類型,第一部分
基礎(chǔ)設(shè)施作為代碼(IaC),是一種用代碼定義基礎(chǔ)設(shè)施元素的實踐。這與通過GUI(圖形用戶界面)來實現(xiàn)它相反,例如,AWS控制臺。其思想是,為了具有確定性和可重復(fù)性,云基礎(chǔ)設(shè)施必須在一個基于用編程語言表達(dá)的模型的抽象描述中被捕獲,以便允許操作的自動化,否則應(yīng)該手動執(zhí)行。
AWS提供了幾種IaC工具,如下所示:
· 云形成:一種能夠基于JSON或YAML表示法表示的模板創(chuàng)建和管理云資源的配置工具
· AWS擴展Amplify:一個開源框架,為開發(fā)人員提供任何他們需要交付連接AWS基礎(chǔ)設(shè)施元素以及web和移動組件的應(yīng)用程序
· AWSSAM(無服務(wù)器應(yīng)用程序模型):一種促進(jìn)AWS Lambda功能與API網(wǎng)關(guān)、REST API、AWS SNS/SMQ、DynamoDB等服務(wù)集成的工具。
· AWSSDK(軟件開發(fā)工具包):一個API,使用Java、Python、TypeScript等編程語言為所有AWS服務(wù)提供管理支持
·
AWS CDK(云開發(fā)工具包):這是另一個類似于SDK的API,但功能更豐富,不僅允許管理AWS服務(wù),還允許以編程方式創(chuàng)建、修改和刪除云形成堆棧,其中包含基礎(chǔ)設(shè)施元素。它支持許多編程語言,包括但不限于Java、Python、類型的Script等。
其他非亞馬遜的IaC工具也存在,如Pulumi和地形,它們提供了非常有趣的多云支持,包括但不限于AWS。例如,與AWS CDK一樣,Pulumi允許您使用通用編程語言定義云基礎(chǔ)設(shè)施,并且與云形成一樣,三元組使用專用的聲明式符號,稱為HCL(HashiCorp配置語言)。
本文是一個系列文章的第一部分,它旨在深入研究CDK作為一種面向?qū)ο蟮母呒壋橄?,通過利用編程語言的力量來定義云基礎(chǔ)設(shè)施。
AWS CDK簡介
在AWS自己的定義中,CDK是一個開源軟件開發(fā)框架,它使用通用的編程語言來定義了AWS云資源。在這里,我們將使用Java。
有趣的是,從一開始就觀察到,與其他IaC工具如云形成或地形形成不同,CDK并不僅僅被定義為一個基礎(chǔ)設(shè)施供應(yīng)框架。事實上,在AWS術(shù)語的意義,CDK不止是:一個非常多才多藝的IaC框架,釋放編程語言和編譯器管理高度復(fù)雜的AWS云基礎(chǔ)設(shè)施與代碼,相比HCL或其他基于JSON/YAML符號,更具可讀性和可擴展性。與這些其他IaC工具不同,使用CDK可以循環(huán)、映射、引用、編寫條件、使用輔助函數(shù),總之,充分利用編程語言的能力。
但是,也許CDK最重要的優(yōu)勢是它的領(lǐng)域特定語言(DSL)類似的風(fēng)格,這多虧了構(gòu)建器設(shè)計模式的廣泛實現(xiàn),它允許開發(fā)人員輕松地與AWS服務(wù)交互,而無需學(xué)習(xí)復(fù)雜的api和其他云供應(yīng)語法。此外,它還使對可重用組件、安全組、證書、負(fù)載平衡器、vpc(虛擬私有云)等組件的強大管理和定制成為可能。
CDK是基于將構(gòu)造作為其基本構(gòu)建塊的概念。這是一個強大的概念,它允許我們抽象出公共云基礎(chǔ)設(shè)施模式的細(xì)節(jié)。構(gòu)造對應(yīng)于一個或多個合成資源,它可以是一個只包含S3桶的小云形成堆棧,也可以是一個包含一組具有相關(guān)的AWS機器管理器參數(shù)存儲配置、安全組、證書和負(fù)載平衡器。它可以根據(jù)需要進(jìn)行初始化和重用,次數(shù)盡可能多次。
堆棧是構(gòu)造對象的邏輯組。它可以被看作是要部署的組件的圖表。它生成聲明性云形成模板、梯形配置或Kubernetes清單文件。
最后但并非最不重要的是,該應(yīng)用程序是一個CDK的概念,它對應(yīng)于一個構(gòu)造對象的樹。有一個根應(yīng)用程序,它可能包含一個或多個堆棧對象,依次包含一個或多個構(gòu)造對象,它可能包含其他構(gòu)造對象,等等。下圖描述了這種結(jié)構(gòu)。
這里有幾個例子并說明了它。它們從最簡單的,創(chuàng)建一個基本的基礎(chǔ)設(shè)施,到最復(fù)雜的,處理多區(qū)域的數(shù)據(jù)庫集群和堡壘主機。讓我們來其中一些。
CDK啟動器
讓我們從一個啟動項目開始,構(gòu)建一個CDK應(yīng)用程序,該應(yīng)用程序創(chuàng)建一個只包含S3桶的簡單堆棧。安裝CDK很簡單,如這里所述。一旦根據(jù)上述文檔安裝并啟動了CDK,您就可以使用其腳手架功能來快速創(chuàng)建項目骨架。運行以下命令:
Shell
$ cdk init app --language java
當(dāng)CDK腳手架生成Maven項目時,將顯示一堆文本,一旦完成,您可以檢查它的結(jié)構(gòu),如下所示:
$ tree -I target
.
├── cdk.json
├── pom.xml
├── README.md
└── src
├── main
│ └── java
│ └── com
│ └── myorg
│ ├── TestApp.java
│ └── TestStack.java
└── test
└── java
└── com
└── myorg
└── TestTest.java
9 directories, 6 files
這是由CDK腳手架創(chuàng)建的項目骨架。如您所見,有幾個Java類,以及一個測試類。它們不是很有趣,你已經(jīng)可以刪除它們,連同軟件包com.myorg一起,它可能不符合你的命名約定。但是使用CDK支架函數(shù)的真正優(yōu)點是生成了pom.xml和cdk.json文件。
第一個是驅(qū)動應(yīng)用程序構(gòu)建過程,并定義所需的依賴項和插件。打開它,你就會看到:
XML
...
software.amazon.awscdk
aws-cdk-lib
...
org.codehaus.mojo
exec-maven-plugin
fr.simplex_software.aws.iac.cdk.starter.CdkStarterApp
...
為了開發(fā)CDK應(yīng)用程序,您需要aws-cdk-lib Maven工件。這是包含所有所需資源的CDK庫。一旦構(gòu)建和部署,要運行應(yīng)用程序,還需要exec-maven插件。
如果您查看cdk init命令為您生成的cdk.json文件,您會看到:
JSON
...
"app": "mvn -e -q compile exec:java"
3
...
這是CDK在構(gòu)建應(yīng)用程序時要使用的命令。當(dāng)然,如果您不想使用支架功能,而且,如果您喜歡從頭開始,您可以提供自己的pom.xml,因為畢竟,作為一個開發(fā)人員,您必須習(xí)慣它。但是,當(dāng)涉及到cdk.jsonfile時,您最好是生成它。
所以,很好:你剛剛得到了你的項目骨架,現(xiàn)在你需要定制它以適應(yīng)你的需求。來看看代碼存儲庫中的cdk啟動程序項目。正如您所看到的,有兩個Java類,Cdk星tapp和Cdk星棧。第一個方法是通過實例化software.amazon.awscdk來創(chuàng)建一個CDK應(yīng)用程序。抽象了最基本的CDK概念的應(yīng)用程序類:應(yīng)用程序。建議一旦實例化,就可以標(biāo)記應(yīng)用程序,這樣不同的自動工具就能夠根據(jù)不同的目的來操作它。例如,我們可以想象有一個自動工具,它可以刪除所有的測試應(yīng)用程序,然后掃描它們,尋找標(biāo)簽環(huán)境:開發(fā)。
應(yīng)用程序的目標(biāo)是定義至少一個堆棧,這是我們的應(yīng)用程序通過實例化CdkStarterStack類所做的事情。這個類是一個堆棧,因為它擴展了software.amazon.awscdk。堆疊一個。在它的構(gòu)造函數(shù)中,我們將創(chuàng)建一個S3桶,如下面的代碼片段所示:
Java
Bucket bucket = Bucket.Builder.create(this, "my-bucket-id")
.bucketName("my-bucket-" + System.getenv("CDK_DEFAULT_ACCOUNT"))
.autoDeleteObjects(true).removalPolicy(RemovalPolicy.DESTROY).build();
在這里,我們創(chuàng)建了一個S3桶,具有我的-bbkem的ID和我的-bbkew的名稱,我們已經(jīng)添加了當(dāng)前用戶的默認(rèn)帳戶ID。其原因是S3的桶名在全球范圍內(nèi)必須是唯一的。
正如您所看到的,這里用于抽象Amazon簡單存儲服務(wù)的類software.amazon.awscdk.services.s3.Bucket實現(xiàn)了設(shè)計模式構(gòu)建器,它允許以類似dsl的方式定義諸如桶名、自動刪除和刪除策略等屬性。
所以這是我們的第一個簡單的CDK應(yīng)用程序。CdkStarterApp類中的以下幾行:
Java
app.synth();
…是絕對必要的,因為它產(chǎn)生(“合成”,在CDK的術(shù)語中)相關(guān)的AWS云形成堆棧模板。一旦“合成”了,它就可以被部署和使用了。這是如何做到的:
Shell
$ git clone https://github.com/nicolasduminil/cdk.git
$ cd cdk/cdk-starter
$ mvn package
$ cdk deploy --requireApproval=never
一堆文本將再次顯示,一段時間后,如果一切都好,您應(yīng)該看到堆棧成功部署的確認(rèn)。現(xiàn)在,為了檢查一切是否正常工作,您可以將已部署的堆棧列表如下:
Shell
$ aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE
關(guān)鍵是根據(jù)存在堆棧的當(dāng)前狀態(tài)(在本例中是CREATE_COMPLETE)來過濾其輸出列表,以避免檢索幾十個不相關(guān)的信息。所以,你應(yīng)該看到類似的東西:
JSON
{
"StackSummaries": [
...
{
"StackId": "arn:aws:cloudformation:eu-west-3:...:stack/CdkStarterStack/83ceb390-3232-11ef-960b-0aa19373e2a7",
"StackName": "CdkStarterStack",
"CreationTime": "2024-06-24T14:03:21.519000+00:00",
"LastUpdatedTime": "2024-06-24T14:03:27.020000+00:00",
"StackStatus": "CREATE_COMPLETE",
"DriftInformation": {
"StackDriftStatus": "NOT_CHECKED"
}
}
...
]
}
現(xiàn)在,您可以獲得關(guān)于您的特定堆棧的更詳細(xì)信息:
Shell
$ aws cloudformation describe-stacks --stack-name CdkStarterStack
輸出將非常冗長,我們不會在這里復(fù)制它,但您應(yīng)該看到有趣的信息,如:
JSON
...
"RoleARN": "arn:aws:iam::...:role/cdk-hnb659fds-cfn-exec-role-...-eu-west-3",
"Tags": [
{
"Key": "environment",
"Value": "development"
},
{
"Key": "application",
"Value": "CdkApiGatewayApp"
},
{
"Key": "project",
"Value": "API Gateway with Quarkus"
}
],
...
當(dāng)然,您也可以檢查您的S3桶是否已經(jīng)成功創(chuàng)建:
Shell
$ aws s3api list-buckets --query "Buckets[].Name"
在這里,使用查詢“桶”的選項。名稱,您過濾輸出,以便只顯示桶名稱,您將看到:
JSON
[
...
"my-bucket-...",
...
]
如果您想查看一些屬性(例如,關(guān)聯(lián)的標(biāo)記):
Shell
$ aws s3api get-bucket-tagging --bucket my-bucket-...
{
"TagSet": [
{
"Key": "aws:cloudformation:stack-name",
"Value": "CdkStarterStack"
},
{
"Key": "environment",
"Value": "development"
},
{
"Key": "application",
"Value": "CdkStarterApp"
},
{
"Key": "project",
"Value": "The CDK Starter projet"
},
{
"Key": "aws-cdk:auto-delete-objects",
"Value": "true"
}
]
}
一切似乎都很好,你可能會得出結(jié)論,你使用CDK的第一次測試是成功的。因為您現(xiàn)在已經(jīng)部署了一個帶有S3桶的堆棧,所以您應(yīng)該能夠使用這個桶,例如,上傳文件,下載它們,等等。您可以通過使用這里所示的AWS CLI來實現(xiàn)這一點。但如果你想用CDK來做,你需要等待下一集。
在等待的同時,不要忘記清理你的AWS工作空間,以避免被開具發(fā)票!
Shell
$ cdk destroy --all
aws s3 rm s3://my-bucket-... --recursive
aws s3 rb s3://my-bucket-...