開始使用 AWS CDK

入門指南

單元 3:建立您的第一個 AWS CDK 專案

在本單元中,您將使用 AWS Cloud Development Kit (CDK) 建立基礎設施。

簡介

在本指南中,我們將使用 AWS CDK CLI 搭配 TypeScript 來建立新的基礎設施專案。我們也將了解如何撰寫簡單的資源,以及如何合成和部署您的 CDK 程式碼。合成是指 CDK 將您的基礎設施程式碼轉化為 AWS CloudFormation 範本的情形。

您將學到的內容

  • 使用 TypeScript 建立新的 CDK 專案。
  • 在 CDK (VPC) 中撰寫簡單的資源。
  • 將 CDK 程式碼合成為 CloudFormation 範本。
  • 將基礎設施部署至您的 AWS 帳戶中。

 完成時間

15 分鐘

 單元先決條件

  • 有管理員等級存取權限的 AWS 帳戶**
  • 建議的瀏覽器:最新版的 Chrome 或 Firefox

[**]過去 24 小時內建立的帳戶可能尚未有權存取本教學課程所需的服務。

實作

建立新的 CDK 專案

為了建立新的 CDK 專案,我們將使用 CDK CLI。首先,請在您的系統中建立空目錄,並切換至該處。接著,我們將使用 cdk init 來建立新的 TypeScript CDK 專案:

mkdir cdk-demo
cd cdk-demo
cdk init --language typescript

這將會建立資料夾結構,並安裝 TypeScript CDK 專案所需的一些必要模組。輸出應如下所示:

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Initializing a new git repository...
Executing npm install...
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated sane@4.1.0: some dependency vulnerabilities fixed, support for node < 10 dropped, and newer ECMAScript syntax/features added
npm notice
npm notice New minor version of npm available! 7.19.0 -> 7.20.1
npm notice Changelog: https://github.com/npm/cli/releases/tag/v7.20.1
npm notice Run npm install -g npm@7.20.1 to update!
npm notice
✅ All done!

此外也會為您提供開始使用 CDK 專案所需的命令。我們現已準備就緒,可撰寫第一個用來建立基礎設施的 CDK 程式碼。

建立基礎設施

開始建置專案時常見的起始步驟,是根據您的定義建立以邏輯的方式隔離的虛擬網路,名為 Amazon Virtual Private Cloud (VPC)。在建立第一個 VPC 之前,我們必須先了解 cdk init 命令所建立的檔案。

建置並部署您的 CDK 應用程式

├── bin
│   └── cdk-demo.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── cdk-demo-stack.ts
├── package.json
├── package-lock.json
├── README.md
├── test
│   └── cdk-demo.test.ts
└── tsconfig.json

以下是一些重要檔案及其用途:

  • bin/cdk-project.ts - 這是進入您 CDK 應用程式的途徑。此檔案將會載入/建立我們在 lib/* 底下定義的所有堆疊
  • lib/cdk-project-stack.ts - 這是您主要的 CDK 應用程式堆疊的定義之處。您的資源及其屬性可存放於此處。
  • package.json - 您會在此處定義專案相依性,以及一些額外資訊和建置指令碼 (npm buildnpm testnpm watch)。
  • cdk.json - 此檔案會向工具組指出如何執行您的應用程式,以及與 CDK 和您的專案相關的一些額外設定和參數。

在本指南中,我們將著重於 lib/cdk-demo.ts 和 bin/cdk-demo.ts 檔案,以建立我們的基礎設施。我們將新增一段程式碼。

在我們的應用程式中定義若干項目

在主要堆疊中定義 VPC 之前,我們必須確定會部署至正確的帳戶和區域。雖然 CDK 會從您的本機 aws cli 組態中提取這項資訊,但建議您在 CDK 程式碼中手動加以設定,以避免在該組態變更時出現不正確的值。在本指南中必須進行此手動設定,因為我們將在 VPC 中定義設定。若您未加以指定,堆疊將可在各種環境中通用,但某些功能和內容查閱將無法運作。如需詳細資訊,請參閱文件中的環境

修改您的 bin/cdk-demo.ts 堆疊,使其顯示如下。請務必將您的 AWS 帳戶 ID 取代為正確的號碼,並選擇正確的區域。在本指南中,建議您選擇 us-east-1eu-west-1

#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { CdkDemoStack } from '../lib/cdk-demo-stack';

const app = new cdk.App();
new CdkDemoStack(app, 'CdkDemoStack', {
  env: { account: '123456789012', region: 'eu-west-1' },

});

您現已準備就緒,可撰寫第一個資源。

VPC 的程式碼

我們將建立具有兩個公開子網路、跨兩個可用區域的 VPC。在深入探討程式碼的撰寫之前,我們必須先解說並安裝建構程式庫模組。模組中會封裝不同的服務,而讓您僅新增您要佈建的基礎設施所需的相依性。模組可用於單一服務 (例如 AWS Amplify) 或多個服務 (例如 Amazon EC2)。在本指南中,我們將需要 Amazon EC2 模組,而其中也包含對 AWS VPC 的支援。

安裝您的模組時,我們將使用 npm。請在進入您的專案目錄後執行下列命令:

npm install @aws-cdk/aws-ec2

這將會安裝所有必要的模組供我們使用。如果您查看 package.json,您會發現命令也已新增至該處。

現在我們已可建立 VPC。開啟您在 lib/cdk-demo.ts 中的堆疊定義。第一次開啟此檔案時,您應該會看到如下的內容:

import * as cdk from '@aws-cdk/core';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

這是我們的專案框架。如果您立即執行 CDK,則不會建立任何資源,因為我們尚未定義。若要開始使用 VPC,我們必須匯入已安裝的模組,並參考其中的程式碼模組 - 我們將匯入 Vpc 和 SubnetType 類別。

import * as cdk from '@aws-cdk/core';

// CHANGE: This is where you import the classes from the module:
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
  }
}

在建立 VPC 時,我們可依據自己的需求設定多項屬性加以自訂。依預設將會建立跨 3 個可用區域 (AZ)、具有公有和私有子網路 (有單一網際網路閘道和 3 個 NAT 閘道) 的 VPC。在本指南中,我們只會建立跨 2 個 AZ (各有一個公有子網路) 的極簡設定。請參閱此文件,以取得其差異之處的詳細解說。 

在建立 VPC 時,我們將指定兩個 AZ 和用來建立公有子網路的詳細資料,如下所示:

import * as cdk from '@aws-cdk/core';
import { Vpc, SubnetType } from '@aws-cdk/aws-ec2';

export class CdkDemoStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
    // CHANGE: We have created the vpc object from the Vpc class.
    const vpc = new Vpc(this, 'MainVpc',{
    
    // CHANGE: this is where we define how many AZs to use
    maxAzs: 2,
      
   // CHANGE: We define a single subnet configuration per AZ.
      subnetConfiguration:  [
        {
          // CHANGE: this is it's CIDR mask so 255.255.255.0
          cidrMask: 24,

          // CHANGE: a name for each of these subnets
          name: 'public-subnet',

          // CHANGE: and the subnet type to be used - here we will have
          // a public subnet. There are other options available here.
          subnetType: SubnetType.PUBLIC
        },
      ]
    });
  }
}

現在,我們已可將此基礎設施變更部署至我們的帳戶。

部署時間

接著我們應測試部署。若要確認您的程式碼是否有效,可以執行會將 TypeScript 編譯為 JavaScript 的 npm build。如果測試成功,即可執行部署命令:

cdk deploy

這會將您的 TypeScript 編譯為 JavaScript,並建立 CloudFormation 變更集以部署此變更。CDK 會為您完成這一切,然後將範本檔案上傳至 S3,並使用 CloudFormation 加以執行。您應該會看到如下的輸出:

# cdk deploy
CdkDemoStack: deploying...
CdkDemoStack: creating CloudFormation changeset...
[··························································] (0/13)

3:50:17 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack            | CdkDemoStack
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::InternetGateway             | MainVpc/IGW
3:50:21 PM | CREATE_IN_PROGRESS   | AWS::EC2::VPC                         | MainVpc
3:50:22 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata                    | CDKMetadata/Default

幾分鐘後,您應該會看到一個綠色的勾號,以及新建 CloudFormation 堆疊的 ARN (Amazon 資源名稱)。您的新 VPC 現已部署並可供使用。

清理資源 (選擇性)

在本指南中建立的 VPC 將不會產生任何每月費用,但帳戶中的每個區域有其限額 (最多只能有 5 個 VPC) - 如有需要,您可以透過支援票證提高此限額。若要移除新建立的資源,您可以執行 cdk destroy 命令,此命令會透過先前建立的 CloudFormation 堆疊移除所有資源。

cdk destroy

您應該會收到以下提示。按下 Y 和 Enter 鍵之後,它就會開始移除所有基礎設施並提供更新。完成後,您將看到下列情況:

Are you sure you want to delete: CdkEcsInfraStack (y/n)? y
CdkEcsInfraStack: destroying...

✅  CdkEcsInfraStack: destroyed

結論

恭喜您! 您已完成 AWS CDK 入門指南。在本指南中,我們藉由建立 VPC,以 TypeScript 建立了我們的第一個 AWS CDK 專案。我們已了解如何初始化新的 CDK 專案,並用它來建立此基礎設施。此 CDK 程式碼和 VPC 將用於未來的指南中,建議您查看關於如何部署第一個 Web 應用程式的指南。 

如果您想要深入探討關於資料夾結構、架構、堆疊和應用程式之類的概念,建議您參閱文件。 

讓我們知道我們做的如何。

感謝您的意見回饋
我們很高興此頁面對您有所幫助。您願意分享更多詳細資訊以協助我們繼續改進嗎?
關閉
感謝您的意見回饋
很抱歉此頁面沒有幫助到您。您願意分享更多詳細資訊以協助我們繼續改進嗎?
關閉