AWS Lambda의 바이너리 문제 해결

AWS Lambda에서 작동하는 graphviz 라이브러리를 얻기 위해 몇 시간 동안 고군분투한 후 이 주제에 대한 전체 기사를 작성하겠다고 약속했습니다. 이 기사에서는 작동하는 바이너리 버전을 만드는 데 사용한 도구를 다루고 싶었습니다.


빌드 대상



Lambda용 바이너리를 컴파일하려는 경우 Amazon Linux 2 AMI로 EC2 인스턴스를 실행하거나 amazonlinux:2 도커 이미지를 사용할 수 있습니다. 대화형 셸을 실행하는 방법은 다음과 같습니다.

$ docker run --rm -it amazonlinux:2 bash

두 경우 모두 기본적으로 컴파일 도구가 제공되지 않으므로 설치해야 합니다. sudo yum groupinstall "Development Tools" 시작하기에 괜찮은 목록을 얻을 수 있습니다. 바이너리의 공유 종속성에 대해 알아보려면 ldd 를 사용할 수 있습니다.
바이너리를 컴파일한 후에는 심사를 위해 개발 환경에 복사해야 합니다.

개발 환경



사용자 지정 바이너리를 사용하여 AWS Lambda 함수에서 작업할 때 빠른 피드백 루프를 갖는 것이 확실히 유용합니다. 이를 위해 docker-lambda로 컨테이너를 실행할 수 있으며 기본적으로 번들로 제공되는 파일 시스템 권한 및 바이너리를 복제합니다./usr/bin/find 와 같이 일반적으로 사용되는 바이너리를 생성하는 경우 기본적으로 번들로 제공되는지 확인하세요(그렇지 않은 경우 직접 포함할 수 있음).

$ docker run --rm --entrypoint /bin/bash lambci/lambda:provided -c 'ls -lha /usr/bin'

내 컴퓨터에서 작동합니다.



필요한 바이너리와 라이브러리가 있으면 이를 Lambda 배포에 포함하거나 재사용하려는 경우 계층으로 업로드할 수 있습니다. 선택한 서버리스의 맛은 중요하지 않습니다.

레이어는 /opt 디렉토리에 마운트되므로 이러한 사용자 지정 바이너리를 실행하려면 약간의 맹글링이 필요합니다. 레이어에 binlib 디렉토리가 포함되어 있다고 가정하면 이 값을 각각 $PATH 및 $LD_LIBRARY 환경 변수에 추가해야 합니다. 이는 런타임에 필요하므로 언어별 단계만 필요합니다. Node.js에서 수행하는 방법은 다음과 같습니다.

process.env.PATH = `${process.env.PATH}:/opt/bin`;
process.env.LD_LIBRARY_PATH = `${process.env.LD_LIBRARY_PATH}:/opt/lib`;
module.exports.handler= async () => {
  /* code */
}

런타임 관련 변수를 포함한 환경 변수 목록은 here 을 참조하십시오.

레이어 툴링



ARN에서 계층을 다운로드하려는 경우 어떤 서버리스 버전을 사용하든 AWS CLI를 사용해야 합니다. 경우에 따라 여전히 레이어의 대안을 검색하는 경우 다운로드하기 전에 먼저 콘텐츠를 확인하고 싶을 수 있습니다. 추가하는 바이너리를 확인하거나 포함된 파일의 크기를 확인하는 것일 수 있습니다.
레이어에 포함된 바이너리, 크기 및 권한을 확인하는 데 도움이 되는 작은 도구를 만들었습니다: describeawslayer.com .



편리함은 재현성을 죽인다



이것은 DockerHub의 레지스트리 성공 뒤에 숨겨진 모토입니다. 맞습니까? AWS SAR이 존재하지만 반드시 종속성을 대상으로 하는 것은 아닙니다. 레이어 관리자(또는 레이어 레지스트리?)가 기존 레이어를 재사용하는 간격을 채울 여지가 여전히 있는 것 같습니다. awesome-lambda-layers도 있다는 것을 알고 있지만 해당 레이어에 활성 사용이 있는지 표시하거나 나열된 모든 항목에 대한 ARN을 언급하기에는 부족합니다. 저는 이와 같은 도구가 개발 수명 주기를 가속화하고 서버리스에 적합하다고 생각하는 개념을 더욱 확장할 것이라고 믿습니다.

AWS Lambda 내에서 바이너리 문제를 해결하기 위해 다른 도구 세트를 사용했거나 다른 문제가 발생한 경우 의견 섹션에서 듣고 싶습니다.


기타 리소스:
  • Official documentation for AWS Lambda layers
  • How do I create a Lambda layer using a simulated Lambda environment with Docker?
  • How do I use Amazon Linux AMI native binary packages in an AWS Lambda deployment package?
  • 좋은 웹페이지 즐겨찾기