환율 정보를 가져오는 작은 서비스를 개발해야 하는데 이번 기회에 AWS Lambda 를 이용해보기로 하였다. 

참고 자료를 찾아보는데 Java를 이용해서 AWS Lambda 서비스를 만든 사례를 찾기 어려워 꽤나 헤매었다;

환율을 가져오는 자세한 로직은 제외하고, 설정 및 테스트 부분만 포스팅해보겠다.

 

 

CloudWatch Events를 Trigger로 하여 정해진 시간에 한번씩 Currency 정보를 가져오게끔 하였다. 

 

런타임 설정 

 

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

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Map;

// Handler value: example.Handler
public class CurrencyHandler implements RequestHandler<Map<String,String>, String>{
    Gson gson = new GsonBuilder().setPrettyPrinting().create();

    @Override
    public String handleRequest(Map<String,String> event, Context context)
    {
        LambdaLogger logger = context.getLogger();

        String response = "200 OK";
        // log execution details
        logger.log("ENVIRONMENT VARIABLES: " + gson.toJson(System.getenv()));
        logger.log("CONTEXT: " + gson.toJson(context));
        // process event
        logger.log("EVENT: " + gson.toJson(event));
        logger.log("EVENT TYPE: " + event.getClass());
        return response;
    }
}

 

pom.xml

plugins {
    id 'org.springframework.boot' version '2.4.5'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'XXX'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    mavenCentral()
}

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

test {
    useJUnitPlatform()
}

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

 

중요한 포인트는 소스 파일을 AWS Lambda에 올릴 때 사이즈가 50MB 이 넘어가면 S3에 소스코드를 올려야 한다.

이때 zip으로 package한 결과물을 올려야 하는데 이 부분에서 애를 많이 먹었다 :,-(

배포를 jar로만 했었는데 zip으로 하는 방법도 몰랐고, 그렇게 해야하는 건 줄도 몰랐다 ^^;;;

pom.xml에 zip으로 빌드한다는 내용을 입력하고, 'gradle buildZip'를 하면 

프로젝트\build\distributions 디렉토리 내 zip으로 빌드된 파일이 생성되고 이것을 S3에 올리면 된다. 

 

+ Recent posts