.zip 파일 아카이브로 Go Lambda 함수 배포

.zip 파일 아카이브로 Go Lambda 함수 배포 (Deploy Go Lambda functions with .zip file archives)

AWS Lambda 함수의 코드는 스크립트 또는 컴파일된 프로그램과 그 종속성으로 구성됩니다. 배포 패키지를 사용해 함수 코드를 Lambda에 배포합니다. Lambda는 컨테이너 이미지와 .zip 파일 아카이브 두 가지 유형의 배포 패키지를 지원합니다.

이 페이지는 Go 런타임용 배포 패키지로 .zip 파일을 만든 다음 그 .zip 파일을 사용해 AWS Management Console, AWS Command Line Interface(AWS CLI), AWS Serverless Application Model(AWS SAM)로 함수 코드를 AWS Lambda에 배포하는 방법을 설명합니다.

Lambda는 POSIX 파일 권한을 사용하므로 .zip 파일 아카이브를 만들기 전에 배포 패키지 폴더에 대한 권한을 설정해야 할 수 있습니다.

출처: AWS Lambda 개발자 안내서

본문

macOS 및 Linux에서 .zip 파일 만들기

다음 단계는 go build 명령으로 실행 파일을 컴파일하고 Lambda용 .zip 파일 배포 패키지를 만드는 방법을 보여줍니다. 코드를 컴파일하기 전에 GitHub에서 lambda 패키지를 설치했는지 확인하세요. 이 모듈은 Lambda와 함수 코드 간의 상호작용을 관리하는 런타임 인터페이스 구현을 제공합니다. 이 라이브러리를 다운로드하려면 다음 명령을 실행합니다.

go get github.com/aws/aws-lambda-go/lambda

함수가 AWS SDK for Go를 사용한다면 표준 SDK 모듈 세트와 애플리케이션에 필요한 AWS 서비스 API 클라이언트를 다운로드하세요. SDK for Go 설치 방법을 알아보려면 AWS SDK for Go V2 시작하기를 참조하세요.

provided 런타임 계열 사용

Go는 다른 관리형 런타임과 다르게 구현됩니다. Go는 네이티브로 실행 가능한 바이너리로 컴파일되므로 전용 언어 런타임이 필요하지 않습니다. Go 함수를 Lambda에 배포하려면 OS 전용 런타임(provided 런타임 계열)을 사용하세요.

.zip 배포 패키지 만들기 (macOS/Linux):

  1. 애플리케이션의 main.go 파일이 있는 프로젝트 디렉터리에서 실행 파일을 컴파일합니다. 다음에 유의하세요:
    • 실행 파일 이름은 bootstrap이어야 합니다. 자세한 내용은 핸들러 명명 규칙을 참조하세요.
    • 대상 명령어 세트 아키텍처를 설정하세요. OS 전용 런타임은 arm64와 x86_64를 모두 지원합니다.
    • 선택적 lambda.norpc 태그를 사용해 lambda 라이브러리의 RPC(Remote Procedure Call) 구성 요소를 제외할 수 있습니다. RPC 구성 요소는 더 이상 사용되지 않는 Go 1.x 런타임을 사용할 때만 필요합니다. RPC를 제외하면 배포 패키지의 크기가 줄어듭니다.

arm64 아키텍처의 경우:

GOOS=linux GOARCH=arm64 go build -tags lambda.norpc -o bootstrap main.go

x86_64 아키텍처의 경우:

GOOS=linux GOARCH=amd64 go build -tags lambda.norpc -o bootstrap main.go
  1. (선택 사항) Linux에서 CGO_ENABLED=0을 설정해 패키지를 컴파일해야 할 수 있습니다:
GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build -o bootstrap -tags lambda.norpc main.go

이 명령은 Lambda와 다른 장치에서 다를 수 있는 표준 C 라이브러리(libc) 버전에 대해 안정적인 바이너리 패키지를 만듭니다.

  1. 실행 파일을 .zip 파일로 패키징해 배포 패키지를 만듭니다.
zip myFunction.zip bootstrap

참고

bootstrap 파일은 .zip 파일의 루트에 있어야 합니다.

  1. 함수를 만듭니다. 다음에 유의하세요:
    • 바이너리 이름은 bootstrap이어야 하지만 핸들러 이름은 무엇이든 될 수 있습니다. 자세한 내용은 핸들러 명명 규칙을 참조하세요.
    • --architectures 옵션은 arm64를 사용할 때만 필요합니다. 기본값은 x86_64입니다.
    • --role에는 실행 역할의 Amazon 리소스 이름(ARN)을 지정합니다.
aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--architectures arm64 \
--role arn:aws:iam::111122223333:role/lambda-ex \
--zip-file fileb://myFunction.zip

Windows에서 .zip 파일 만들기

다음 단계는 GitHub에서 Windows용 build-lambda-zip 도구를 다운로드하고 실행 파일을 컴파일하며 .zip 배포 패키지를 만드는 방법을 보여줍니다.

참고

아직 하지 않았다면 git을 설치하고 git 실행 파일을 Windows %PATH% 환경 변수에 추가해야 합니다.

코드를 컴파일하기 전에 GitHub에서 lambda 라이브러리를 설치했는지 확인하세요. 이 라이브러리를 다운로드하려면 다음 명령을 실행합니다.

go get github.com/aws/aws-lambda-go/lambda

함수가 AWS SDK for Go를 사용한다면 표준 SDK 모듈 세트와 애플리케이션에 필요한 AWS 서비스 API 클라이언트를 다운로드하세요. SDK for Go 설치 방법을 알아보려면 AWS SDK for Go V2 시작하기를 참조하세요.

provided 런타임 계열 사용

Go는 다른 관리형 런타임과 다르게 구현됩니다. Go는 네이티브로 실행 가능한 바이너리로 컴파일되므로 전용 언어 런타임이 필요하지 않습니다. Go 함수를 Lambda에 배포하려면 OS 전용 런타임(provided 런타임 계열)을 사용하세요.

.zip 배포 패키지 만들기 (Windows):

  1. GitHub에서 build-lambda-zip 도구를 다운로드합니다.
go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
  1. GOPATH에서 이 도구를 사용해 .zip 파일을 만듭니다. Go를 기본 설치했다면 이 도구는 일반적으로 %USERPROFILE%\Go\bin에 있습니다. 그렇지 않으면 Go 런타임을 설치한 위치로 이동해 다음 중 하나를 수행하세요:

cmd.exe:

대상 명령어 세트 아키텍처에 따라 다음 중 하나를 실행합니다. OS 전용 런타임은 arm64와 x86_64를 모두 지원합니다. 선택적 lambda.norpc 태그를 사용해 lambda 라이브러리의 RPC 구성 요소를 제외할 수 있습니다. RPC 구성 요소는 더 이상 사용되지 않는 Go 1.x 런타임을 사용할 때만 필요합니다. RPC를 제외하면 배포 패키지의 크기가 줄어듭니다.

x86_64 아키텍처 예시:

set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0
go build -tags lambda.norpc -o bootstrap main.go
%USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap

arm64 아키텍처 예시:

set GOOS=linux
set GOARCH=arm64
set CGO_ENABLED=0
go build -tags lambda.norpc -o bootstrap main.go
%USERPROFILE%\Go\bin\build-lambda-zip.exe -o myFunction.zip bootstrap

PowerShell:

대상 명령어 세트 아키텍처에 따라 다음 중 하나를 실행합니다. OS 전용 런타임은 arm64와 x86_64를 모두 지원합니다. 선택적 lambda.norpc 태그를 사용해 lambda 라이브러리의 RPC 구성 요소를 제외할 수 있습니다. RPC 구성 요소는 더 이상 사용되지 않는 Go 1.x 런타임을 사용할 때만 필요합니다. RPC를 제외하면 배포 패키지의 크기가 줄어듭니다.

x86_64 아키텍처의 경우:

$env:GOOS = "linux"
$env:GOARCH = "amd64"
$env:CGO_ENABLED = "0"
go build -tags lambda.norpc -o bootstrap main.go
~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap

arm64 아키텍처의 경우:

$env:GOOS = "linux"
$env:GOARCH = "arm64"
$env:CGO_ENABLED = "0"
go build -tags lambda.norpc -o bootstrap main.go
~\Go\Bin\build-lambda-zip.exe -o myFunction.zip bootstrap
  1. 함수를 만듭니다. 다음에 유의하세요:
    • 바이너리 이름은 bootstrap이어야 하지만 핸들러 이름은 무엇이든 될 수 있습니다. 자세한 내용은 핸들러 명명 규칙을 참조하세요.
    • --architectures 옵션은 arm64를 사용할 때만 필요합니다. 기본값은 x86_64입니다.
    • --role에는 실행 역할의 ARN을 지정합니다.
aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--architectures arm64 \
--role arn:aws:iam::111122223333:role/lambda-ex \
--zip-file fileb://myFunction.zip

.zip 파일로 Go Lambda 함수 만들기 및 업데이트

.zip 배포 패키지를 만든 후 이를 사용해 새 Lambda 함수를 만들거나 기존 함수를 업데이트할 수 있습니다. Lambda 콘솔, AWS Command Line Interface, Lambda API를 사용해 .zip 패키지를 배포할 수 있습니다. AWS Serverless Application Model(AWS SAM)과 CloudFormation으로 Lambda 함수를 만들고 업데이트할 수도 있습니다.

Lambda용 .zip 배포 패키지의 최대 크기는 250MB(압축 해제 기준)입니다. 이 제한은 Lambda 레이어를 포함해 업로드하는 모든 파일의 결합 크기에 적용됩니다.

Lambda 런타임은 배포 패키지의 파일을 읽을 권한이 필요합니다. Linux 권한 8진수 표기법에서 Lambda는 실행 불가 파일에 644 권한(rw-r--r--), 디렉터리와 실행 파일에 755 권한(rwxr-xr-x)이 필요합니다.

Linux와 macOS에서는 chmod 명령을 사용해 배포 패키지의 파일과 디렉터리의 권한을 변경합니다. 예를 들어 실행 불가 파일에 올바른 권한을 부여하려면 다음 명령을 실행합니다.

chmod 644 <filename>

Windows에서 파일 권한을 변경하려면 Microsoft Windows 문서의 Set, View, Change, or Remove Permissions on an Object를 참조하세요.

참고

배포 패키지의 디렉터리에 액세스하는 데 필요한 권한을 Lambda에 부여하지 않으면 Lambda는 해당 디렉터리의 권한을 755(rwxr-xr-x)로 설정합니다.

콘솔로 .zip 파일로 함수 만들기 및 업데이트

새 함수를 만들려면 먼저 콘솔에서 함수를 만든 다음 .zip 아카이브를 업로드해야 합니다. 기존 함수를 업데이트하려면 함수 페이지를 연 다음 같은 절차를 따라 업데이트된 .zip 파일을 추가하세요.

.zip 파일이 50MB보다 작으면 로컬 머신에서 직접 파일을 업로드해 함수를 만들거나 업데이트할 수 있습니다. 50MB보다 큰 .zip 파일은 먼저 패키지를 Amazon S3 버킷에 업로드해야 합니다. AWS Management Console로 Amazon S3 버킷에 파일을 업로드하는 방법은 Amazon S3 시작하기를 참조하세요. AWS CLI로 파일을 업로드하려면 AWS CLI 사용 안내서의 객체 이동을 참조하세요.

참고

기존 컨테이너 이미지 함수를 .zip 아카이브를 사용하도록 변환할 수 없습니다. 새 함수를 만들어야 합니다.

새 함수 만들기 (콘솔):

  1. Lambda 콘솔의 Functions(함수) 페이지를 열고 Create function(함수 생성) 을 선택합니다.
  2. Author from scratch(처음부터 작성) 를 선택합니다.
  3. Basic information(기본 정보) 아래에서 다음을 수행합니다:
    • Function name(함수 이름) 에 함수 이름을 입력합니다.
    • Runtime(런타임) 에서 provided.al2023을 선택합니다.
  4. (선택 사항) Permissions(권한) 아래에서 Change default execution role(기본 실행 역할 변경) 을 확장합니다. 새 실행 역할을 만들거나 기존 역할을 사용할 수 있습니다.
  5. Create function 을 선택합니다. Lambda는 선택한 런타임으로 기본 'Hello world' 함수를 만듭니다.

로컬 머신에서 .zip 아카이브 업로드 (콘솔):

  1. Lambda 콘솔의 Functions 페이지에서 .zip 파일을 업로드할 함수를 선택합니다.
  2. Code(코드) 탭을 선택합니다.
  3. Code source(코드 소스) 창에서 Upload from(업로드 위치) 을 선택합니다.
  4. .zip file 을 선택합니다.
  5. .zip 파일을 업로드하려면 다음을 수행합니다:
    • Upload 를 선택한 다음 파일 선택기에서 .zip 파일을 선택합니다.
    • Open(열기) 을 선택합니다.
    • Save(저장) 를 선택합니다.

Amazon S3 버킷에서 .zip 아카이브 업로드 (콘솔):

  1. Lambda 콘솔의 Functions 페이지에서 새 .zip 파일을 업로드할 함수를 선택합니다.
  2. Code 탭을 선택합니다.
  3. Code source 창에서 Upload from 을 선택합니다.
  4. Amazon S3 location(Amazon S3 위치) 을 선택합니다.
  5. .zip 파일의 Amazon S3 링크 URL을 붙여넣고 Save 를 선택합니다.

AWS CLI로 .zip 파일로 함수 만들기 및 업데이트

AWS CLI를 사용해 .zip 파일로 새 함수를 만들거나 기존 함수를 업데이트할 수 있습니다. create-function 및 update-function-code 명령을 사용해 .zip 패키지를 배포합니다. .zip 파일이 50MB보다 작으면 로컬 빌드 머신의 파일 위치에서 .zip 패키지를 업로드할 수 있습니다. 더 큰 파일은 Amazon S3 버킷에서 .zip 패키지를 업로드해야 합니다. AWS CLI로 Amazon S3 버킷에 파일을 업로드하는 방법은 AWS CLI 사용 안내서의 객체 이동을 참조하세요.

참고

AWS CLI를 사용해 Amazon S3 버킷에서 .zip 파일을 업로드하면 버킷은 함수와 같은 AWS 리전에 있어야 합니다.

AWS CLI로 .zip 파일을 사용해 새 함수를 만들려면 다음을 지정해야 합니다:

  • 함수의 이름(--function-name)
  • 함수의 런타임(--runtime)
  • 함수 실행 역할의 ARN(--role)
  • 함수 코드의 핸들러 메서드 이름(--handler)

또한 .zip 파일의 위치를 지정해야 합니다. .zip 파일이 로컬 빌드 머신의 폴더에 있으면 다음 예제 명령처럼 --zip-file 옵션으로 파일 경로를 지정합니다.

aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip

Amazon S3 버킷에 .zip 파일 위치를 지정하려면 다음 예제 명령처럼 --code 옵션을 사용합니다. 버전 관리 객체에만 S3ObjectVersion 파라미터를 사용하면 됩니다.

aws lambda create-function --function-name myFunction \
--runtime provided.al2023 --handler bootstrap \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

CLI로 기존 함수를 업데이트하려면 --function-name 파라미터로 함수의 이름을 지정합니다. 또한 함수 코드를 업데이트하는 데 사용할 .zip 파일의 위치를 지정해야 합니다. .zip 파일이 로컬 빌드 머신의 폴더에 있으면 다음 예제 명령처럼 --zip-file 옵션으로 파일 경로를 지정합니다.

aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip

Amazon S3 버킷에 .zip 파일 위치를 지정하려면 다음 예제 명령처럼 --s3-bucket 및 --s3-key 옵션을 사용합니다. 버전 관리 객체에만 --s3-object-version 파라미터를 사용하면 됩니다.

aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version

Lambda API로 .zip 파일로 함수 만들기 및 업데이트

.zip 파일 아카이브로 함수를 만들고 업데이트하려면 다음 API 작업을 사용합니다:

  • CreateFunction
  • UpdateFunctionCode

AWS SAM으로 .zip 파일로 함수 만들기 및 업데이트

AWS Serverless Application Model(AWS SAM)은 AWS에서 서버리스 애플리케이션을 빌드하고 실행하는 프로세스를 간소화하는 툴킷입니다. 애플리케이션의 리소스를 YAML 또는 JSON 템플릿으로 정의하고 AWS SAM CLI(명령줄 인터페이스)를 사용해 애플리케이션을 빌드, 패키징, 배포합니다. AWS SAM 템플릿에서 Lambda 함수를 빌드하면 AWS SAM은 함수 코드와 지정한 종속성으로 .zip 배포 패키지 또는 컨테이너 이미지를 자동으로 만듭니다. AWS SAM을 사용해 Lambda 함수를 빌드하고 배포하는 방법에 대해 자세히 알아보려면 AWS Serverless Application Model 개발자 안내서의 AWS SAM 시작하기를 참조하세요.

AWS SAM을 사용해 기존 .zip 파일 아카이브로 Lambda 함수를 만들 수도 있습니다. AWS SAM으로 Lambda 함수를 만들려면 .zip 파일을 Amazon S3 버킷 또는 빌드 머신의 로컬 폴더에 저장할 수 있습니다. AWS CLI로 Amazon S3 버킷에 파일을 업로드하는 방법은 AWS CLI 사용 안내서의 객체 이동을 참조하세요.

AWS SAM 템플릿에서 AWS::Serverless::Function 리소스는 Lambda 함수를 지정합니다. 이 리소스에서 다음 속성을 설정해 .zip 파일 아카이브로 함수를 만듭니다:

  • PackageType — Zip으로 설정
  • CodeUri — 함수 코드의 Amazon S3 URI, 로컬 폴더 경로 또는 FunctionCode 객체로 설정
  • Runtime — 선택한 런타임으로 설정

AWS SAM에서는 .zip 파일이 50MB보다 커도 먼저 Amazon S3 버킷에 업로드할 필요가 없습니다. AWS SAM은 로컬 빌드 머신의 위치에서 최대 허용 크기인 250MB(압축 해제 기준)까지 .zip 패키지를 업로드할 수 있습니다.

AWS SAM에서 .zip 파일로 함수를 배포하는 방법에 대해 자세히 알아보려면 AWS SAM 개발자 안내서의 AWS::Serverless::Function을 참조하세요.

예시: AWS SAM을 사용해 provided.al2023으로 Go 함수 빌드:

다음 속성으로 AWS SAM 템플릿을 만듭니다:

  • BuildMethod — 애플리케이션의 컴파일러를 지정합니다. go1.x를 사용하세요.
  • Runtime — provided.al2023을 사용하세요.
  • CodeUri — 코드 경로를 입력합니다.
  • Architectures — arm64 아키텍처에는 [arm64]를 사용하세요. x86_64 명령어 세트 아키텍처에는 [amd64]를 사용하거나 Architectures 속성을 제거하세요.

예시 template.yaml:

AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Metadata:
      BuildMethod: go1.x
    Properties:
      CodeUri: hello-world/ # folder where your main program resides
      Handler: bootstrap
      Runtime: provided.al2023
      Architectures: [arm64]

sam build 명령을 사용해 실행 파일을 컴파일합니다.

sam build

sam deploy 명령을 사용해 함수를 Lambda에 배포합니다.

sam deploy --guided

CloudFormation으로 .zip 파일로 함수 만들기 및 업데이트

CloudFormation을 사용해 .zip 파일 아카이브로 Lambda 함수를 만들 수 있습니다. .zip 파일로 Lambda 함수를 만들려면 먼저 파일을 Amazon S3 버킷에 업로드해야 합니다. AWS CLI로 Amazon S3 버킷에 파일을 업로드하는 방법은 AWS CLI 사용 안내서의 객체 이동을 참조하세요.

CloudFormation 템플릿에서 AWS::Lambda::Function 리소스는 Lambda 함수를 지정합니다. 이 리소스에서 다음 속성을 설정해 .zip 파일 아카이브로 함수를 만듭니다:

  • PackageType — Zip으로 설정
  • Code — S3Bucket 및 S3Key 필드에 Amazon S3 버킷 이름과 .zip 파일 이름을 입력합니다.
  • Runtime — 선택한 런타임으로 설정

CloudFormation이 생성하는 .zip 파일은 4MB를 초과할 수 없습니다. CloudFormation에서 .zip 파일로 함수를 배포하는 방법에 대해 자세히 알아보려면 CloudFormation 사용 안내서의 AWS::Lambda::Function을 참조하세요.

더 알아보기 (Learn more)

  • Lambda 배포 패키지
  • Go 런타임
  • AWS SAM 및 CloudFormation으로 Lambda 배포