Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Dalam tutorial ini, Anda menggunakan AWS Cloud Development Kit (AWS CDK) untuk membuat serverless sederhana Hello World aplikasi yang mengimplementasikan backend API dasar yang terdiri dari berikut ini:
-
Amazon API Gateway REST API— Menyediakan titik akhir HTTP yang digunakan untuk memanggil fungsi Anda melalui HTTP GET permintaan.
-
AWS Lambda fungsi - Fungsi yang mengembalikan
Hello World!
pesan ketika dipanggil dengan HTTP titik akhir. -
Integrasi dan izin — Detail konfigurasi dan izin untuk sumber daya Anda untuk berinteraksi satu sama lain dan melakukan tindakan, seperti menulis log ke Amazon. CloudWatch
Diagram berikut menunjukkan komponen dari aplikasi ini:

Untuk tutorial ini, Anda akan membuat dan berinteraksi dengan aplikasi Anda dalam langkah-langkah berikut:
-
Buat AWS CDK proyek.
-
Tentukan fungsi Lambda dan API REST API Gateway API menggunakan konstruksi L2 dari Construct Library. AWS
-
Terapkan aplikasi Anda ke file. AWS Cloud
-
Berinteraksi dengan aplikasi Anda di AWS Cloud.
-
Hapus aplikasi sampel dari file AWS Cloud.
Topik
Prasyarat
Sebelum memulai tutorial ini, selesaikan yang berikut ini:
-
Membuat Akun AWS dan memiliki AWS Command Line Interface (AWS CLI) diinstal dan dikonfigurasi.
-
Menginstal Node.js and npm.
-
Instal CDK Toolkit secara global, menggunakan.
npm install -g aws-cdk
Untuk informasi selengkapnya, lihat Memulai dengan AWS CDK.
Kami juga merekomendasikan pemahaman dasar tentang hal-hal berikut:
-
Apa itu AWS CDK?untuk pengantar dasar untuk AWS CDK.
-
Pelajari konsep AWS CDK intiuntuk ikhtisar konsep inti dari AWS CDK.
Langkah 1: Buat proyek CDK
Pada langkah ini, Anda membuat proyek CDK baru menggunakan AWS CDK CLI cdk init
perintah.
Untuk membuat proyek CDK
-
Dari direktori awal pilihan Anda, buat dan navigasikan ke direktori proyek yang diberi nama
cdk-hello-world
di mesin Anda:$
mkdir cdk-hello-world && cd cdk-hello-world
-
Gunakan
cdk init
perintah untuk membuat proyek baru dalam bahasa pemrograman pilihan Anda:$
cdk init --language typescript
Instal AWS CDK pustaka:
$
npm install aws-cdk-lib constructs
CDK CLI membuat proyek dengan struktur berikut:
cdk-hello-world ├── .git ├── .gitignore ├── .npmignore ├── README.md ├── bin │ └── cdk-hello-world.ts ├── cdk.json ├── jest.config.js ├── lib │ └── cdk-hello-world-stack.ts ├── node_modules ├── package-lock.json ├── package.json ├── test │ └── cdk-hello-world.test.ts └── tsconfig.json
CDK CLI secara otomatis membuat aplikasi CDK yang berisi satu tumpukan. Instance aplikasi CDK dibuat dari App
kelas. Berikut ini adalah bagian dari file aplikasi CDK Anda:
Terletak dibin/cdk-hello-world.ts
:
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from 'aws-cdk-lib';
import { CdkHelloWorldStack } from '../lib/cdk-hello-world-stack';
const app = new cdk.App();
new CdkHelloWorldStack(app, 'CdkHelloWorldStack', {
});
Langkah 2: Buat fungsi Lambda Anda
Dalam proyek CDK Anda, buat lambda
direktori yang menyertakan hello.js
file baru. Berikut adalah contohnya:
Dari akar proyek Anda, jalankan yang berikut ini:
$
mkdir lambda && cd lambda
$
touch hello.js
Berikut ini sekarang harus ditambahkan ke proyek CDK Anda:
cdk-hello-world
└── lambda
└── hello.js
catatan
Agar tutorial ini tetap sederhana, kami menggunakan JavaScript Fungsi Lambda untuk semua bahasa pemrograman CDK.
Tentukan fungsi Lambda Anda dengan menambahkan yang berikut ini ke file yang baru dibuat:
exports.handler = async (event) => {
return {
statusCode: 200,
headers: { "Content-Type": "text/plain" },
body: JSON.stringify({ message: "Hello, World!" }),
};
};
Langkah 3: Tentukan konstruksi Anda
Pada langkah ini, Anda akan menentukan sumber daya Lambda dan API Gateway Anda menggunakan konstruksi AWS CDK L2.
Buka file proyek yang mendefinisikan tumpukan CDK Anda. Anda akan memodifikasi file ini untuk menentukan konstruksi Anda. Berikut ini adalah contoh file stack awal Anda:
Terletak dilib/cdk-hello-world-stack.ts
:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkHelloWorldStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Your constructs will go here
}
}
Dalam file ini, melakukan hal berikut: AWS CDK
-
Instans tumpukan CDK Anda dipakai dari kelas.
Stack
-
Kelas
Constructs
dasar diimpor dan disediakan sebagai lingkup atau induk dari instance tumpukan Anda.
Tentukan sumber daya fungsi Lambda Anda
Untuk menentukan sumber daya fungsi Lambda, Anda mengimpor dan menggunakan konstruksi aws-lambda
L2 dari Construct Library. AWS
Ubah file tumpukan Anda sebagai berikut:
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
// Import Lambda L2 construct
import * as lambda from 'aws-cdk-lib/aws-lambda';
export class CdkHelloWorldStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Define the Lambda function resource
const helloWorldFunction = new lambda.Function(this, 'HelloWorldFunction', {
runtime: lambda.Runtime.NODEJS_20_X, // Choose any supported Node.js runtime
code: lambda.Code.fromAsset('lambda'), // Points to the lambda directory
handler: 'hello.handler', // Points to the 'hello' file in the lambda directory
});
}
}
Di sini, Anda membuat sumber daya fungsi Lambda dan menentukan properti berikut:
-
runtime
— Lingkungan tempat fungsi berjalan. Di sini, kami menggunakan Node.js versi 20.x. -
code
— Jalur ke kode fungsi pada mesin lokal Anda. -
handler
— Nama file tertentu yang berisi kode fungsi Anda.
Tentukan API Gateway Anda REST API sumber daya
Untuk menentukan API Gateway REST API resource, Anda mengimpor dan menggunakan konstruksi aws-apigateway
L2 dari Construct Library AWS .
Ubah file tumpukan Anda sebagai berikut:
// ...
//Import API Gateway L2 construct
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
export class CdkHelloWorldStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// ...
// Define the API Gateway resource
const api = new apigateway.LambdaRestApi(this, 'HelloWorldApi', {
handler: helloWorldFunction,
proxy: false,
});
// Define the '/hello' resource with a GET method
const helloResource = api.root.addResource('hello');
helloResource.addMethod('GET');
}
}
Di sini, Anda membuat API Gateway REST API sumber daya, bersama dengan yang berikut:
-
Integrasi antara REST API dan fungsi Lambda Anda, memungkinkan API untuk menjalankan fungsi Anda. Ini termasuk pembuatan sumber daya izin Lambda.
-
Sumber daya atau jalur baru bernama
hello
yang ditambahkan ke root titik akhir API. Ini menciptakan titik akhir baru yang/hello
menambah basis Anda URL. -
Metode GET untuk
hello
sumber daya. Ketika permintaan GET dikirim ke/hello
titik akhir, fungsi Lambda dipanggil dan responsnya dikembalikan.
Langkah 4: Siapkan aplikasi Anda untuk penyebaran
Pada langkah ini Anda mempersiapkan aplikasi Anda untuk penyebaran dengan membangun, jika perlu, dan melakukan validasi dasar dengan AWS CDK CLI cdk synth
perintah.
Jika perlu, buat aplikasi Anda:
Dari akar proyek Anda, jalankan yang berikut ini:
$
npm run build
Jalankan cdk synth
untuk mensintesis AWS CloudFormation template dari kode CDK Anda. Dengan menggunakan konstruksi L2, banyak detail konfigurasi yang diperlukan oleh AWS CloudFormation untuk memfasilitasi interaksi antara fungsi Lambda Anda dan REST API disediakan untuk Anda oleh. AWS CDK
Dari akar proyek Anda, jalankan yang berikut ini:
$
cdk synth
catatan
Jika Anda menerima kesalahan seperti berikut ini, verifikasi bahwa Anda berada di cdk-hello-world
direktori dan coba lagi:
--app is required either in command-line, in cdk.json or in ~/.cdk.json
Jika berhasil, AWS CDK CLI akan menampilkan AWS CloudFormation template di YAML format pada prompt perintah. A JSON template yang diformat juga disimpan dalam cdk.out
direktori.
Berikut ini adalah contoh output dari AWS CloudFormation template:
Resources:
HelloWorldFunctionServiceRoleunique-identifier
:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: lambda.amazonaws.com
Version: "2012-10-17"
ManagedPolicyArns:
- Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldFunction/ServiceRole/Resource
HelloWorldFunctionunique-identifier
:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket:
Fn::Sub: cdk-unique-identifier
-assets-${AWS::AccountId}-${AWS::Region}
S3Key: unique-identifier
.zip
Handler: hello.handler
Role:
Fn::GetAtt:
- HelloWorldFunctionServiceRoleunique-identifier
- Arn
Runtime: nodejs20.x
DependsOn:
- HelloWorldFunctionServiceRoleunique-identifier
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldFunction/Resource
aws:asset:path: asset.unique-identifier
aws:asset:is-bundled: false
aws:asset:property: Code
HelloWorldApiunique-identifier
:
Type: AWS::ApiGateway::RestApi
Properties:
Name: HelloWorldApi
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/Resource
HelloWorldApiDeploymentunique-identifier
:
Type: AWS::ApiGateway::Deployment
Properties:
Description: Automatically created by the RestApi construct
RestApiId:
Ref: HelloWorldApiunique-identifier
DependsOn:
- HelloWorldApihelloGETunique-identifier
- HelloWorldApihellounique-identifier
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/Deployment/Resource
HelloWorldApiDeploymentStageprod012345ABC
:
Type: AWS::ApiGateway::Stage
Properties:
DeploymentId:
Ref: HelloWorldApiDeploymentunique-identifier
RestApiId:
Ref: HelloWorldApiunique-identifier
StageName: prod
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/DeploymentStage.prod/Resource
HelloWorldApihellounique-identifier
:
Type: AWS::ApiGateway::Resource
Properties:
ParentId:
Fn::GetAtt:
- HelloWorldApiunique-identifier
- RootResourceId
PathPart: hello
RestApiId:
Ref: HelloWorldApiunique-identifier
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/Default/hello/Resource
HelloWorldApihelloGETApiPermissionCdkHelloWorldStackHelloWorldApiunique-identifier
:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName:
Fn::GetAtt:
- HelloWorldFunctionunique-identifier
- Arn
Principal: apigateway.amazonaws.com
SourceArn:
Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- ":execute-api:"
- Ref: AWS::Region
- ":"
- Ref: AWS::AccountId
- ":"
- Ref: HelloWorldApi9E278160
- /
- Ref: HelloWorldApiDeploymentStageprodunique-identifier
- /GET/hello
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/Default/hello/GET/ApiPermission.CdkHelloWorldStackHelloWorldApiunique-identifier
.GET..hello
HelloWorldApihelloGETApiPermissionTestCdkHelloWorldStackHelloWorldApiunique-identifier
:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName:
Fn::GetAtt:
- HelloWorldFunctionunique-identifier
- Arn
Principal: apigateway.amazonaws.com
SourceArn:
Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- ":execute-api:"
- Ref: AWS::Region
- ":"
- Ref: AWS::AccountId
- ":"
- Ref: HelloWorldApiunique-identifier
- /test-invoke-stage/GET/hello
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/Default/hello/GET/ApiPermission.Test.CdkHelloWorldStackHelloWorldApiunique-identifier
.GET..hello
HelloWorldApihelloGETunique-identifier
:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationType: NONE
HttpMethod: GET
Integration:
IntegrationHttpMethod: POST
Type: AWS_PROXY
Uri:
Fn::Join:
- ""
- - "arn:"
- Ref: AWS::Partition
- ":apigateway:"
- Ref: AWS::Region
- :lambda:path/2015-03-31/functions/
- Fn::GetAtt:
- HelloWorldFunctionunique-identifier
- Arn
- /invocations
ResourceId:
Ref: HelloWorldApihellounique-identifier
RestApiId:
Ref: HelloWorldApiunique-identifier
Metadata:
aws:cdk:path: CdkHelloWorldStack/HelloWorldApi/Default/hello/GET/Resource
CDKMetadata:
Type: AWS::CDK::Metadata
Properties:
Analytics: v2:deflate64:unique-identifier
Metadata:
aws:cdk:path: CdkHelloWorldStack/CDKMetadata/Default
Condition: CDKMetadataAvailable
Outputs:
HelloWorldApiEndpointunique-identifier
:
Value:
Fn::Join:
- ""
- - https://
- Ref: HelloWorldApiunique-identifier
- .execute-api.
- Ref: AWS::Region
- "."
- Ref: AWS::URLSuffix
- /
- Ref: HelloWorldApiDeploymentStageprodunique-identifier
- /
Conditions:
CDKMetadataAvailable:
Fn::Or:
- Fn::Or:
- Fn::Equals:
- Ref: AWS::Region
- af-south-1
- Fn::Equals:
- Ref: AWS::Region
- ap-east-1
- Fn::Equals:
- Ref: AWS::Region
- ap-northeast-1
- Fn::Equals:
- Ref: AWS::Region
- ap-northeast-2
- Fn::Equals:
- Ref: AWS::Region
- ap-south-1
- Fn::Equals:
- Ref: AWS::Region
- ap-southeast-1
- Fn::Equals:
- Ref: AWS::Region
- ap-southeast-2
- Fn::Equals:
- Ref: AWS::Region
- ca-central-1
- Fn::Equals:
- Ref: AWS::Region
- cn-north-1
- Fn::Equals:
- Ref: AWS::Region
- cn-northwest-1
- Fn::Or:
- Fn::Equals:
- Ref: AWS::Region
- eu-central-1
- Fn::Equals:
- Ref: AWS::Region
- eu-north-1
- Fn::Equals:
- Ref: AWS::Region
- eu-south-1
- Fn::Equals:
- Ref: AWS::Region
- eu-west-1
- Fn::Equals:
- Ref: AWS::Region
- eu-west-2
- Fn::Equals:
- Ref: AWS::Region
- eu-west-3
- Fn::Equals:
- Ref: AWS::Region
- il-central-1
- Fn::Equals:
- Ref: AWS::Region
- me-central-1
- Fn::Equals:
- Ref: AWS::Region
- me-south-1
- Fn::Equals:
- Ref: AWS::Region
- sa-east-1
- Fn::Or:
- Fn::Equals:
- Ref: AWS::Region
- us-east-1
- Fn::Equals:
- Ref: AWS::Region
- us-east-2
- Fn::Equals:
- Ref: AWS::Region
- us-west-1
- Fn::Equals:
- Ref: AWS::Region
- us-west-2
Parameters:
BootstrapVersion:
Type: AWS::SSM::Parameter::Value<String>
Default: /cdk-bootstrap/hnb659fds/version
Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip]
Rules:
CheckBootstrapVersion:
Assertions:
- Assert:
Fn::Not:
- Fn::Contains:
- - "1"
- "2"
- "3"
- "4"
- "5"
- Ref: BootstrapVersion
AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.
Dengan menggunakan konstruksi L2, Anda mendefinisikan beberapa properti untuk mengonfigurasi sumber daya Anda dan menggunakan metode pembantu untuk mengintegrasikannya bersama-sama. AWS CDK Konfigurasi sebagian besar AWS CloudFormation sumber daya dan properti yang diperlukan untuk menyediakan aplikasi Anda.
Langkah 5: Menerapkan aplikasi Anda
Pada langkah ini, Anda menggunakan AWS CDK CLI cdk deploy
perintah untuk menyebarkan aplikasi Anda. AWS CDK Bekerja dengan AWS CloudFormation layanan untuk menyediakan sumber daya Anda.
penting
Anda harus melakukan bootstrap satu kali dari lingkungan Anda AWS sebelum penerapan. Untuk petunjuk, silakan lihat Bootstrap lingkungan Anda untuk digunakan dengan AWS CDK.
Dari akar proyek Anda, jalankan yang berikut ini. Konfirmasikan perubahan jika diminta:
$
cdk deploy
✨ Synthesis time: 2.44s ... Do you wish to deploy these changes (y/n)?y
Saat penerapan selesai, AWS CDK CLI akan menampilkan URL titik akhir Anda. Salin URL ini untuk langkah selanjutnya. Berikut adalah contohnya:
... ✅ HelloWorldStack ✨ Deployment time: 45.37s Outputs: HelloWorldStack.HelloWorldApiEndpoint
unique-identifier
= https://<api-id>
.execute-api.<region>
.amazonaws.com/prod/ Stack ARN: arn:aws:cloudformation:region
:account-id
:stack/HelloWorldStack/unique-identifier
...
Langkah 6: Berinteraksi dengan aplikasi Anda
Pada langkah ini, Anda memulai permintaan GET ke titik akhir API Anda dan menerima respons fungsi Lambda Anda.
Temukan URL titik akhir Anda dari langkah sebelumnya dan tambahkan /hello
jalurnya. Kemudian, menggunakan browser atau command prompt Anda, kirim permintaan GET ke titik akhir Anda. Berikut adalah contohnya:
$
curl https://
{"message":"Hello World!"}%<api-id>
.execute-api.<region>
.amazonaws.com/prod/hello
Selamat, Anda telah berhasil membuat, menyebarkan, dan berinteraksi dengan aplikasi Anda menggunakan! AWS CDK
Langkah 7: Hapus aplikasi Anda
Pada langkah ini, Anda menggunakan AWS CDK CLI untuk menghapus aplikasi Anda dari AWS Cloud.
Untuk menghapus aplikasi Anda, jalankancdk destroy
. Saat diminta, konfirmasikan permintaan Anda untuk menghapus aplikasi:
$
cdk destroy
Are you sure you want to delete: CdkHelloWorldStack (y/n)?y
CdkHelloWorldStack: destroying... [1/1] ... ✅ CdkHelloWorldStack: destroyed
Pemecahan Masalah
Kesalahan: {“message”: “Kesalahan server internal”}%
Saat menjalankan fungsi Lambda yang diterapkan, Anda menerima kesalahan ini. Kesalahan ini dapat terjadi karena berbagai alasan.
Untuk memecahkan masalah lebih lanjut
Gunakan tombol AWS CLI untuk menjalankan fungsi Lambda Anda.
-
Ubah file tumpukan Anda untuk menangkap nilai output dari nama fungsi Lambda yang Anda gunakan. Berikut adalah contohnya:
... class CdkHelloWorldStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define the Lambda function resource // ... new CfnOutput(this, 'HelloWorldFunctionName', { value: helloWorldFunction.functionName, description: 'JavaScript Lambda function' }); // Define the API Gateway resource // ...
-
Terapkan aplikasi Anda lagi. The AWS CDK CLI akan menampilkan nilai nama fungsi Lambda yang Anda gunakan:
$
cdk deploy
✨ Synthesis time: 0.29s ... ✅ CdkHelloWorldStack ✨ Deployment time: 20.36s Outputs: ... CdkHelloWorldStack.HelloWorldFunctionName = CdkHelloWorldStack-HelloWorldFunctionunique-identifier
... -
Gunakan tombol AWS CLI untuk menjalankan fungsi Lambda Anda AWS Cloud di dan menampilkan respons ke file teks:
$
aws lambda invoke --function-name CdkHelloWorldStack-HelloWorldFunction
unique-identifier
output.txt -
Periksa
output.txt
untuk melihat hasil Anda.
- Kemungkinan penyebabnya: Sumber daya API Gateway didefinisikan secara tidak benar di file tumpukan Anda.
-
Jika
output.txt
menunjukkan respons fungsi Lambda yang berhasil, masalahnya mungkin terkait dengan cara Anda mendefinisikan API REST API Gateway API Anda. Itu AWS CLI memanggil Lambda Anda secara langsung, bukan melalui titik akhir Anda. Periksa kode Anda untuk memastikannya cocok dengan tutorial ini. Kemudian, gunakan lagi. - Kemungkinan penyebabnya: Sumber daya Lambda didefinisikan secara tidak benar di file tumpukan Anda.
-
Jika
output.txt
mengembalikan kesalahan, masalahnya mungkin dengan cara Anda mendefinisikan fungsi Lambda Anda. Periksa kode Anda untuk memastikannya cocok dengan tutorial ini. Kemudian gunakan lagi.