.zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포 - AWS Lambda

.zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포

AWS Lambda 함수의 코드는 스크립트 또는 컴파일된 프로그램과 해당 종속 항목으로 구성됩니다. 배포 패키지를 사용하여 Lambda 함수 코드를 배포합니다. Lambda는 두 가지 유형의 배포 패키지(컨테이너 이미지 및 .zip 파일 아카이브)를 지원합니다.

이 페이지에서는 배포 패키지를 .zip 파일 또는 Jar 파일로 생성한 후 해당 배포 패키지를 사용하여 AWS Command Line Interface(AWS CLI)을(를) 사용하는 AWS Lambda에 함수 코드를 배포하는 방법을 설명합니다.

사전 조건

AWS CLI은(는) 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 섹션의 단계를 완료하려면 다음이 필요합니다.

도구 및 라이브러리

Lambda는 Java 함수를 위한 다음 라이브러리를 제공합니다.

이 라이브러리는 Maven Central Repository를 통해 사용할 수 있습니다. 다음과 같이 빌드 정의에 이러한 라이브러리를 추가하세요.

Gradle
dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' implementation 'com.amazonaws:aws-lambda-java-events:3.1.0' runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0' }
Maven
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.2.0</version> </dependency> </dependencies>

배포 패키지를 만들려면 함수 코드와 종속 항목을 단일 .zip 파일 또는 Java 아카이브(JAR) 파일로 컴파일합니다. Gradle의 경우 Zip 빌드 유형을 사용합니다. Apache Maven의 경우 Maven Shade 플러그인을 사용합니다.

참고

배포 패키지 크기를 작게 유지하려면 함수의 계층별 종속성을 패키지화하십시오. 계층을 사용하면 독립적으로 종속 항목을 관리하고, 여러 함수에서 사용할 수 있으며 다른 계정과 공유할 수 있습니다. 자세한 내용은 Lambda 계층 만들기 및 공유 단원을 참조하십시오.

Lambda 콘솔, Lambda API 또는 AWS Serverless Application Model(AWS SAM)을 사용하여 배포 패키지를 업로드할 수 있습니다.

Lambda 콘솔을 사용하여 배포 패키지를 업로드하려면

  1. Lambda 콘솔에서 함수 페이지(Functions page)를 엽니다.

  2. 함수를 선택합니다.

  3. 코드 소스(Code source)에서 업로드(Upload from)를 선택합니다.

  4. 배포 패키지를 업로드합니다.

  5. 저장을 선택합니다.

Gradle을 사용하여 배포 패키지 빌드

함수의 코드와 종속 항목이 포함된 배포 패키지를 생성하려면 Zip 빌드 유형을 사용합니다.

예 build.gradle – 빌드 작업

task buildZip(type: Zip) { from compileJava from processResources into('lib') { from configurations.runtimeClasspath } }

이 빌드 구성은 build/distributions 디렉터리에 배포 패키지를 생성합니다. compileJava 작업은 함수의 클래스를 컴파일하며, 이 processResources 작업은 Java 프로젝트 리소스를 대상 디렉터리에 복사하고 잠재적으로 처리할 수 있습니다. 그런 다음 into('lib') 명령이 빌드의 클래스 경로에서 lib라는 폴더로 종속성 라이브러리를 복사합니다.

예 build.gradle – 종속성

dependencies { implementation platform('software.amazon.awssdk:bom:2.10.73') implementation 'software.amazon.awssdk:lambda' implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' implementation 'com.amazonaws:aws-lambda-java-events:3.1.0' implementation 'com.google.code.gson:gson:2.8.6' implementation 'org.apache.logging.log4j:log4j-api:2.13.0' implementation 'org.apache.logging.log4j:log4j-core:2.13.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.13.0' runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0' }

Lambda는 JAR 파일을 유니코드 알파벳순으로 로드합니다. lib 디렉터리의 여러 JAR 파일에 동일한 클래스가 있을 경우 첫 번째 클래스가 사용됩니다. 다음 셸 스크립트를 사용하여 중복 클래스를 식별할 수 있습니다.

예 test-zip.sh

mkdir -p expanded unzip path/to/my/function.zip -d expanded find ./expanded/lib -name '*.jar' | xargs -n1 zipinfo -1 | grep '.*.class' | sort | uniq -c | sort

Maven을 사용하여 배포 패키지 빌드

Maven을 사용하여 배포 패키지를 빌드하려면 Maven Shade 플러그인을 사용합니다. 이 플러그인은 컴파일된 함수 코드와 모든 종속 항목이 포함된 JAR 파일을 생성합니다.

예 pom.xml – 플러그인 구성

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>

배포 패키지를 빌드하려면 mvn package 명령을 사용합니다.

[INFO] Scanning for projects... [INFO] -----------------------< com.example:java-maven >----------------------- [INFO] Building java-maven-function 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-maven --- [INFO] Building jar: target/java-maven-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-shade-plugin:3.2.2:shade (default) @ java-maven --- [INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.2.1 in the shaded jar. [INFO] Including com.amazonaws:aws-lambda-java-events:jar:3.1.0 in the shaded jar. [INFO] Including joda-time:joda-time:jar:2.6 in the shaded jar. [INFO] Including com.google.code.gson:gson:jar:2.8.6 in the shaded jar. [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing target/java-maven-1.0-SNAPSHOT.jar with target/java-maven-1.0-SNAPSHOT-shaded.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.321 s [INFO] Finished at: 2020-03-03T09:07:19Z [INFO] ------------------------------------------------------------------------

이 명령은 target 디렉터리에 JAR 파일을 생성합니다.

appender 라이브러리(aws-lambda-java-log4j2)를 사용하는 경우 Maven Shade 플러그인에 대한 변환기도 구성해야 합니다. 변환기 라이브러리는 appender 라이브러리와 Log4j에 모두 나타나는 캐시 파일 버전을 결합합니다.

예 pom.xml – Log4j 2 appender를 사용하여 플러그인 구성

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer"> </transformer> </transformers> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.github.edwgiz</groupId> <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId> <version>2.13.0</version> </dependency> </dependencies> </plugin>

Lambda API를 사용하여 배포 패키지 업로드

AWS Command Line Interface(AWS CLI) 또는 AWS SDK로 함수 코드를 업데이트하려면 UpdateFunctionCode API 작업을 사용합니다. AWS CLI에서 update-function-code 명령을 사용합니다. 다음 명령은 현재 디렉터리에 my-function.zip이라는 배포 패키지를 업로드합니다.

aws lambda update-function-code --function-name my-function --zip-file fileb://my-function.zip

다음 결과가 표시됩니다:

{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "java8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "example.Handler", "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d", ... }

배포 패키지가 50 MB보다 크면 직접 업로드할 수 없습니다. 이 경우 Amazon Simple Storage Service(Amazon S3) 버킷에 업로드하고 Lambda에서 이 객체를 가리킵니다. 다음 예제 명령은 배포 패키지를 my-bucket라는 S3 버킷에 업로드하고 이 버킷을 사용하여 함수의 코드를 업데이트합니다.

aws s3 cp my-function.zip s3://my-bucket

다음 결과가 표시됩니다:

upload: my-function.zip to s3://my-bucket/my-function
aws lambda update-function-code --function-name my-function \ --s3-bucket my-bucket --s3-key my-function.zip

다음 결과가 표시됩니다:

{ "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "java8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "example.Handler", "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d", ... }

이 방법을 통해 함수 패키지를 최대 250 MB(압축 해제)까지 업로드할 수 있습니다.

AWS SAM을 사용하여 배포 패키지 업로드

AWS SAM을 사용하여 함수 코드, 구성 및 종속 항목의 배포를 자동화할 수 있습니다. AWS SAM은 서버리스 애플리케이션을 정의하기 위한 단순화된 구문을 제공하는 AWS CloudFormation의 익스텐션입니다. 다음 예제 템플릿은 Gradle이 사용하는 build/distributions 디렉터리의 배포 패키지로 함수를 정의합니다.

예 template.yml

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: build/distributions/java-basic.zip Handler: example.Handler Runtime: java8 Description: Java function MemorySize: 512 Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess - AWSLambdaVPCAccessExecutionRole Tracing: Active

함수를 만들려면 packagedeploy 명령을 사용합니다. 이러한 명령은 AWS CLI에 대한 사용자 지정 명령으로, 다른 명령을 래핑하여 배포 패키지를 Amazon S3에 업로드하고 객체 URI로 템플릿을 다시 작성하며 함수의 코드를 업데이트합니다.

다음 예제 스크립트는 Gradle 빌드를 실행하고 생성된 배포 패키지를 업로드합니다. 이 스크립트를 처음 실행하면 AWS CloudFormation 스택이 생성되며, 스택이 이미 있으면 스크립트를 통해 스택이 업데이트됩니다.

예 deploy.sh

#!/bin/bash set -eo pipefail aws cloudformation package --template-file template.yml --s3-bucket MY_BUCKET --output-template-file out.yml aws cloudformation deploy --template-file out.yml --stack-name java-basic --capabilities CAPABILITY_NAMED_IAM

전체 예제를 보려면 다음 샘플 애플리케이션을 참조하세요.

Java의 샘플 Lambda 애플리케이션

  • blank-java – Lambda의 Java 라이브러리, 로깅, 환경 변수, 계층, AWS X-Ray 추적, 단위 테스트 및 AWS SDK를 사용하는 방법을 보여주는 Java 함수입니다.

  • java-basic – 단위 테스트 및 변수 로깅 구성을 사용하는 최소한의 Java 함수입니다.

  • java-events – AWS SDK를 Amazon API Gateway 같은 종속성으로 요구하지 않는 이벤트 유형과 함께 aws-lambda-java-events 라이브러리를 사용하는 최소한의 Java 함수입니다.

  • java-events-v1sdk – 종속성(예: Amazon Simple Storage Service(Amazon S3), Amazon DynamoDB 및 Amazon Kinesis)으로 AWS SDK를 요구하는 이벤트 유형과 함께 aws-lambda-java-events 라이브러리를 사용하는 Java 함수입니다.

  • s3-java – Amazon S3의 알림 이벤트를 처리하고 JCL(Java Class Library)을 사용하여 업로드된 이미지 파일의 썸네일을 생성하는 Java 함수입니다.