본문 바로가기

06. Cloud/AWS

Scala로 AWS Lambda 사용하기

이 포스팅은 https://aws.amazon.com/ko/blogs/compute/writing-aws-lambda-functions-in-scala/를 기반으로 만들어졌습니다.


Scala는 기본적으로 Jar파일로 떨어집니다. 요즘 AWS를 많이 사용하고 있습니다. 저번에 AWS User Group 세미나를 참석한적이 있는데, 거기서도 Lambda를 많이 강조를 하는것을 보았습니다. Lambda는 Java를 사용할 수 있습니다. 그 뜻은 Scala도 사용이 가능하다는 뜻이겠지요. 그래서 이번에는 Scala를 이용하여 Lambda를 사용하려 합니다.


SBT 설정

먼저 SBT Scala Project를 만듭니다. 그 후, project/plugins.sbt를  만들어서 그 안에 다음과 같이 적습니다.


addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.3")


그 후, build.sbt에는 다음과 같이 추가적으로 입력하니다.


javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-Xlint")

name := "Scala_AWSLambda"

version := "1.0"

scalaVersion := "2.11.8"

libraryDependencies ++= {
  Seq(
    "com.amazonaws" % "aws-lambda-java-core" % "1.1.0",
    "com.amazonaws" % "aws-lambda-java-events" % "1.3.0"
  )
}

mergeStrategy in assembly := {
  case PathList("META-INF", xs @ _*) => MergeStrategy.discard
  case x => MergeStrategy.first
}


그 후, Scala Code를 입력합니다. 입력하는 Code는 S3에 어떠한 Object가 생겼을 때, 그 Object의 Key를 출력하는 것입니다.


package ktz

import scala.collection.JavaConverters._
import java.net.URLDecoder
import com.amazonaws.services.lambda.runtime.events.S3Event

class Main {
  def decodeS3Key(key: String): String = URLDecoder.decode(key.replace("+", " "), "utf-8")

  def getSourceBuckets(event: S3Event): java.util.List[String] = {
    val result = event.getRecords.asScala.map(record => decodeS3Key(record.getS3.getObject.getKey)).asJava
    println(result)
    return result
  }
}


그 후, SBT compile과 Assembly를 실행 합니다.


$ sbt compile

$ sbt assembly


sbt assembly가 완료가 되면, target/scala-2.11/Scala_AWSLambda-assembly-1.0.jar가 생성됩니다. AWS Lambda는 Jar File이 업로드가 가능하므로, 이제 이것을 AWS Lambda에 올려 봅시다.



여기서 Handler는 실행이 될 함수의 이름입니다. ktz Package의 Main Class의 getSourceBuckets Function이 실행이 된다는 뜻입니다. 


그 후, 해당 Lambda Function이 작동할 Lambda Trigger를 만듭니다. 먼저, Function Section에서 Trigger Tab을 들어가, add trigger를 클릭합니다.



그 후, 우리는 S3를 Trigger로 받기 때문에, S3를 설정해줍니다.



이제, S3에 파일을 업로드를 하고, Cloud Watch에 로그를 확인하면 다음과 같이 남게 됩니다.




이렇게, S3에 무언가를 올리게 되면, Trigger가 되어, 해당 함수를 실행하게 됩니다.