Canvas 1 Layer 1

re:Invent 2018 - AWS 람다, 함수 간 공유 가능한 레이어 기능 지원

AWS 람다AWS Lambda는 아마존 웹 서비스에서 제공하는 서버리스 애플리케이션 실행 환경입니다. 앞서 re:Invent 2018에서 공개한 루비 런타임 지원ALB 타깃그룹의 새로운 타입으로 람다가 추가됐다는 소식을 전해드렸습니다. 이와 더불어 람다에는 한 가지 중요한 기능이 추가 되었습니다. 바로 함수 간에 특정 파일을 공유할 수 있도록 해주는 레이어 기능입니다.

레이어 기능을 사용하면 다음과 같은 장점을 누릴 수 있습니다.

* 람다 패키지는 압축 기준 50MB, 압축 해제 기준으로는 250MB를 지원하고 있습니다. 압축율이 낮은 경우 실제로 사용할 수 있는 용량은 턱없이 부족합니다.

람다 레이어는 단순히 파일 집합에 불과하기 때문에 람다를 사용해본 적이 있다면 아주 쉽게 사용해볼 수 있습니다. 여기서는 람다 레이어에 텍스트 파일을 하나 추가하고, 이를 파일의 내용을 함수에서 반환하는 간단한 예제를 소개합니다.

다음과 같이 람다 함수 디렉터리와 레이어 디렉터리를 준비합니다.

.
├── hello_layer_function
│   └── hello_layer.rb
└── layer
    └── a_file_in_layer

layer/a_file_in_layer 파일의 내용은 다음과 같습니다.

Lambda Layers.

함수에서 람다 레이어를 지정하면 람다 레이어의 내용는 디렉터리 구조 그대로 /opt 아래에 복사됩니다. 따라서 레이어를 압축할 때 /opt 아래의 디렉터리 구조에 대해서 고려할 필요가 있습니다. 결과적으로 이 파일은 람다 함수에서 /opt/layer/a_file_in_layer 경로로 접근할 수 있습니다.

람다 함수인 hello_layer.rb 파일의 내용은 다음과 같습니다.

이 함수는 레이어에 포함된 /opt/layer/a_file_in_layer 파일의 내용을 거꾸로 반환합니다.

먼저 레이어를 압축 파일로 만들고, lambda publish-layer-version 명령어로 배포합니다.

$ zip layer.zip -r layer
  adding: layer/ (stored 0%)
  adding: layer/a_file_in_layer (stored 0%)

$ aws lambda publish-layer-version \
  --layer-name layer  \
  --zip-file fileb://./layer.zip

정상적으로 배포가 되면 레이어 관련 정보가 출력됩니다. 이 중에서 LayerVersionArn을 기록해둡니다.

$ zip hello_layer_function.zip -j ./hello_layer_function/hello_layer.rb
  adding: hello_layer.rb (deflated 4%)

$ aws lambda create-function \
  --function-name hello_layer \
  --runtime ruby2.5 \
  --memory-size 128 \
  --handler hello_layer.handler \
  --layers <LAYER_VERSION_ARN> \
  --role <ROLE_ARN> \
  --zip-file fileb://hello_layer_function.zip

ROLE_ARN에는 람다 함수 실행을 위한 역할을 지정합니다.* LAYER_VERSION_ARN에는 앞서 배포한 람다 레이어의 버전 ARN을 지정합니다.

* 람다 실행을 위해서는 IAM 역할이 필요합니다. 람다 루비 공식 지원을 발표 글에서 역할을 생성하는 방법을 간단히 다루고 있습니다. 아직 람다 실행을 위한 역할이 없다면 이 내용을 참고해주세요.

이제 등록한 람다 함수를 실행해봅니다.

$ aws lambda invoke --function-name hello_layer output.txt
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}

$ cat output.txt
"sreyaL adbmaL"

layer/a_file_in_layer의 내용인 “Lambda Layers”가 뒤집어진 내용이 출력된 것을 확인할 수 있습니다. 이렇듯 파일 관점에서 생각하면 람다 레이어는 아주 쉽게 사용할 수 있습니다. 단, 레이어를 사용해 의존성을 분리하는 경우에는 프로그래밍 언어에 따라서 라이브러리 로드 패스를 수정하는 등 좀 더 궁리가 필요합니다.

람다 레이어를 해설하고 있는 한글 문서로는 다음 글들을 추천합니다.