Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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 31
Archives
Today
Total
관리 메뉴

디지안의 개발일지

Kotlin으로 AWS Lambda 실행하기 본문

Kotlin

Kotlin으로 AWS Lambda 실행하기

안덕기 2023. 6. 10. 15:42

개요

AWS를 직접 사용해본 적이 없는데 AWS Lambda를 사용할 일이 생겨서 사용할 일에 대해서 정리하려고 한다. 내가 사용한 구조는 다음과 같다.

  1. Kotlin으로 AWS Lambda로 실행시킬 로직을 작성한다.
  2. 서버에서 HTTP 요청을 통해 AWS에 올린 Lambda를 실행하고 그 결과를 받는다.

간단한 구조지만 문서를 찾거나 Kotlin으로 된 예제들이 별로 없어서 다른 사람에게 도움이 될거 같아서 정리해본다.

AWS Lambda 작성

AWS Lambda는 서버를 올리지 않고 짧은 시간 내에 실행되는 로직을 수행할 수 있다. 그래서 Lambda 함수라고도 불린다. AWS에서는 Lambda를 작성하기 위한 여러가지 방법을 제공해주는데 나는 그 중에서도 AWS에서 제공하는 SDK를 사용하여 Lambda를 작성하였다.

의존성 추가

먼저, 프로젝트를 구성하고 gradle에 의존성을 추가해야한다. 버전에 따라 API가 달라지는데 현재 최신버전에서는 원하는 것을 하지 못했고 아래 버전에서는 성공하였다.

implementation("com.amazonaws:aws-lambda-java-core:1.2.1")

Lambda에서 실행할 로직 구성

Lambda에서 실행할 로직만 구성하면 된다. 이게 무슨 말이냐면 굳이 Main 함수를 작성할 필요가 없다는 것을 의미한다.

예제를 보자. 아래 코드는 Lambda에서 실행할 로직으로 간단하게 String을 받아서 반전시키는 기능을 하는 함수를 만들었다. Lambda에서 실행을 하기 위해서는 RequestHandler 인터페이스를 implements 한 형태로 구현을 해야한다. Interface에 필요한 제네릭은 handleRequest의 첫번째 파라미터 타입과 리턴 타입을 넣어주면 된다.

package me.dgahn.lambda

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

class ReverseHandler: RequestHandler<String, String> {
    override fun handleRequest(input: String, context: Context?): String {
        return input.reversed()
    }
}

빌드

위와 같이 코드를 작성하면 해당 프로젝트를 jar 파일로 묶으면 되는데 fatjar로 만들어야만 정상적으로 동작하는 것으로 보인다. 아무래도 라이브러리를 모두 가지고 있어야 실행하는데 문제가 없기 때문으로 보인다. fatjar를 만들기 위해 build.gradle.kts에 설정을 추가해야한다.

plugins {
        // 생략
    id("com.github.johnrengelman.shadow") version "7.1.0"
}

// 생략

tasks.shadowJar {
    archiveFileName.set("lambda.jar")
    destinationDirectory.set(file("build/dist"))
    configurations = listOf(project.configurations.runtimeClasspath.get())
}

// 생략

빌드하면 project/build/dist/lambda.jar에 jar 파일을 생성된 것을 확인할 수 있다.

AWS Lambda에서 함수 생성하기

1. AWS에서 로그인을 하고 Lambda 서비스를 클릭한다.

먼저, 자신이 실행시킬 리전을 확인해야한다. 이 부분을 간과하여 나는 약간의 고생을 하였다.

2. 함수 생성 버튼을 누른다.

3.정보들을 입력한다. 아키텍처의 경우 arm64가 비용이 더 저렴하다. (성능이 더 좋아서 그런 것으로 보임) 다만, 특정 시스템 명령의 경우 x86_64이어야만 동작할 수 있기 때문에 주의해야한다.

4. 함수 생성을 하였으면 두가지 부분을 수정해야한다. 먼저, 아까 만든 jar 파일을 업로드 해보자.

스크롤을 내려서 런타임 설정을 변경해야한다. 이는 위에서 작성한 RequestHandler에 대한 정보를 넣어주면된다. 예제에서는 me.dgahn.lambda 패키지에 있는 ReverseHandler 클래스에 handleRequest 메소드를 실행하는 것이 목적이기 때문에 아래와 같이 작성하면 된다.

me.dgahn.lambda.ReverseHandler::handleRequest

5. 설정을 완료했으면 테스트를 해보자. 테스트 화면으로 이동하자

데이터는 무조건 json형태로 작성해야한다. 지금은 String 하나만 받는 형태로 해놨기 때문에 큰 따옴표를 반드시 붙여줘야한다.

테스트가 완료되고 문제가 없으면 아래와 같이 람다의 실행 결과를 알 수 있다.

이제 Lambda를 실행할 수 있는 준비는 모두 되었다. 이제 Kotlin에서 AWSLambda를 실행할 수 있도록 해보자.

Kotlin에서 Lambda 실행하기

AWS에서는 Lambda를 언제 어떻게 실행시킬지에 대한 트리거로 여러가지 제공을 해준다. 나는 그 중에서 SDK(HTTP API)를 통해서 특정 시점에 실행하고 싶었기 때문에 그에 대한 예제를 공유하려고 한다.

의존성 추가

아래 의존성을 추가해야한다.

dependencies {
    implementation(platform("software.amazon.awssdk:bom:2.19.14"))
  implementation("software.amazon.awssdk:lambda")
}

코드 작성

package me.dgahn.app

import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider
import software.amazon.awssdk.core.SdkBytes
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.lambda.LambdaClient
import software.amazon.awssdk.services.lambda.model.InvokeRequest

fun main() {
    val awsLambda: LambdaClient = LambdaClient.builder()
        .region(Region.AP_NORTHEAST_2) // 지역 설정
        .credentialsProvider(ProfileCredentialsProvider.create()) // 인증 정보 설정
        .build()
    val functionName = "reverseString" // 람다 함수 이름

    val payload = SdkBytes.fromUtf8String("\"abc\"") // 무조건 Json으로 작성해야 함.
    val request = InvokeRequest.builder()
        .functionName(functionName)
        .payload(payload)
        .build()
    val res = awsLambda.invoke(request)
    val value = res.payload().asUtf8String()
    println(value) // 결과 확인
}

인증 정보를 자동으로 설정되는 것이 아니기 때문에 아래 절차를 보고 인증 정보를 설정하면 된다.

인증 정보 설정

Access key 확인

  1. 로그인을 한다.
  2. 우측 상단의 사용자 계정 버튼을 누른다.
  3. “보안 자격 증명”을 선택한다.
  4. 액세스 키를 만든다. 생성할 때, 액세스 키와 시크릿 키를 어딘가에 잘 적어둬야한다.

5. 생성하면 아래와 같이 추가됨

인증 파일 생성

  1. 홈 디렉토리에 .aws 를 생성한다.
  2. credentials 파일을 생성하고 아래와 같이 내용을 작성한다.
    [default] 
    aws_access_key_id = YOUR_ACCESS_KEY_ID 
    aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
  3. 완료!

 

 

 

예제는 github에서 확인하면 된다.

참고 자료
https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/lambda
https://chat.openai.com/