.zip 또는 JAR 파일 아카이브를 사용하여 Java Lambda 함수 배포
AWS Lambda 함수의 코드는 스크립트 또는 컴파일된 프로그램과 해당 종속 항목으로 구성됩니다. 함수 코드는 배포 패키지를 사용하여 Lambda에 배포합니다. Lambda는 컨테이너 이미지 및 .zip 파일 아카이브의 두 가지 배포 패키지를 지원합니다.
이 페이지에서는 배포 패키지를 .zip 파일 또는 Jar 파일로 생성한 후 해당 배포 패키지를 사용하여 AWS Lambda(AWS Command Line Interface)을(를) 사용하는 AWS CLI에 함수 코드를 배포하는 방법을 설명합니다.
Sections
사전 조건
AWS CLI은(는) 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 섹션의 단계를 완료하려면 AWS CLI 버전 2가 필요합니다.
도구 및 라이브러리
Lambda는 Java 함수를 위한 다음 라이브러리를 제공합니다.
-
com.amazonaws:aws-lambda-java-core
(필수) – 핸들러 메서드 인터페이스와 런타임이 핸들러에 전달하는 컨텍스트 객체를 정의합니다. 고유한 입력 유형을 정의하는 경우 이 라이브러리만 필요합니다. -
com.amazonaws:aws-lambda-java-events
– Lambda 함수를 호출하는 서비스의 이벤트 입력 유형입니다. -
com.amazonaws:aws-lambda-java-log4j2
– 현재 호출의 요청 ID를 함수 로그에 추가하는 데 사용할 수 있는 Apache Log4j 2용 appender 라이브러리입니다. -
AWS SDK for Java 2.0
: Java 프로그래밍 언어용 공식 AWS SDK입니다.
이 라이브러리는 Maven Central Repository
배포 패키지를 만들려면 함수 코드와 종속 항목을 단일 .zip 파일 또는 Java 아카이브(JAR) 파일로 컴파일합니다. Gradle의 경우 Zip 빌드 유형을 사용합니다. Apache Maven의 경우 Maven Shade 플러그인을 사용합니다. 배포 패키지를 업로드하려면 Lambda 콘솔, Lambda API 또는 AWS Serverless Application Model(AWS SAM)을 사용합니다.
참고
배포 패키지 크기를 작게 유지하려면 함수의 계층별 종속성을 패키지화하세요. 계층을 사용하면 독립적으로 종속성을 관리하고, 여러 함수에서 사용할 수 있으며 다른 계정과 공유할 수 있습니다. 자세한 내용은 계층으로 Lambda 종속성 관리 단원을 참조하십시오.
Gradle을 사용하여 배포 패키지 빌드
Gradle에서 함수의 코드와 종속 구성 요소를 사용하여 배포 패키지를 생성하려면 Zip
빌드 유형을 사용합니다. 다음은 전체 샘플 build.gradle 파일
예 build.gradle – 빌드 작업
task buildZip(type: Zip) { into('lib') { from(jar) from(configurations.runtimeClasspath) } }
이 빌드 구성은 build/distributions
디렉터리에 배포 패키지를 생성합니다. into('lib')
문 내에서 jar
작업은 기본 클래스를 포함하는 jar 아카이브를 lib
라는 폴더에 어셈블합니다. 또한 configurations.runtimeClassPath
작업은 빌드의 클래스 경로에서 동일한 lib
폴더로 종속 항목 라이브러리를 복사합니다.
예 build.gradle – 종속성
dependencies { ...
implementation 'com.amazonaws:aws-lambda-java-core:1.2.2' implementation 'com.amazonaws:aws-lambda-java-events:3.11.1'
implementation 'org.apache.logging.log4j:log4j-api:2.17.1' implementation 'org.apache.logging.log4j:log4j-core:2.17.1' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.17.1'runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.5.1'
... }
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
종속 항목을 위한 Java 계층 생성
참고
계층을 Java와 같은 컴파일된 언어의 함수와 함께 사용하면 Python과 같은 해석된 언어의 함수와 함께 사용할 때와 같은 이점을 얻지 못할 수 있습니다. Java는 컴파일된 언어이므로 함수가 초기화 단계에서 수동으로 공유 어셈블리를 메모리로 로드해야 하기 때문에 콜드 시간 시간이 늘어날 수 있습니다. 대신 컴파일 시간에 모든 공유 코드를 포함하여 기본 제공 최적화를 활용하는 것이 좋습니다.
이 섹션의 지침은 계층에 종속 항목을 포함하는 방법을 보여줍니다. 배포 패키지에 종속 항목을 포함하는 방법에 대한 지침은 Gradle을 사용하여 배포 패키지 빌드 또는 Maven을 사용하여 배포 패키지 빌드 섹션을 참조하세요.
함수에 계층을 추가하면 Lambda는 계층 콘텐츠를 해당 실행 환경의 /opt
디렉터리로 추출합니다. 각 Lambda 런타임에 대해 PATH
변수에는 /opt
디렉터리 내의 특정 폴더 경로가 이미 포함되어 있습니다. PATH
변수가 계층 콘텐츠를 가져오도록 하려면 계층 .zip 파일의 종속성이 다음 폴더 경로에 있어야 합니다.
-
java/lib
(CLASSPATH
)
예를 들어, 계층.zip 파일 구조는 다음과 같을 수 있습니다.
jackson.zip └ java/lib/jackson-core-2.2.3.jar
또한 Lambda는 /opt/lib
디렉터리의 모든 라이브러리와 /opt/bin
디렉터리의 모든 바이너리를 자동으로 감지합니다. Lambda가 계층 콘텐츠를 제대로 찾을 수 있도록 다음 구조로 계층을 생성할 수도 있습니다.
custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2
계층을 패키징한 후 Lambda에서 계층 생성 및 삭제 및 함수에 계층 추가을 참조하여 계층 설정을 완료합니다.
Maven을 사용하여 배포 패키지 빌드
Maven을 사용하여 배포 패키지를 빌드하려면 Maven Shade 플러그인
예 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.2 in the shaded jar. [INFO] Including com.amazonaws:aws-lambda-java-events:jar:3.11.1 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 파일을 생성합니다.
참고
다중 릴리스 JAR(MRJAR)lib
디렉터리에 MRJAR(즉, Maven Shade 플러그인에서 생성된 음영 처리된 JAR)을 포함하고 압축해야 합니다. 그렇지 않으면 Lambda가 JAR 파일의 압축을 제대로 풀지 못해 MANIFEST.MF
파일이 무시될 수 있습니다.
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 콘솔을 사용하여 배포 패키지 업로드
새 함수를 생성하려면 먼저 콘솔에서 함수를 생성한 다음.zip 또는 JAR 파일을 업로드해야 합니다. 기존 함수를 업데이트하려면 함수에 대한 페이지를 연 다음 동일한 절차에 따라 업데이트된 .zip 또는 JAR 파일을 추가합니다.
배포 패키지 파일이 50MB 미만인 경우 로컬 컴퓨터에서 직접 파일을 업로드하여 함수를 생성하거나 업데이트할 수 있습니다. 50MB보다 큰 .zip 또는 JAR 파일의 경우 먼저 패키지를 Amazon S3 버킷에 업로드해야 합니다. AWS Management Console을 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 Amazon S3 시작하기를 참조하세요. AWS CLI를 사용하여 파일을 업로드하려면 AWS CLI 사용 설명서의 객체 이동을 참조하세요.
참고
기존 함수의 배포 패키지 유형(.zip 또는 컨테이너 이미지)은 변경할 수 없습니다. 예를 들어 .zip 파일 아카이브를 사용하도록 컨테이너 이미지 함수를 변환할 수는 없습니다. 새로운 함수를 생성해야 합니다.
새 함수 생성(콘솔)
-
Lambda 콘솔의 함수 페이지
를 열고 함수 생성을 선택합니다. -
새로 작성을 선택합니다.
-
기본 정보에서 다음과 같이 합니다.
-
함수 이름에 함수 이름을 입력합니다.
-
런타임에서 사용할 런타임을 선택합니다.
-
(선택 사항) 아키텍처에서 함수에 대한 명령 세트 아키텍처를 선택합니다. 기본 아키텍처는 x86_64입니다. 함수에 대한 .zip 배포 패키지가 선택한 명령 세트 아키텍처와 호환되는지 확인합니다.
-
-
(선택 사항) 권한(Permissions)에서 기본 실행 역할 변경(Change default execution role)을 확장합니다. 새로운 실행 역할을 생성하거나 기존 실행 역할을 사용할 수 있습니다.
-
함수 생성(Create function)을 선택합니다. Lambda에서 선택한 런타임을 사용하여 기본 'Hello World' 함수를 생성합니다.
로컬 시스템에서 .zip 또는 JAR 아카이브 업로드(콘솔)
-
Lambda 콘솔의 함수 페이지
에서.zip 또는 JAR 파일을 업로드할 함수를 선택합니다. -
코드 탭을 선택합니다.
-
코드 소스 창에서 에서 업로드를 선택합니다.
-
.zip 또는.jar 파일을 선택합니다.
-
.zip 또는 JAR 파일을 업로드하려면 다음을 수행합니다.
-
업로드를 선택한 다음 파일 선택기에서.zip 또는 JAR 파일을 선택합니다.
-
Open을 선택합니다.
-
Save(저장)를 선택합니다.
-
Amazon S3 버킷에서.zip 또는 JAR 아카이브 업로드(콘솔)
-
Lambda 콘솔의 함수 페이지
에서 새 .zip 또는 JAR 파일을 업로드할 함수를 선택합니다. -
코드 탭을 선택합니다.
-
코드 소스 창에서 에서 업로드를 선택합니다.
-
Amazon S3 위치를 선택합니다.
-
.zip 파일의 Amazon S3 링크 URL을 붙여 넣고 저장을 선택합니다.
AWS CLI를 사용하여 배포 패키지 업로드
AWS CLI를 사용하여 새 함수를 생성하거나.zip 또는 JAR 파일로 기존 함수를 업데이트할 수 있습니다. create-function 및 update-function-code 명령을 사용하여 .zip 또는 JAR 패키지를 배포합니다. 파일이 50MB보다 작은 경우 로컬 빌드 시스템의 파일 위치에서 패키지를 업로드할 수 있습니다. 더 큰 파일의 경우 Amazon S3 버킷에서 .zip 또는 JAR 패키지를 업로드해야 합니다. AWS CLI를 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 AWS CLI 사용 설명서의 객체 이동을 참조하세요.
참고
AWS CLI를 사용하여 Amazon S3 버킷에서 .zip 또는 JAR 파일을 업로드하는 경우 버킷은 함수와 동일한 AWS 리전에 있어야 합니다.
AWS CLI에서 .zip 또는 JAR 파일을 사용하여 새 함수를 생성하려면 다음을 지정해야 합니다.
-
함수의 이름(
--function-name
) -
함수의 런타임(
--runtime
) -
함수의 실행 역할(
--role
)의 Amazon 리소스 이름(ARN) -
함수 코드에 있는 핸들러 메서드의 이름(
--handler
)
.zip 또는 JAR 파일의 위치도 지정해야 합니다. .zip 또는 JAR 파일이 로컬 빌드 시스템의 폴더에 있는 경우 다음 예제 명령과 같이 --zip-file
옵션을 사용하여 파일 경로를 지정합니다.
aws lambda create-function --function-name myFunction \ --runtime java21 --handler example.handler \ --role arn:aws:iam::123456789012:role/service-role/my-lambda-role \ --zip-file fileb://myFunction.zip
Amazon S3 버킷에서 .zip 파일의 위치를 지정하려면 다음 예제 명령과 같이 --code
옵션을 사용합니다. 버전이 지정된 객체에만 S3ObjectVersion
파라미터를 사용해야 합니다.
aws lambda create-function --function-name myFunction \ --runtime java21 --handler example.handler \ --role arn:aws:iam::123456789012:role/service-role/my-lambda-role \ --code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
CLI를 사용하여 기존 함수를 업데이트하려면 --function-name
파라미터를 사용하여 함수 이름을 지정합니다. 함수 코드를 업데이트하는 데 사용할.zip 파일의 위치도 지정해야 합니다. .zip 파일이 로컬 빌드 시스템의 폴더에 있는 경우 다음 예제 명령과 같이 --zip-file
옵션을 사용하여 파일 경로를 지정합니다.
aws lambda update-function-code --function-name myFunction \ --zip-file fileb://myFunction.zip
Amazon S3 버킷에서 .zip 파일의 위치를 지정하려면 다음 예제 명령과 같이 --s3-bucket
및 --s3-key
옵션을 사용합니다. 버전이 지정된 객체에만 --s3-object-version
파라미터를 사용해야 합니다.
aws lambda update-function-code --function-name myFunction \ --s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
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: java21 Description: Java function MemorySize: 512 Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambda_ReadOnlyAccess - AWSXrayWriteOnlyAccess - AWSLambdaVPCAccessExecutionRole Tracing: Active
함수를 만들려면 package
및 deploy
명령을 사용합니다. 이러한 명령은 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 애플리케이션
-
java17-examples
– Java 레코드를 사용하여 입력 이벤트 데이터 객체를 나타내는 방법을 보여주는 Java 함수입니다. -
java-basic
– 단위 테스트 및 변수 로깅 구성을 사용하는 최소한의 Java 함수 모음입니다. -
java
- Amazon API Gateway, Amazon SQS 및 Amazon Kinesis와 같은 다양한 서비스의 이벤트를 처리하는 방법에 대한 스켈레톤 코드가 포함된 Java 함수 모음입니다. 이러한 함수는 최신 버전의 aws-lambda-java-events 라이브러리(3.0.0 이상)를 사용합니다. 이러한 예는 AWS SDK를 종속 항목으로 요구하지 않습니다. -
s3-java
– Amazon S3의 알림 이벤트를 처리하고 JCL(Java Class Library)을 사용하여 업로드된 이미지 파일의 썸네일을 생성하는 Java 함수입니다. -
사용자 지정 직렬화
- fastJson, Gson, Moshi, jackson-jr 등 널리 사용되는 라이브러리를 사용하여 사용자 지정 직렬화를 구현하는 방법에 대한 예제입니다. -
API Gateway를 사용하여 Lambda 함수 호출 — 직원 정보가 포함된 Amazon DynamoDB 테이블을 스캔하는 Java 함수입니다. 이후 Amazon 간편 알림 서비스를 사용하여 직원들에게 근무 기념일을 축하하는 문자 메시지를 보냅니다. 이 예제에서는 API Gateway를 사용하여 함수를 호출합니다.