Bereitstellung von Lambda-Funktionen mit dem AWS CDK - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Bereitstellung von Lambda-Funktionen mit dem AWS CDK

Das AWS Cloud Development Kit (AWS CDK) ist ein Infrastructure-as-Code-Framework (IaC), mit dem Sie die AWS Cloud-Infrastruktur mithilfe einer Programmiersprache Ihrer Wahl definieren können. Um Ihre eigene Cloud-Infrastruktur zu definieren, schreiben Sie zunächst eine App (in einer der CDK unterstützten Sprachen), die einen oder mehrere Stacks enthält. Anschließend synthetisieren Sie es zu einer AWS CloudFormation Vorlage und stellen Ihre Ressourcen auf Ihrem bereit. AWS-Konto Folgen Sie den Schritten in diesem Thema, um eine Lambda-Funktion bereitzustellen, die ein Ereignis von einem Amazon API Gateway-Endpunkt zurückgibt.

Die AWS Construct-Bibliothek, die im Lieferumfang von enthalten istCDK, stellt Module bereit, mit denen Sie die AWS-Services bereitgestellten Ressourcen modellieren können. Für die gängigen Dienste stellt die Bibliothek kuratierte Konstrukte bereit, die intelligente Standards und bewährte Methoden bereitstellen. Sie können das Modul aws_lambda verwenden, um Ihre Funktion und die unterstützenden Ressourcen mit nur wenigen Codezeilen zu definieren.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, installieren Sie das, AWS CDK indem Sie den folgenden Befehl ausführen.

npm install -g aws-cdk

Schritt 1: Richten Sie Ihr AWS CDK Projekt ein

Erstellen Sie ein Verzeichnis für Ihre neue AWS CDK App und initialisieren Sie das Projekt.

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

Aktivieren Sie nach dem Start des Projekts die virtuelle Umgebung des Projekts und installieren Sie die Basisabhängigkeiten für AWS CDK.

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

Importieren Sie dieses Maven-Projekt in Ihre integrierte Java-Entwicklungsumgebung (IDE). Wählen Sie in Eclipse beispielsweise Datei, Import, Maven, Existing Maven Projects.

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

Die AWS CDK Anwendungsvorlage verwendet den Namen des Projektverzeichnisses, um Namen für Quelldateien und Klassen zu generieren. In diesem Beispiel trägt das Verzeichnis den Namen hello-lambda. Wenn Sie einen anderen Projektverzeichnisnamen verwenden, stimmt Ihre App nicht mit diesen Anweisungen überein.

AWS CDK v2 enthält stabile Konstrukte für alle AWS-Services in einem einzigen Paket, das aufgerufen wirdaws-cdk-lib. Dieses Paket wird als Abhängigkeit installiert, wenn Sie das Projekt initialisieren. Wenn Sie mit bestimmten Programmiersprachen arbeiten, wird das Paket installiert, wenn Sie das Projekt zum ersten Mal erstellen.

Schritt 2: Definieren Sie den Stapel AWS CDK

Ein CDK Stack ist eine Sammlung von einem oder mehreren Konstrukten, die AWS Ressourcen definieren. Jeder CDK Stapel steht für einen AWS CloudFormation Stapel in Ihrer CDK App.

Um Ihren Stack zu definierenCDK, folgen Sie den Anweisungen für Ihre bevorzugte Programmiersprache. Dieser Stack definiert Folgendes:

  • Der logische Name der Funktion: MyFunction

  • Der Speicherort des Funktionscodes, der in der code Eigenschaft angegeben ist. Weitere Informationen finden Sie unter Handlercode in der AWS Cloud Development Kit (AWS CDK) APIReferenz.

  • Der REST API logische Name lautet: HelloApi

  • Der logische Name des API Gateway-Endpunkts: ApiGwEndpoint

Beachten Sie, dass alle CDK Stacks in diesem Tutorial die Laufzeit Node.js für die Lambda-Funktion verwenden. Sie können verschiedene Programmiersprachen für den CDK Stack und die Lambda-Funktion verwenden, um die Stärken der einzelnen Sprachen zu nutzen. Sie können beispielsweise for the CDK Stack verwenden TypeScript , um die Vorteile der statischen Typisierung für Ihren Infrastrukturcode zu nutzen. Sie können die Lambda-Funktion verwenden JavaScript , um die Flexibilität und schnelle Entwicklung einer dynamisch typisierten Sprache zu nutzen.

JavaScript

Öffnen Sie die Datei lib/hello-lambda-stack.js und ersetzen Sie den Inhalt durch Folgendes.

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.asset('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

Öffnen Sie die Datei lib/hello-lambda-stack.ts und ersetzen Sie den Inhalt durch Folgendes.

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

Öffnen Sie die Datei /hello-lambda/hello_lambda/hello_lambda_stack.py und ersetzen Sie den Inhalt durch Folgendes.

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

Öffnen Sie die Datei /hello-lambda/src/main/java/com/myorg/HelloLambdaStack.java und ersetzen Sie den Inhalt durch Folgendes.

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#

Öffnen Sie die Datei src/HelloLambda/HelloLambdaStack.cs und ersetzen Sie den Inhalt durch Folgendes.

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 }); } } }

Schritt 3: Erstellen Sie den Lambda-Funktionscode

  1. Erstellen Sie im Stammverzeichnis Ihres Projekts (hello-lambda) das /lib/lambda-handler Verzeichnis für den Lambda-Funktionscode. Dieses Verzeichnis ist in der code Eigenschaft Ihres AWS CDK Stacks angegeben.

  2. Erstellen Sie ein neues Feld namens index.js im /lib/lambda-handler Verzeichnis. Fügen Sie folgenden Code in die Datei ein. Die Funktion extrahiert bestimmte Eigenschaften aus der API Anfrage und gibt sie als JSON Antwort zurück.

    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, }; };

Schritt 4: Stellen Sie den AWS CDK Stack bereit

  1. Führen Sie im Stammverzeichnis Ihres Projekts den Befehl cdk synth aus:

    cdk synth

    Dieser Befehl synthetisiert eine AWS CloudFormation Vorlage aus Ihrem Stack. CDK Bei der Vorlage handelt es sich um eine etwa YAML 400-zeilige Datei, die der folgenden ähnelt.

    Anmerkung

    Wenn Sie die folgende Fehlermeldung erhalten, stellen Sie sicher, dass Sie sich im Stammverzeichnis Ihres Projektverzeichnisses befinden.

    --app is required either in command-line, in cdk.json or in ~/.cdk.json
    Beispiel AWS CloudFormation Vorlage
    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: nodejs20.x ...
  2. Führen Sie den Befehl cdk deploy aus:

    cdk deploy

    Warten Sie, bis Ihre Ressourcen erstellt wurden. Die endgültige Ausgabe umfasst die URL für Ihren API Gateway-Endpunkt. Beispiel:

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

Schritt 5: Testen Sie die Funktion

Um die Lambda-Funktion aufzurufen, kopieren Sie den API Gateway-Endpunkt und fügen Sie ihn in einen Webbrowser ein oder führen Sie einen curl Befehl aus:

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

Die Antwort ist eine JSON Darstellung der ausgewählten Eigenschaften des ursprünglichen Ereignisobjekts, das Informationen über die Anfrage an den API Gateway-Endpunkt enthält. Beispiel:

{ "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", ...

Schritt 6: Bereinigen Ihrer Ressourcen

Der API Gateway-Endpunkt ist öffentlich zugänglich. Um unerwartete Gebühren zu vermeiden, führen Sie den Befehl cdk destroy aus, um den Stack und alle zugehörigen Ressourcen zu löschen.

cdk destroy

Nächste Schritte

Informationen zum Schreiben von AWS CDK Apps in der Sprache Ihrer Wahl finden Sie im Folgenden:

TypeScript

Arbeiten mit AWS CDK dem TypeScript

JavaScript

Mit der Tinte AWS CDK arbeiten JavaScript

Python

Arbeiten mit dem AWS CDK in Python

Java

Arbeiten mit dem AWS CDK in Java

C#

Arbeiten mit dem AWS CDK in C#

Go

Arbeiten mit dem AWS CDK in Go