Java Lambda 함수를 위한 계층 작업
Lambda 계층은 추가 코드 또는 데이터를 포함하는 .zip 파일 아카이브입니다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.
-
계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.
-
Lambda에서 계층을 생성합니다.
-
계층을 함수에 추가합니다.
이 주제에는 외부 라이브러리 종속성이 있는 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
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 작업에 널리 사용되는 데이터 처리 도구 모음입니다.
다음 단계를 완료하여 계층 콘텐츠를 설치하고 패키징합니다.
계층 콘텐츠를 설치하고 패키징하려면 다음을 수행합니다.
-
sample-apps/layer-java
디렉터리에 필요한 샘플 코드가 포함된aws-lambda-developer-guide
GitHub 리포지토리를 복제합니다. git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
-
layer-java
샘플 앱의layer
디렉터리로 이동합니다. 이 디렉터리에는 계층을 올바르게 생성하고 패키징하는 데 사용하는 스크립트가 포함되어 있습니다.cd aws-lambda-developer-guide/sample-apps/layer-java/layer
-
pom.xml
파일을 검사합니다. 이 <dependencies>
섹션에서는 계층에 포함할 종속성, 즉aws-lambda-java-core
및jackson-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로 패키징합니다. -
두 스크립트를 모두 실행할 수 있는 권한이 있는지 확인하세요.
chmod 744 1-install.sh && chmod 744 2-package.sh
-
다음 명령을 사용하여
1-install.sh
스크립트를 실행하세요. ./1-install.sh
이 스크립트는 현재 디렉터리에서
mvn clean install
을 실행합니다. 그러면target/
디렉터리에 필요한 모든 종속성이 포함된 uber-jar가 생성됩니다.예 1-install.sh
mvn clean install
-
다음 명령을 사용하여
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:1LayerVersionArn
에 유의하세요. 이 자습서의 다음 단계인 함수에 계층을 추가할 때 이 Amazon 리소스 이름(ARN)이 필요합니다.
함수에 계층 추가
이 섹션에서는 함수 코드에 Jackson 라이브러리를 사용하는 샘플 Lambda 함수를 배포한 다음 계층을 연결합니다. 함수를 배포하려면 실행 역할로 Lambda 함수 권한 정의이 필요합니다. 기존 실행 역할이 없으면 접을 수 있는 섹션의 단계를 따르세요.
실행 역할을 만들려면
-
IAM 콘솔에서 역할 페이지
를 엽니다. -
역할 생성을 선택합니다.
-
다음 속성을 사용하여 역할을 만듭니다.
-
신뢰할 수 있는 엔터티 – Lambda.
-
권한 – AWSLambdaBasicExecutionRole.
-
역할 이름 –
lambda-role
.
AWSLambdaBasicExecutionRole 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.
-
Lambda 함수 코드Map<String, String>
을 입력으로 받고 Jackson을 사용하여 입력을 JSON 문자열로 작성한 후 사전 정의된 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 함수를 배포하려면 다음을 수행합니다.
-
function/
디렉터리로 이동합니다. 현재layer/
디렉터리에 있는 경우 다음 명령을 실행하세요.cd ../function
-
다음 Maven 명령을 사용하여 프로젝트를 빌드합니다.
mvn package
이 명령은
target/
디렉터리에layer-java-function-1.0-SNAPSHOT.jar
라는 이름의 JAR 파일을 생성합니다. -
함수를 배포합니다. 다음 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 -
그런 다음 계층을 함수에 연결합니다. 다음 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
" -
마지막으로 다음 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 계층을 삭제하려면 다음을 수행합니다.
-
Lambda 콘솔의 계층 페이지
를 엽니다. -
생성한 계층을 선택합니다.
-
삭제를 선택한 다음 삭제를 다시 선택합니다.
Lambda 함수를 삭제하려면
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
생성한 함수를 선택합니다.
-
작업, 삭제를 선택합니다.
-
텍스트 입력 필드에
confirm
를 입력하고 Delete(삭제)를 선택합니다.