Canvas 1 Layer 1

re:Invent 2018 - ALB 타깃그룹의 새로운 타입으로 AWS 람다 추가

애플리케이션 로드 밸런서 타깃그룹의 AWS 람다 타깃 타입 소개

AWS 람다AWS Lambda는 아마존 웹 서비스에서 제공하는 서버리스 애플리케이션 실행 환경입니다. 람다 함수를 AWS에 등록한 후, 내부 API를 통해서 호출하거나 S3, 키네시스Kinesis, SQS, 다이나모DBDynamoDB, 클라우드 트레일CloudTrail, SNS와 같은 AWS의 다른 서비스와 연동해서 사용할 수 있습니다. 또한 지금까지는 이를 외부에 HTTP(S) 프로토콜로 노출시키기 위해서 아마존 API 게이트웨이Amazon API Gateway를 사용해야만 했습니다. 이 기능은 유용하지만, 한 두개의 작은 인터페이스를 노출하는 용도로 사용하기에는 복잡한 편입니다.

AWS에서는 2018년 11월 29일 람다 함수를 애플리케이션 로드밸런서(ALB)를 통해서 호출 가능하다고 발표했습니다. 이를 통해 API 게이트웨이를 사용하지 않고도 기존의 로드 밸런서의 리스너로 람다 함수를 등록하는 것이 가능해졌습니다. 이 방법에도 장단점이 있습니다. 적절한 ALB가 있다면 람다를 호출하는 리스너만 추가해서 바로 사용할 수 있습니다. 하지만 람다 함수를 실행하기 위해 ALB를 새로 만들어야한다면 시간당 요금이 발생한다는 점을 고려할 필요가 있습니다. 기존의 아마존 API 게이트웨이와는 요금 방식이 완전히 다르므로 이를 고려해서 외부에 노출시키는 방법을 결정해야 합니다.

ALB 리스너 설정 상 달라지는 것은 없습니다. 이 기능을 좀 더 정확하게 설명해보자면, 타깃그룹의 새로운 타깃 타입으로 람다가 추가되었습니다. 람다를 호출하는 타깃그룹을 만들고 ALB 리스너에서 이 타깃그룹을 지정할 수 있습니다. 이를 통해 ALB 리스너를 통해 람다 함수가 호출됩니다. EC2 타깃그룹 웹콘솔에서는 타깃그룹과 람다 함수 등록을 한꺼번에 할 수 있습니다.

AWS 웹콘솔 - 람다 타입의 타깃그룹 생성 화면
AWS 웹콘솔 - 람다 타입의 타깃그룹 생성 화면

awscli를 사용해 람다 타입의 타깃그룹 생성하기

awscli를 사용하는 경우에는 조금 더 복잡합니다. 여기서는 awscli를 사용해 타깃그룹을 생성하고, 람다 함수를 등록하는 방법을 간단히 소개하겠습니다.

먼저 다음 람다 함수를 hello_world.rb로 저장합니다.

이 파일을 hello_world.zip으로 압축합니다. lambda create-function 명령어로 람다 함수를 생성합니다.*

* 여기서는 람다 함수 생성시 사용할 IAM 역할이 있다고 가정합니다. IAM 역할에 대해서는 re:Invent 2018 - 람다(AWS Lambda), 프로그래밍 언어 루비(Ruby) 공식 지원을 발표에서 간략히 다루고 있으니 참고해주세요.

$ zip hello_world.zip hello_world.rb
$ aws lambda create-function \
  --function-name hello_ruby \
  --runtime ruby2.5 \
  --memory-size 128 \
  --handler hello_world.greeting \
  --role <ROLE_ARN> \
  --zip-file fileb://hello_world.zip

다음으로 타깃그룹을 만듭니다. 여기서 target-typelambda으로 지정합니다. 타깃그룹은 빈 상태로 만들어지기 때문에 이름과 타입만 지정하면 생성할 수 있습니다.*

* 이 글에서는 애플리케이션 로드 밸런스 리소스를 생성하지 않습니다. 클래식 로드 밸런서와 달리 애플리케이션 로드 밸런서는 타깃그룹과 분리되어있습니다.

$ aws elbv2 create-target-group \
  --name lambda-function-tg \
  --target-type lambda

타깃그룹이 정상적으로 생성되면 ARN 정보가 출력됩니다. 이 정보는 다음 명령어에 사용하니 기록해둡니다.

이제 람다 함수와 타깃그룹을 만들었으니 이 둘을 연결해줄 필요가 있습니다. 이에 앞서 할 일이 하나 더 있습니다. 람다 함수를 타깃그룹에서 호출하기 위해서는 타깃그룹에 이에 대한 권한을 부여할 필요가 있습니다. lambda add-permission 명령어로 타깃그룹에서 앞서 생성한 hello_ruby 람다 함수를 실행 가능하게 해줍니다. TARGET_GROUP_ARN에는 앞서 생성한 타깃그룹의 ARN을 지정합니다.

$ aws lambda add-permission \
  --function-name hello_ruby \
  --statement-id statement1 \
  --principal elasticloadbalancing.amazonaws.com \
  --action lambda:InvokeFunction \
  --source-arn <TARGET_GROUP_ARN>

이제 타깃그룹에 타깃(람다 함수)를 등록해줍니다. 타깃그룹의 ARN과 타깃의 ARN을 지정해주어야합니다. 이 때 targets 옵션은 Id=<LAMBDA_ARN> 형식으로 지정해줍니다.*

* I는 대문자이고, d는 소문자입니다. ID나 id로 입력할 경우 에러가 발생합니다.

$ aws elbv2 register-targets 
  --target-group-arn <TARGET_GROUP_ARN>
  --targets Id=<LAMBDA_ARN>

이걸로 람다를 타깃으로 타깃그룹을 만들었습니다. 여기서부터는 ALB에 리스터로 연결시켜주기만 하면 됩니다.

여기까지 새로운 타깃 타입을 사용하는 법을 알아보았습니다. 테스트 후에는 생성한 리소스를 삭제해주세요.