View a markdown version of this page

Menyebarkan fungsi Lambda dengan AWS CDK - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menyebarkan fungsi Lambda dengan AWS CDK

Ini AWS Cloud Development Kit (AWS CDK) adalah kerangka infrastruktur sebagai kode (IAC) yang dapat Anda gunakan untuk mendefinisikan infrastruktur AWS cloud dengan menggunakan bahasa pemrograman pilihan Anda. Untuk menentukan infrastruktur cloud Anda sendiri, pertama-tama Anda menulis aplikasi (dalam salah satu bahasa yang didukung CDK) yang berisi satu atau lebih tumpukan. Kemudian, Anda mensintesisnya ke CloudFormation template dan menyebarkan sumber daya Anda ke templat Anda Akun AWS. Ikuti langkah-langkah dalam topik ini untuk menerapkan fungsi Lambda yang mengembalikan peristiwa dari titik akhir Amazon API Gateway.

Con AWS struct Library, disertakan dengan CDK, menyediakan modul yang dapat Anda gunakan untuk memodelkan sumber daya yang Layanan AWS disediakan. Untuk layanan populer, perpustakaan menyediakan konstruksi yang dikuratori dengan default cerdas dan praktik terbaik. Anda dapat menggunakan modul aws_lambda untuk menentukan fungsi Anda dan sumber daya pendukung hanya dengan beberapa baris kode.

Prasyarat

Sebelum memulai tutorial ini, instal AWS CDK dengan menjalankan perintah berikut.

npm install -g aws-cdk

Langkah 1: Siapkan AWS CDK proyek

Buat direktori untuk AWS CDK aplikasi baru Anda dan inisialisasi proyek.

JavaScript
mkdir hello-lambda cd hello-lambda cdk init --language javascript
TypeScript
mkdir hello-lambda cd hello-lambda cdk init --language typescript
Python
mkdir hello-lambda cd hello-lambda cdk init --language python

Setelah proyek dimulai, aktifkan lingkungan virtual proyek dan instal dependensi dasar untuk AWS CDK.

source .venv/bin/activate python -m pip install -r requirements.txt
Java
mkdir hello-lambda cd hello-lambda cdk init --language java

Impor proyek Maven ini ke lingkungan pengembangan terintegrasi Java (IDE) Anda. Misalnya, di Eclipse, pilih File, Impor, Maven, Proyek Maven yang Ada.

C#
mkdir hello-lambda cd hello-lambda cdk init --language csharp
catatan

Template AWS CDK aplikasi menggunakan nama direktori proyek untuk menghasilkan nama untuk file sumber dan kelas. Dalam contoh ini, direktori diberi namahello-lambda. Jika Anda menggunakan nama direktori proyek yang berbeda, aplikasi Anda tidak akan cocok dengan instruksi ini.

AWS CDK v2 menyertakan konstruksi stabil untuk semua Layanan AWS dalam satu paket yang dipanggilaws-cdk-lib. Paket ini diinstal sebagai dependensi saat Anda menginisialisasi proyek. Saat bekerja dengan bahasa pemrograman tertentu, paket diinstal ketika Anda membangun proyek untuk pertama kalinya.

Langkah 2: Tentukan AWS CDK tumpukan

Tumpukan CD K adalah kumpulan dari satu atau lebih konstruksi, yang mendefinisikan AWS sumber daya. Setiap tumpukan CDK mewakili tum CloudFormation pukan di aplikasi CDK Anda.

Untuk menentukan tumpukan CDK Anda, ikuti instruksi untuk bahasa pemrograman pilihan Anda. Tumpukan ini mendefinisikan sebagai berikut:

  • Nama logis fungsi: MyFunction

  • Lokasi kode fungsi, ditentukan dalam code properti. Untuk informasi selengkapnya, lihat Kode Handler di Refer AWS Cloud Development Kit (AWS CDK) ensi API.

  • Nama logis REST API: HelloApi

  • Nama logis titik akhir API Gateway: ApiGwEndpoint

Perhatikan bahwa semua tumpukan CDK dalam tutorial ini menggunakan Node.js runtime untuk fungsi Lambda. Anda dapat menggunakan bahasa pemrograman yang berbeda untuk tumpukan CDK dan fungsi Lambda untuk menggunakan kekuatan setiap bahasa. Misalnya, Anda dapat menggunakan TypeScript untuk tumpukan CDK untuk menggunakan manfaat pengetikan statis untuk kode infrastruktur Anda. Anda dapat menggunakan fungsi Lambda JavaScript untuk memanfaatkan fleksibilitas dan perkembangan cepat dari bahasa yang diketik secara dinamis.

JavaScript

Buka lib/hello-lambda-stack.js file dan ganti isinya dengan yang berikut ini.

const { Stack } = require('aws-cdk-lib'); const lambda = require('aws-cdk-lib/aws-lambda'); const apigw = require('aws-cdk-lib/aws-apigateway'); class HelloLambdaStack extends Stack { /** * * @param {Construct} scope * @param {string} id * @param {StackProps=} props */ constructor(scope, id, props) { super(scope, id, props); const fn = new lambda.Function(this, 'MyFunction', { code: lambda.Code.fromAsset('lib/lambda-handler'), runtime: lambda.Runtime.NODEJS_LATEST, handler: 'index.handler' }); const endpoint = new apigw.LambdaRestApi(this, 'MyEndpoint', { handler: fn, restApiName: "HelloApi" }); } } module.exports = { HelloLambdaStack }
TypeScript

Buka lib/hello-lambda-stack.ts file dan ganti isinya dengan yang berikut ini.

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as apigw from "aws-cdk-lib/aws-apigateway"; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as path from 'node:path'; export class HelloLambdaStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps){ super(scope, id, props) const fn = new lambda.Function(this, 'MyFunction', { runtime: lambda.Runtime.NODEJS_LATEST, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), }); const endpoint = new apigw.LambdaRestApi(this, `ApiGwEndpoint`, { handler: fn, restApiName: `HelloApi`, }); } }
Python

Buka /hello-lambda/hello_lambda/hello_lambda_stack.py file dan ganti isinya dengan yang berikut ini.

from aws_cdk import ( Stack, aws_apigateway as apigw, aws_lambda as _lambda ) from constructs import Construct class HelloLambdaStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) fn = _lambda.Function( self, "MyFunction", runtime=_lambda.Runtime.NODEJS_LATEST, handler="index.handler", code=_lambda.Code.from_asset("lib/lambda-handler") ) endpoint = apigw.LambdaRestApi( self, "ApiGwEndpoint", handler=fn, rest_api_name="HelloApi" )
Java

Buka /hello-lambda/src/main/java/com/myorg/HelloLambdaStack.java file dan ganti isinya dengan yang berikut ini.

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.apigateway.LambdaRestApi; import software.amazon.awscdk.services.lambda.Function; public class HelloLambdaStack extends Stack { public HelloLambdaStack(final Construct scope, final String id) { this(scope, id, null); } public HelloLambdaStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Function hello = Function.Builder.create(this, "MyFunction") .runtime(software.amazon.awscdk.services.lambda.Runtime.NODEJS_LATEST) .code(software.amazon.awscdk.services.lambda.Code.fromAsset("lib/lambda-handler")) .handler("index.handler") .build(); LambdaRestApi api = LambdaRestApi.Builder.create(this, "ApiGwEndpoint") .restApiName("HelloApi") .handler(hello) .build(); } }
C#

Buka src/HelloLambda/HelloLambdaStack.cs file dan ganti isinya dengan yang berikut ini.

using Amazon.CDK; using Amazon.CDK.AWS.APIGateway; using Amazon.CDK.AWS.Lambda; using Constructs; namespace HelloLambda { public class HelloLambdaStack : Stack { internal HelloLambdaStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var fn = new Function(this, "MyFunction", new FunctionProps { Runtime = Runtime.NODEJS_LATEST, Code = Code.FromAsset("lib/lambda-handler"), Handler = "index.handler" }); var api = new LambdaRestApi(this, "ApiGwEndpoint", new LambdaRestApiProps { Handler = fn }); } } }

Langkah 3: Buat kode fungsi Lambda

  1. Dari root proyek Anda (hello-lambda), buat /lib/lambda-handler direktori untuk kode fungsi Lambda. Direktori ini ditentukan dalam code properti AWS CDK tumpukan Anda.

  2. Buat file baru yang disebut index.js di /lib/lambda-handler direktori. Tempel kode berikut ke file. Fungsi mengekstrak properti tertentu dari permintaan API dan mengembalikannya sebagai respons JSON.

    exports.handler = async (event) => { // Extract specific properties from the event object const { resource, path, httpMethod, headers, queryStringParameters, body } = event; const response = { resource, path, httpMethod, headers, queryStringParameters, body, }; return { body: JSON.stringify(response, null, 2), statusCode: 200, }; };

Langkah 4: Terapkan AWS CDK tumpukan

  1. Dari root proyek Anda, jalankan perintah cdk synth:

    cdk synth

    Perintah ini mensintesis AWS CloudFormation template dari tumpukan CDK Anda. Template adalah file YAML sekitar 400 baris, mirip dengan berikut ini.

    catatan

    Jika Anda mendapatkan kesalahan berikut, pastikan bahwa Anda berada di root direktori proyek Anda.

    --app is required either in command-line, in cdk.json or in ~/.cdk.json
    contoh CloudFormation templat
    Resources: MyFunctionServiceRole3C357FF2: 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: HelloLambdaStack/MyFunction/ServiceRole/Resource MyFunction1BAA52E7: Type: AWS::Lambda::Function Properties: Code: S3Bucket: Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region} S3Key: ab1111111cd32708dc4b83e81a21c296d607ff2cdef00f1d7f48338782f92l3901.zip Handler: index.handler Role: Fn::GetAtt: - MyFunctionServiceRole3C357FF2 - Arn Runtime: nodejs24.x ...
  2. Jalankan perintah cdk deploy:

    cdk deploy

    Tunggu sementara sumber daya Anda dibuat. Output akhir menyertakan URL untuk titik akhir API Gateway Anda. Contoh:

    Outputs: HelloLambdaStack.ApiGwEndpoint77F417B1 = https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/

Langkah 5: Uji fungsinya

Untuk memanggil fungsi Lambda, salin titik akhir API Gateway dan tempelkan ke browser web atau jalankan perintah: curl

curl -s https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/

Respons adalah representasi JSON dari properti yang dipilih dari objek peristiwa asli, yang berisi informasi tentang permintaan yang dibuat ke titik akhir API Gateway. Contoh:

{ "resource": "/", "path": "/", "httpMethod": "GET", "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "en-US,en;q=0.9", "CloudFront-Forwarded-Proto": "https", "CloudFront-Is-Desktop-Viewer": "true", "CloudFront-Is-Mobile-Viewer": "false", "CloudFront-Is-SmartTV-Viewer": "false", "CloudFront-Is-Tablet-Viewer": "false", "CloudFront-Viewer-ASN": "16509", "CloudFront-Viewer-Country": "US", "Host": "abcd1234.execute-api.us-east-1.amazonaws.com", ...

Langkah 6: Bersihkan sumber daya Anda

Titik akhir API Gateway dapat diakses publik. Untuk mencegah biaya tak terduga, jalankan perintah cdk estroy untuk menghapus tumpukan dan semua sumber daya terkait.

cdk destroy

Langkah selanjutnya

Untuk informasi tentang menulis AWS CDK aplikasi dalam bahasa pilihan Anda, lihat berikut ini:

TypeScript

Bekerja dengan bagian AWS CDK dalam TypeScript

JavaScript

Bekerja dengan bagian AWS CDK dalam JavaScript

Python

Bekerja AWS CDK dengan Python

Java

Bekerja dengan AWS CDK di Jawa

C#

Bekerja dengan AWS CDK di C #

Go

Bekerja dengan AWS CDK in Go