Lambda 계층이란 무엇이며 Java 런타임과 함께 사용하는 방법은 무엇입니까?

13109 단어 lambdacloudawsjava
서버리스 기능을 개발할 때 기능이 작동하려면 추가 종속성 또는 라이브러리가 필요한 경우가 많습니다. Lambda functions in java의 경우 함수에서 사용되는 서비스의 Amazon 종속성이 필요합니다. 그런 다음 함수와 해당 종속성을 fat jar에 압축하고 Lambda 함수에 업로드합니다. Java에서 람다 함수를 만드는 데 익숙하지 않은 경우 빠른 시작을 위해 this 게시물을 참조하십시오.

fat jar 접근 방식은 잘 작동하지만 동일한 종속성을 사용하는 여러 함수가 있는 경우 각 함수의 fat jar를 만드는 것은 좋은 접근 방식이 아니며 이러한 코드의 유지 관리도 어렵습니다. jar 버전을 변경하려면 각각의 개별 람다 함수를 변경해야 합니다.

보다 우아한 솔루션은 Lambda 계층을 사용하는 것입니다.

Lambda 계층이란 무엇입니까?



계층은 라이브러리, 사용자 정의 런타임 또는 기타 종속성을 포함하는 ZIP 아카이브입니다. 레이어를 사용하면 배포 패키지에 라이브러리를 포함하지 않고도 함수에서 라이브러리를 사용할 수 있습니다. 계층을 사용하면 배포 패키지를 작게 유지할 수 있으므로 개발이 더 쉬워집니다.

레이어는 함수 실행 환경의/opt 디렉터리로 추출됩니다. 각 런타임은 언어에 따라/opt 아래의 다른 위치에서 라이브러리를 찾습니다.

함수 생성 중 또는 이후에 함수 구성에서 최대 5개의 계층을 지정할 수 있습니다. 사용할 레이어의 특정 버전을 선택합니다. 나중에 다른 버전을 사용하려면 함수 구성을 업데이트하세요.

행동으로 보자



람다 환경 변수와 이벤트 세부 정보를 출력하는 기본 람다 함수를 작성합니다. 우리는 2개의 maven 프로젝트를 생성할 것입니다. 첫 번째 프로젝트에서는 Amazon 및 기타 필수 종속성을 포함합니다. 이 프로젝트는 Lambda Layer 역할을 합니다. 두 번째 프로젝트에서는 첫 번째 프로젝트를 종속성으로 포함하고 Lambda 핸들러를 작성합니다.

Lambda-Layer-Base라는 첫 번째 maven 프로젝트를 만들고 아래와 같이 pom을 업데이트합니다.
이 프로젝트에는 기능에 필요한 모든 공통 종속성이 포함되어 있습니다. 우리의 경우에는 lamdba-coregson 종속성을 추가했습니다. 또한 maven-shade-plugin를 추가하여 지방 항아리를 만들었습니다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.rajanpanchal</groupId>
    <artifactId>lambda-layer-base</artifactId>
    <version>1</version>
    <name>Lambda-Layer-Base</name>
    <description>Lambda base</description>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <aws.java.sdk.version>2.14.11</aws.java.sdk.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>software.amazon.awssdk</groupId>
                <artifactId>bom</artifactId>
                <version>${aws.java.sdk.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.6</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.2.4</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>



이 프로젝트에는 종속성만 포함됩니다. 이제 mavenclean install을 실행하면 대상 폴더에 jar(lambda-layer-base-1.jar)가 생성됩니다.

다른 maven 프로젝트를 생성하고 아래 내용으로 pom을 업데이트합니다. 첫 번째 프로젝트를 종속성( lambda-layer-base )으로 포함했습니다. 또한 의존성이 jar에 포함되는 것을 원하지 않기 때문에 더 이상 maven shade 플러그인을 사용하지 않습니다.

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>net.rajanpanchal</groupId>
    <artifactId>lambda-java-demo</artifactId>
    <version>1</version>
    <packaging>jar</packaging>
    <name>Lambda-Layers-Demo</name>
    <description>HelloWorld Lambda Layers Demo</description>
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <aws.java.sdk.version>2.14.11</aws.java.sdk.version>
    </properties>
    <dependencies>
    <dependency>
        <groupId>net.rajanpanchal</groupId>
        <artifactId>lambda-layer-base</artifactId>
        <version>1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${maven.compiler.source}</source>
                    <target>${maven.compiler.target}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>



Lambda 로직을 포함할 클래스 파일을 src/main/java에 추가합니다. 여기서 우리는 단지 몇 가지를 기록하고 있습니다.

package net.rajanpanchal.handlers;

import java.util.Map;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class HelloWorldHandler implements RequestHandler<Map<String,String>, String>{

      public String handleRequest(Map<String,String> event, Context context)
      {
        LambdaLogger logger = context.getLogger();
        String response = new String("200 OK");
        logger.log("ENVIRONMENT:"+System.getenv());
        // log execution details
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
        logger.log("CONTEXT: " + gson.toJson(context));
        // process event
        logger.log("EVENT: " + gson.toJson(event));
        logger.log("EVENT TYPE: " + event.getClass().toString());
        return response;
      }
    }



mavenpackage 명령을 실행하여 프로젝트에 대한 jar을 생성합니다. jar( lambda-java-demo-1.jar )가 대상 폴더에 생성되어야 합니다.

Lambda 계층 생성



레이어를 생성하기 위해 콘솔로 이동하기 전에 한 가지 중요한 단계를 완료하겠습니다. 레이어는/opt 디렉토리의 폴더로 추출된다는 점을 기억하십시오. 런타임에 따라 레이어를 폴더 구조로 패키징해야 합니다. Java의 경우 java/lib 폴더에 jar를 패키징해야 합니다. 람다 런타임에서 최종 폴더 구조는 /opt/java/lib/<your jar> 입니다. 이제 java/lib 폴더를 만들고 첫 번째 프로젝트에서 jar를 복사하고 폴더를 압축합니다. 이제 항아리를 람다 레이어로 업로드할 준비가 되었습니다.



Lambda 함수 생성



이제 람다 함수를 생성하고 방금 생성한 레이어를 지정합니다. 또한 두 번째 프로젝트의 jar를 함수 코드로 업로드합니다.



함수에 레이어 추가



함수 코드 jar 업로드 및 런타임 설정 업데이트


테스트 이벤트를 생성하고 테스트를 실행합니다.



소스 코드:





결론



Lambda 계층은 개발을 쉽고 오류 없이 만듭니다. 기능 배포 패키지의 크기를 줄입니다. 여러 기능에서 동일한 레이어를 사용할 수 있습니다.

게시물이 마음에 들면 자유롭게 공유하고 업데이트를 위해 저를 팔로우하세요!

좋은 웹페이지 즐겨찾기