티스토리 뷰

1. Lambda 함수 생성
2. JAVA 패키지 빌드
3. 배포 패키지 업로드 및 핸들러 메서드 정의
4. 테스트 이벤트 생성 및 테스트

1. Lambda 함수 생성

Function name을 작성, Runtime에 Java를 선택, Permissions에 적절한 role을 선택해 줍니다.


2. JAVA 패키지 빌드

blank-java 코드를 다운 받습니다.

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'
}

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

해당 코드에는 Lambda에서 Java를 수행하기 위해서 필수로 필요한 java-core 라이브러리가 

 

그리고 이벤트와 로그 기록을 위한 java-events, log4j2 라이브러리 등이 추가 되어 있습니다.

 

build.gradle 파일에 단일 zip 파일로 컴파일 해주는 buildZip task를 추가해줍니다.

 

➜  blank-java git:(main) ✗ ls build/distributions
blank-java.zip

buildZip task로 빌드를 합니다.


3. 배포 패키지 업로드 및 핸들러 메서드 정의

 

콘솔에 Function code > Actions > Upload a .zip or .jar file 을 선택하여 blank-java.zip 파일을 업로드 해줍니다.

 

그리고, 핸들러 메서드를 입력해 줍니다.( example.Handler::handleRequest )

 

package example;
import com.amazonaws.services.lambda.runtime.Context
import com.amazonaws.services.lambda.runtime.RequestHandler
import com.amazonaws.services.lambda.runtime.LambdaLogger
...

// Handler value: example.Handler
public class Handler implements RequestHandler<SQSEvent, String>{
  Gson gson = new GsonBuilder().setPrettyPrinting().create();
  @Override
  public String handleRequest(SQSEvent event, Context context)
  {
    String response = new String();
    // call Lambda API
    logger.info("Getting account settings");
    CompletableFuture<GetAccountSettingsResponse> accountSettings = 
        lambdaClient.getAccountSettings(GetAccountSettingsRequest.builder().build());
    // log execution details
    logger.info("ENVIRONMENT VARIABLES: {}", gson.toJson(System.getenv()));
    logger.info("CONTEXT: {}", gson.toJson(context));
    logger.info("EVENT: {}", gson.toJson(event));
    // process event
    for(SQSMessage msg : event.getRecords()){
      logger.info(msg.getBody());
    }
    ...
    return response;
  }
}

핸들러 메서드는 이벤트, 컨텍스트를 입력으로 받아 이를 로그로 출력하고 문자열을 반환합니다.


4. 테스트 이벤트 생성 및 테스트

{
  "Records": [
    {
      "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
      "receiptHandle": "MessageReceiptHandle",
      "body": "Hello from SQS!",
      "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1523232000000",
        "SenderId": "123456789012",
        "ApproximateFirstReceiveTimestamp": "1523232000001"
      },
      "messageAttributes": {},
      "md5OfBody": "7b270e59b47ff90a553787216d55d91d",
      "eventSource": "aws:sqs",
      "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:MyQueue",
      "awsRegion": "us-west-2"
    }
  ]
}

Lambda Function console의 "Configure test event" 메뉴에 위의 json 으로 이벤트를 생성하여,

 

해당 이벤트로 테스트를 수행합니다.

 

tocol=https, host=lambda.ap-northeast-2.amazonaws.com, encodedPath=/2016-08-19/account-settings/, headers=[amz-sdk-invocation-id, User-Agent, X-Amzn-Trace-Id], queryParameters=[])
2021-02-09 03:11:52 a12a73fb-a66f-4114-b63f-f707bf8fc24f INFO  Handler - ENVIRONMENT VARIABLES: {
  "PATH": "/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin",
  "LAMBDA_TASK_ROOT": "/var/task",
  "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "512",
  "TZ": ":UTC",
  ...
  "AWS_LAMBDA_FUNCTION_NAME": "goatee-Java"
}
2021-02-09 03:11:52 a12a73fb-a66f-4114-b63f-f707bf8fc24f INFO  Handler - CONTEXT: {
  "memoryLimit": 512,
  "awsRequestId": "a12a73fb-a66f-4114-b63f-f707bf8fc24f",
  "logGroupName": "/aws/lambda/goatee-Java",
  ...
  "logger": {}
}
2021-02-09 03:11:52 a12a73fb-a66f-4114-b63f-f707bf8fc24f INFO  Handler - EVENT: {
  "records": [
    {
      "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
      "receiptHandle": "MessageReceiptHandle",
      "body": "Hello from SQS!",
      "md5OfBody": "7b270e59b47ff90a553787216d55d91d",
      "eventSourceArn": "arn:aws:sqs:us-west-2:123456789012:MyQueue",
      "eventSource": "aws:sqs",
      "awsRegion": "us-west-2",
      "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1523232000000",
        "SenderId": "123456789012",
        "ApproximateFirstReceiveTimestamp": "1523232000001"
      },
      "messageAttributes": {}
    }
  ]
}
2021-02-09 03:11:52 a12a73fb-a66f-4114-b63f-f707bf8fc24f INFO  Handler - Hello from SQS!
2021-02-09 03:11:52  DEBUG request - Received successful response: 200
2021-02-09 03:11:52 a12a73fb-a66f-4114-b63f-f707bf8fc24f INFO  Handler - Account usage: {
  "totalCodeSize": 46129154,
  "functionCount": 13
}
END RequestId: a12a73fb-a66f-4114-b63f-f707bf8fc24f
REPORT RequestId: a12a73fb-a66f-4114-b63f-f707bf8fc24f	Duration: 112.84 ms	Billed Duration: 113 ms	Memory Size: 512 MB	Max Memory Used: 238 MB	

테스트를 수행하면 위와 같이 로그가 출력 됩니다.

 

로그에 event 값이 잘 전달되어 출력되는 것을 확인할 수 있습니다.


참조

docs.aws.amazon.com/lambda/latest/dg/lambda-java.html

docs.aws.amazon.com/ko_kr/lambda/latest/dg/java-handler.html

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함