[java] AWS Lambda 를 이용하여 CloudWatch logs 출력해보기

반응형

 

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 가 생성되기 때문에 편리하다. 이를 작성할 줄 안다면 굳이 툴킷을 설치하지 않아도 무방하다.

Lambda 프로젝트 생성하기
툴킷을 이용하면 람다의 시작포인트 (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 파일 작성

<?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>

 

(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을 설정하여 시간을 동일하게 출력할 수 있다.

현재시간(現在時間) 출력을 확인해보면 시간이 동일하다. 이와같이 TimeZone 을 설정하여 동일하게 출력하면 된다.

반응형