'Lambda'에 해당되는 글 2건

  1. 2017.07.07 SPRINGBOOT로 AWS LAMBDA 이용하기
  2. 2017.04.23 aws lambda 에 대한 몇 가지

SPRINGBOOT로 AWS LAMBDA 이용하기

spring framework 2017.07.07 09:52 posted by dev.bistro


결론적으로 @SpringBootApplication 과 Main method으로 시작되는 startup은 불가능하지만, 그 부분을 생성자 부분으로 변경한 다면 사용 가능하다. 다만, 첫  시작은 dependency lookup 방식으로 bean을 가져와야 한다.
(이건 올해 초 얘기고, 지금은 https://github.com/spring-cloud/spring-cloud-function 을 이용하면 된다)

테스트환경

  • intellij 2016.3
  • gradle
  • spring-boot 1.4.3

intellij Spring Initializr 의 셋팅

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-14-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-6-38-44

이후 build.gradle은 다음과 같이 셋팅하였다. boot를 이용한 gradle의  task package 나  assemble는 main이 없기때문에 사용이 힘들고 maven shade 플러그인이나 gradle shadow를 이용한다.

참고 build.gradle
( plugin : https://github.com/johnrengelman/shadow 는 몇년전에 PR 1줄 했네…)

이후 https://github.com/bistros/test-springboot-lambda 으로 프로젝트를 구동 시켜봤지만 단순히 String을 리턴하는데도 2초씩 걸린다.  (handleRequest에서 스프링 프로젝트를 초기화 하니 당연히 느릴수밖에… source link )

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-14-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-7-14-56

그래서 다음처럼 생성자에서 초기화하도록 수정 (source link) 하였다.

%e1%84%89%e1%85%b3%e1%84%8f%e1%85%b3%e1%84%85%e1%85%b5%e1%86%ab%e1%84%89%e1%85%a3%e1%86%ba-2017-01-14-%e1%84%8b%e1%85%a9%e1%84%92%e1%85%ae-7-15-55


신고

aws lambda 에 대한 몇 가지

분류없음 2017.04.23 13:47 posted by dev.bistro

* lambda function 이 실행되는 storage 환경에 접근 가능하다.

1
2
3
4
5
6
var sp = require('child_process').spawn;
var ls = sp('df' , ['-h'] );
 
ls.stdout.on('data', function(data) {
console.log('stdout : ' + data);
});

Cloudwatch를 보면 아래처럼 로그가 남는다.

1
2
3
Filesystem Size Used Avail Use% Mounted on
/dev/xvda1 30G 2.8G 27G 10% /
/dev/loop5 526M 440K 514M 1% /tmp

* lambda 의 로그가 cloudwatch에 쌓이는 데 ‘즉시’ 쌓이지는 않는다.

* lambda + S3을 이용하려면 반드시 같은 리전에 있어야 하고 , S3 권한이 필요하다.

* 장시간 수행된다면 EC2에 비해 유리한 요금체계가 아니다 (1GB메모리/1달 기준 ec2는 9$, lambda는 37$)
lambda는 메모리가 낮을수록, 실행시간이 짧을수록 ec2에 비해 가격 효율이 좋다. 잘 비교해서 써야 비용 절감

* aws lambda 의 내부 구조에 대해서는 언급 된 적이 없다. https://aws.amazon.com/ko/lambda/
다만 컨테이너에 zip 소스코드가 실행 된다는 정도로 생각 해 볼 수 있는데,
대략 10~ 15분이 지나면 이 코드가 컨테이너에서 제거된다. 이후에 다시 function을 수행해면 어느 정도의 delay가 생긴다.
https://forums.aws.amazon.com/thread.jspa?threadID=181348 처럼 VM을 올려야 하는 java , upload size가 클수록 이 지연시간이 크다고 한다.

이러한 재시작 (cold start)를 효율적으로 대비 하는 방법은?
1. zip file을 가능한 작게 만든다
2. 10분 이하로 강제로 한번씩 실행하여 상태를 유지하도록 한다 (이 경우 한달에 4800번 정도가 추가로 호출된다)

* lambda 는 스케일링 세부 정책을 발표하지 않고 ‘자동으로 스케일링 요구사항에 맞춰 한다’ 라고만 한다. 즉, 개발자에게는 현재 스케일링에 관한 권한이 없다. 어플리케이션이 엄격한 지연시간등이 필요하다면 서비스 전에 많은 스트레스 테스트를 해봐야 할 것이다.
(app이 100ms의 지연시간까지 허용해야할 때 실제로 lambda가 200ms이 걸리더라도, lambda의 스케일링 조건이 아니라면 여전히 200ms가 걸릴 것이다)
* 현재 (2017/02/03) 최대 Timeout은 5분. 즉 5분 이상 넘어가는 function은 사용X

* lambda는 최대 1.5GB 메모리만 지원

* AWS lambda 를 사용하기 위해서 추가해야하는 lib들은 다음과 같다

‘com.amazonaws:aws-lambda-java-core:1.1.0’
‘com.amazonaws:aws-lambda-java-events:1.3.0’
‘com.amazonaws:aws-lambda-java-log4j:1.0.0’

출처 : https://github.com/aws/aws-lambda-java-libs (2017년 1월 기준)

* aws-lambda-java-log4j 는 이름 그대로 로깅을 위한 log4j 어댑터이다.
내부적으로는 log4j:1.2.17버전을 사용하고 있고 log4j의 AppenderSkeleton 를 확장한 LambdaAppender 와 log4j.properties를 사용한다.
http://docs.aws.amazon.com/lambda/latest/dg/java-logging.html)

* aws-lambda-java-events 는 S3, SNS, DynamoDB등을 이용하기 위한 extension library이다.
1.3.0 기준으로 aws 서비스 중 S3, SNS, kinesis, Cognito,dynamodb 등의 솔루션을 지원하고 AWS-SDK 1.11.0 에 의존성이 걸려 있다

* aws-lambda-java-core 는 기본적인 lambda를 쓰기 위한 라이브러리 이다.



2017/1월에 쓴  글을 옮겨옴

신고


티스토리 툴바