반응형
1.요구사항
AWS Lambda 에 Java 소스를 올려 AWS CloudWatch logs 에 로그를 출력하기
- AWS regions : 도쿄
- 東京 (ap-northeast-1)
- AWS Lambda 를 생성한다.
- Eclipse 에 Lambda 에 올릴 프로젝트를 생성한다.
- pure java 프로젝트
- AWS SDK for java 를 이용
- 이클립스에 AWS Toolkit 을 설치후 툴킷을 이용하여 생성하면 편하다.
- 로그를 출력하는 간단한 코드를 작성한다.
- log4j 이용
- 【출력예】 [INFO] [2022-05-09 17:55:24,298 12474] Hello Lambda!!
2. AWS Lambda 생성
학습용으로 이름은 임의로 lambda-study 로 작성하고 java 소스를 올릴 것이기 때문에 java 8 을 선택하고 생성한다.
- 이름 : lambda-study
- 런타임 : Java 8 on Amazon Linux 2
3. Eclipse 에서 Lambda 프로젝트 생성하기
이클립스에 AWS Toolkit 을 설치하면 프로젝트 생성이 수월하다. 툴킷으로 생성하면 람다의 시작포인트인 RequestHandler 가 생성되기 때문에 편리하다. 이를 작성할 줄 안다면 굳이 툴킷을 설치하지 않아도 무방하다.
4. pom.xml 파일에 log4j2 를 정의한다.
Maven 프로젝트를 이용하며, pom.xml 파일 의존관계(dependency)에 log4j2 를 정의한다.
<dependencies>
<!-- log4j -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-log4j2</artifactId>
<version>1.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.2</version>
</dependency>
</dependencies>
5. 로그 출력 소스를 작성한다.
(1) log4j2.xml 파일 작성
- 【참고1】 : https://docs.aws.amazon.com/ko_kr/sdk-for-java/latest/developer-guide/logging-slf4j.html
- log4j 는 버전2를 사용하도록 한다.
- 【참고2 log4j 취약성】 : https://aws.amazon.com/ko/security/security-bulletins/AWS-2021-006/
- 【참고3】 : https://github.com/aws/aws-lambda-java-libs/tree/master/aws-lambda-java-log4j2
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" packages="com.amazonaws.services.lambda.runtime.log4j2">
<Appenders>
<Lambda name="Lambda">
<PatternLayout>
<pattern>[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] %X{AWSRequestId} %c{1} - %m%n</pattern>
</PatternLayout>
</Lambda>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Lambda"/>
</Root>
<Logger name="software.amazon.awssdk" level="WARN" />
<Logger name="software.amazon.awssdk.request" level="DEBUG" />
</Loggers>
</Configuration>
- 【참고4 log4j2의 Pattern Layout】 : https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
(2) 핸들러에 로그 출력을 위한 간단한 Logger 소스 작성
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class LambdaFunctionHandler implements RequestHandler<Object, String> {
@Override
public String handleRequest(Object input, Context context) {
final Logger logger = LogManager.getLogger(LambdaFunctionHandler.class);
logger.info("hello lambda!!");
return "OK!!";
}
}
6. Maven install 하여 jar 파일 생성 후, Lambda 에 소스코드 업로드
메이븐 인스톨하여 생성된 jar 파일을 [2. AWS Lambda 생성]에서 작성한 람다에 업로드 한다.
7. AWS Lambda 의 Handler 를 수정해준다.
업로드한 jar 파일의 핸들러 패키지명을 확인하고 람다의 설정에서 핸들러란을 수정해준다.
- 핸들러(Handler) 의 패키지명을 확인하고 수정해준다
- study.lambda.LambdaFunctionHandler::handleRequest
저장후 설정 내용 확인
8. AWS Lambda 를 테스트 실행하여 로그 출력결과 확인
- 실행결과의 “OK!!”는 handler의 return에 해당하는 글자가 표시된다,
9. CloudWatch 출력 확인
- INFO 로그로 출력을 시도한 "hello lambda!!" 가 출력된 것을 확인할 수 있다.
- logger.info("hello lambda!!");
- 참고 사항
- 타임스탬프에 출력된 시간 (AWS region 시간) : 2022-05-15T16:38:12.456+09:00
- 메시지에 출력된 시간 (UTC) : 2022-05-15 07:38:12
- ⇒ 타임스탬프의 시간이 region의 실행시간이고, 메시지의 시간은 UTC이다.
- 따라서, 메시지의 시간도 타임스탬프와 동일한 시간으로 출력하기위해서는 추가로 설정이 필요하다.
현재시간(現在時間) 출력을 확인해보면 시간이 동일하다. 이와같이 TimeZone 을 설정하여 동일하게 출력하면 된다.
반응형