Java Lambda 함수를 위한 계층 작업 - AWS Lambda

Java Lambda 함수를 위한 계층 작업

Lambda 계층은 추가 코드 또는 데이터를 포함하는 .zip 파일 아카이브입니다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.

  1. 계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.

  2. Lambda에서 계층을 생성합니다.

  3. 계층을 함수에 추가합니다.

이 주제에는 외부 라이브러리 종속성이 있는 Java Lambda 계층을 올바르게 패키징하고 생성하는 방법에 대한 단계와 지침이 포함되어 있습니다.

사전 조건

이 섹션의 단계를 수행하려면 다음이 필요합니다.

참고

Maven이 참조하는 Java 버전이 배포하려는 함수의 Java 버전과 동일한지 확인합니다. 예를 들어 Java 21 함수의 경우에 mvn -v 명령은 출력에 Java 버전 21을 나열해야 합니다.

Apache Maven 3.8.6 ... Java version: 21.0.2, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home ...

이 주제에서는 awsdocs GitHub 리포지토리에 있는 layer-java 샘플 애플리케이션을 참조합니다. 이 애플리케이션은 종속성을 다운로드하고 계층을 생성하는 스크립트를 포함합니다. 애플리케이션은 계층의 종속성을 사용하는 해당 함수도 포함합니다. 계층을 생성한 후 해당 함수를 배포하고 간접 호출하여 모든 것이 제대로 작동하는지 확인할 수 있습니다. 함수에 Java 21 런타임을 사용하므로 계층도 Java 21과 호환되어야 합니다.

layer-java 샘플 애플리케이션에는 두 개의 하위 디렉터리 내에 하나의 예제가 포함되어 있습니다. layer 디렉터리에는 계층 종속성을 정의하는 pom.xml 파일과 계층을 생성하기 위한 스크립트가 포함되어 있습니다. function 디렉터리는 계층이 작동하는지 테스트하는 데 도움이 되는 샘플 함수를 포함합니다. 이 자습서는 이 계층을 생성하고 패키징하는 방법을 안내합니다.

Amazon Linux와의 Java 계층 호환성

계층을 생성하는 첫 번째 단계는 모든 계층 콘텐츠를.zip 파일 아카이브로 번들링하는 것입니다. Lambda 함수는 Amazon Linux에서 실행되기 때문에 계층 콘텐츠는 Linux 환경에서 컴파일하고 빌드할 수 있어야 합니다.

Java 코드는 플랫폼에 구애받지 않도록 설계되었으므로 Linux 환경을 사용하지 않더라도 로컬 시스템에서 계층을 패키징할 수 있습니다. Lambda에 Java 계층을 업로드한 후에도 여전히 Amazon Linux와 호환됩니다.

Java 런타임의 계층 경로

함수에 계층을 추가하면 Lambda는 계층 콘텐츠를 해당 실행 환경의 /opt 디렉터리로 추출합니다. 각 Lambda 런타임에 대해 PATH 변수에는 /opt 디렉터리 내의 특정 폴더 경로가 이미 포함되어 있습니다. Lambda가 계층 콘텐츠를 가져오도록 하려면 계층 .zip 파일의 종속성이 다음 폴더 경로에 있어야 합니다.

  • java/lib

예를 들어 이 자습서에서 생성하는 결과 레이어 .zip 파일의 디렉터리 구조는 다음과 같습니다.

layer_content.zip └ java └ lib └ layer-java-layer-1.0-SNAPSHOT.jar

layer-java-layer-1.0-SNAPSHOT.jar JAR 파일(필요한 모든 종속성을 포함하는 uber-jar)이 java/lib 디렉터리에 올바르게 위치해 있습니다. 이렇게 하면 함수 호출 중에 Lambda가 라이브러리를 찾을 수 있습니다.

계층 콘텐츠의 패키징

이 예제에서는 다음 2개의 Java 라이브러리를 하나의 JAR 파일로 패키징합니다.

  • aws-lambda-java-core - AWS Lambda에서 Java로 작업하기 위한 최소한의 인터페이스 정의 집합입니다.

  • Jackson - 특히 JSON 작업에 널리 사용되는 데이터 처리 도구 모음입니다.

다음 단계를 완료하여 계층 콘텐츠를 설치하고 패키징합니다.

계층 콘텐츠를 설치하고 패키징하려면 다음을 수행합니다.
  1. sample-apps/layer-java 디렉터리에 필요한 샘플 코드가 포함된 aws-lambda-developer-guide GitHub 리포지토리를 복제합니다.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. layer-java 샘플 앱의 layer 디렉터리로 이동합니다. 이 디렉터리에는 계층을 올바르게 생성하고 패키징하는 데 사용하는 스크립트가 포함되어 있습니다.

    cd aws-lambda-developer-guide/sample-apps/layer-java/layer
  3. pom.xml 파일을 검사합니다. 이 <dependencies> 섹션에서는 계층에 포함할 종속성, 즉 aws-lambda-java-corejackson-databind 라이브러리를 정의합니다. 이 파일을 업데이트하여 자체 계층에 포함하려는 종속성을 포함할 수 있습니다.

    예 pom.xml
    <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.3</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.0</version> </dependency> </dependencies>
    참고

    pom.xml 파일의 <build> 섹션에는 2개의 플러그인이 포함되어 있습니다. maven-compiler-plugin은 소스 코드를 컴파일합니다. maven-shade-plugin은 아티팩트를 단일 uber-jar로 패키징합니다.

  4. 두 스크립트를 모두 실행할 수 있는 권한이 있는지 확인하세요.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 다음 명령을 사용하여 1-install.sh 스크립트를 실행하세요.

    ./1-install.sh

    이 스크립트는 현재 디렉터리에서 mvn clean install을 실행합니다. 그러면 target/ 디렉터리에 필요한 모든 종속성이 포함된 uber-jar가 생성됩니다.

    예 1-install.sh
    mvn clean install
  6. 다음 명령을 사용하여 2-package.sh 스크립트를 실행하세요.

    ./2-package.sh

    이 스크립트는 계층 콘텐츠를 적절하게 패키징하는 데 필요한 java/lib 디렉터리 구조를 생성합니다. 그런 다음 /target 디렉터리의 uber-jar를 새로 생성한 java/lib 디렉터리로 복사합니다. 마지막으로 스크립트는 java 디렉터리의 내용을 layer_content.zip이라는 파일로 압축합니다. 이는 계층의 .zip 파일입니다. Java 런타임의 계층 경로 섹션에 표시된 것처럼 파일의 압축을 풀고 올바른 파일 구조가 포함되어 있는지 확인할 수 있습니다.

    예 2-package.sh
    mkdir java mkdir java/lib cp -r target/layer-java-layer-1.0-SNAPSHOT.jar java/lib/ zip -r layer_content.zip java

계층의 생성

이 섹션에서는 이전 섹션에서 생성한 layer_content.zip 파일을 가져와 Lambda 계층으로 업로드합니다. AWS Command Line Interface(AWS CLI)를 통해 AWS Management Console 또는 Lambda API를 사용하여 계층을 업로드할 수 있습니다. 계층 .zip 파일을 업로드할 때 다음 PublishLayerVersion AWS CLI 명령에서 java21을 호환 런타임으로, arm64를 호환 아키텍처로 지정합니다.

aws lambda publish-layer-version --layer-name java-jackson-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes java21 \ --compatible-architectures "arm64"

응답에서 arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1처럼 보이는 LayerVersionArn에 유의하세요. 이 자습서의 다음 단계인 함수에 계층을 추가할 때 이 Amazon 리소스 이름(ARN)이 필요합니다.

함수에 계층 추가

이 섹션에서는 함수 코드에 Jackson 라이브러리를 사용하는 샘플 Lambda 함수를 배포한 다음 계층을 연결합니다. 함수를 배포하려면 실행 역할로 Lambda 함수 권한 정의이 필요합니다. 기존 실행 역할이 없으면 접을 수 있는 섹션의 단계를 따르세요.

실행 역할을 만들려면
  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. 역할 생성을 선택합니다.

  3. 다음 속성을 사용하여 역할을 만듭니다.

    • 신뢰할 수 있는 엔터티Lambda.

    • 권한AWSLambdaBasicExecutionRole.

    • 역할 이름lambda-role.

    AWSLambdaBasicExecutionRole 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.

Lambda 함수 코드Map<String, String>을 입력으로 받고 Jackson을 사용하여 입력을 JSON 문자열로 작성한 후 사전 정의된 F1Car 객체로 변환합니다. 마지막으로 함수는 F1Car 객체의 필드를 사용하여 함수가 반환하는 문자열을 구성합니다.

package example; import com.amazonaws.services.lambda.runtime.Context; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.Map; public class Handler { public String handleRequest(Map<String, String> input, Context context) throws IOException { // Parse the input JSON ObjectMapper objectMapper = new ObjectMapper(); F1Car f1Car = objectMapper.readValue(objectMapper.writeValueAsString(input), F1Car.class); StringBuilder finalString = new StringBuilder(); finalString.append(f1Car.getDriver()); finalString.append(" is a driver for team "); finalString.append(f1Car.getTeam()); return finalString.toString(); } }
Lambda 함수를 배포하려면 다음을 수행합니다.
  1. function/ 디렉터리로 이동합니다. 현재 layer/ 디렉터리에 있는 경우 다음 명령을 실행하세요.

    cd ../function
  2. 다음 Maven 명령을 사용하여 프로젝트를 빌드합니다.

    mvn package

    이 명령은 target/ 디렉터리에 layer-java-function-1.0-SNAPSHOT.jar라는 이름의 JAR 파일을 생성합니다.

  3. 함수를 배포합니다. 다음 AWS CLI 명령에서 --role 파라미터를 실행 역할 ARN으로 바꿉니다.

    aws lambda create-function --function-name java_function_with_layer \ --runtime java21 \ --architectures "arm64" \ --handler example.Handler::handleRequest \ --timeout 30 \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://target/layer-java-function-1.0-SNAPSHOT.jar
  4. 그런 다음 계층을 함수에 연결합니다. 다음 AWS CLI 명령에서 --layers 파라미터를 이전에 기록해 둔 계층 버전 ARN으로 바꿉니다.

    aws lambda update-function-configuration --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:java-jackson-layer:1"
  5. 마지막으로 다음 AWS CLI 명령을 사용하여 함수를 간접 호출합니다.

    aws lambda invoke --function-name java_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "driver": "Max Verstappen", "team": "Red Bull" }' response.json

    다음과 유사한 출력 화면이 표시되어야 합니다.

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    이는 함수가 Jackson 종속성을 사용하여 함수를 올바르게 실행할 수 있었음을 나타냅니다. 출력 response.json 파일이 올바른 반환된 문자열을 포함하는지 확인할 수 있습니다.

    "Max Verstappen is a driver for team Red Bull"

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

Lambda 계층을 삭제하려면 다음을 수행합니다.
  1. Lambda 콘솔의 계층 페이지를 엽니다.

  2. 생성한 계층을 선택합니다.

  3. 삭제를 선택한 다음 삭제를 다시 선택합니다.

Lambda 함수를 삭제하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 생성한 함수를 선택합니다.

  3. 작업, 삭제를 선택합니다.

  4. 텍스트 입력 필드에 confirm를 입력하고 Delete(삭제)를 선택합니다.