.zip 파일 아카이브를 사용하여 Go Lambda 함수 배포 - AWS Lambda

.zip 파일 아카이브를 사용하여 Go Lambda 함수 배포

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 파일 아카이브를 생성하기 전에 배포 패키지 폴더에 대한 권한을 설정해야 할 수 있습니다.

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

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

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

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

제공된 런타임 패밀리 사용

Go는 다른 관리형 런타임과 다른 방법으로 구현됩니다. Go는 기본적으로 실행 가능한 바이너리로 컴파일되므로 전용 언어 런타임이 필요하지 않습니다. OS 전용 런타임(provided 런타임 패밀리)을 사용하여 Lambda에 Go 함수를 배포합니다.

.zip 배포 패키지 생성(macOS/Linux)
  1. 애플리케이션의 main.go 파일이 들어 있는 프로젝트 디렉터리에서 실행 파일을 컴파일합니다. 유의할 사항:

    • 실행 파일의 이름은 bootstrap이어야 합니다. 자세한 내용은 이름 지정 단원을 참조하십시오.

    • 대상 명령 세트 아키텍처를 설정합니다. OS 전용 런타임은 arm64와 x86_64를 모두 지원합니다.

    • 선택 사항인 lambda.norpc 태그를 사용하여 lambda 라이브러리의 원격 절차 호출(RPC) 구성 요소를 제외할 수 있습니다. 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
  2. (선택 사항) Linux에서 CGO_ENABLED=0 세트를 사용하여 패키지를 컴파일해야 할 수도 있습니다.

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

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

  3. 실행 파일을 .zip 파일로 패키지하여 배포 패키지를 만듭니다.

    zip myFunction.zip bootstrap
    참고

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

  4. 함수를 생성합니다. 유의할 사항:

    • 바이너리의 이름은 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를 사용하는 경우 애플리케이션에 필요한 AWS 서비스 API 클라이언트와 함께 표준 SDK 모듈 세트를 다운로드하세요. SDK for Go를 설치하는 방법을 알아보려면 Getting Started with the AWS SDK for Go V2를 참조하세요.

제공된 런타임 패밀리 사용

Go는 다른 관리형 런타임과 다른 방법으로 구현됩니다. Go는 기본적으로 실행 가능한 바이너리로 컴파일되므로 전용 언어 런타임이 필요하지 않습니다. OS 전용 런타임(provided 런타임 패밀리)을 사용하여 Lambda에 Go 함수를 배포합니다.

.zip 배포 패키지 생성(Windows)
  1. GitHub에서 build-lambda-zip 도구를 다운로드합니다.

    go install github.com/aws/aws-lambda-go/cmd/build-lambda-zip@latest
  2. GOPATH의 도구를 사용하여 .zip 파일을 만듭니다. Go가 기본적으로 설치되어 있다면 도구는 보통 %USERPROFILE%\Go\bin에 있습니다. 그렇지 않다면 Go 런타임을 설치한 위치로 이동해 다음 중 하나를 수행합니다.

    cmd.exe

    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

    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
  3. 함수를 생성합니다. 유의할 사항:

    • 바이너리의 이름은 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

.zip 파일을 사용하여 Go Lambda 함수 생성 및 업데이트

.zip 배포 패키지를 생성한 후에는 이를 사용하여 새 Lambda 함수를 생성하거나 기존 함수를 업데이트할 수 있습니다. Lambda 콘솔, AWS Command Line Interface 및 Lambda API를 사용하여 .zip 패키지를 배포할 수 있습니다. AWS Serverless Application Model(AWS SAM) 및 AWS CloudFormation을 사용하여 Lambda 함수를 생성하고 업데이트할 수도 있습니다.

Lambda용 .zip 배포 패키지의 최대 크기는 250MB(압축 해제됨)입니다. 이 제한은 Lambda 계층을 포함하여 업로드하는 모든 파일의 합산 크기에 적용됩니다.

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

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

chmod 755 <filepath>

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

콘솔을 사용하여.zip 파일로 함수 생성 및 업데이트

새 함수를 생성하려면 먼저 콘솔에서 함수를 생성한 다음.zip 아카이브를 업로드해야 합니다. 기존 함수를 업데이트하려면 함수에 대한 페이지를 연 다음 동일한 절차에 따라 업데이트된 .zip 파일을 추가합니다.

.zip 파일이 50MB 미만인 경우 로컬 컴퓨터에서 직접 파일을 업로드하여 함수를 생성하거나 업데이트할 수 있습니다. 50MB보다 큰 .zip 파일의 경우 먼저 패키지를 Amazon S3 버킷에 업로드해야 합니다. AWS Management Console을 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 Amazon S3 시작하기를 참조하세요. AWS CLI를 사용하여 파일을 업로드하려면 AWS CLI 사용 설명서의 객체 이동을 참조하세요.

참고

.zip 아카이브를 사용하도록 기존 컨테이너 이미지 함수를 변환할 수는 없습니다. 새로운 함수를 생성해야 합니다.

새 함수 생성(콘솔)
  1. Lambda 콘솔의 함수 페이지를 열고 함수 생성을 선택합니다.

  2. 새로 작성을 선택합니다.

  3. 기본 정보에서 다음과 같이 합니다.

    1. 함수 이름에 함수 이름을 입력합니다.

    2. 런타임에서 provided.al2023를 선택합니다.

  4. (선택 사항) 권한(Permissions)에서 기본 실행 역할 변경(Change default execution role)을 확장합니다. 새로운 실행 역할을 생성하거나 기존 실행 역할을 사용할 수 있습니다.

  5. 함수 생성을 선택합니다. Lambda에서 선택한 런타임을 사용하여 기본 'Hello World' 함수를 생성합니다.

로컬 시스템에서 .zip 아카이브 업로드(콘솔)
  1. Lambda 콘솔의 함수 페이지에서.zip 파일을 업로드할 함수를 선택합니다.

  2. 코드 탭을 선택합니다.

  3. 코드 소스 창에서 에서 업로드를 선택합니다.

  4. .zip 파일을 선택합니다.

  5. .zip 파일을 업로드하려면 다음을 수행합니다.

    1. 업로드를 선택한 다음 파일 선택기에서.zip 파일을 선택합니다.

    2. Open을 선택합니다.

    3. Save(저장)를 선택합니다.

Amazon S3 버킷에서.zip 아카이브 업로드(콘솔)
  1. Lambda 콘솔의 함수 페이지에서 새 .zip 파일을 업로드할 함수를 선택합니다.

  2. 코드 탭을 선택합니다.

  3. 코드 소스 창에서 에서 업로드를 선택합니다.

  4. Amazon S3 위치를 선택합니다.

  5. .zip 파일의 Amazon S3 링크 URL을 붙여 넣고 저장을 선택합니다.

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)

  • 함수의 실행 역할(--role)의 Amazon 리소스 이름(ARN)

  • 함수 코드에 있는 핸들러 메서드의 이름(--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=DOC-EXAMPLE-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 DOC-EXAMPLE-BUCKET --s3-key myFileName.zip --s3-object-version myObject Version

Lambda API를 사용하여.zip 파일로 함수 생성 및 업데이트

.zip 파일 아카이브를 사용하여 함수를 생성하고 업데이트하려면 다음 API 작업을 사용합니다.

AWS SAM을 사용하여.zip 파일로 함수 생성 및 업데이트

AWS Serverless Application Model(AWS SAM)은 AWS에서 서버리스 애플리케이션을 빌드하고 실행하는 프로세스를 간소화하는 데 도움이 되는 도구 키트입니다. YAML 또는 JSON 템플릿에서 애플리케이션의 리소스를 정의하고 AWS SAM Command Line Interface(AWS SAM CLI)를 사용하여 애플리케이션을 빌드, 패키징 및 배포합니다. AWS SAM 템플릿에서 Lambda 함수를 빌드하면 AWS SAM은 함수 코드와 사용자가 지정하는 종속 항목을 사용하여 .zip 배포 패키지 또는 컨테이너 이미지를 자동으로 생성합니다. AWS SAM을 사용하여 Lambda 함수를 빌드하고 배포하는 방법에 대해 자세히 알아보려면 AWS Serverless Application Model 개발자 안내서의 Getting started with AWS SAM을 참조하세요.

AWS SAM을 사용하여 기존 .zip 파일 아카이브로 Lambda 함수를 생성할 수도 있습니다. AWS SAM을 사용하여 Lambda 함수를 생성하려면 Amazon S3 버킷 또는 빌드 시스템의 로컬 폴더에 .zip 파일을 저장할 수 있습니다. 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 함수 구축
  1. 다음 속성을 사용하여 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]
  2. sam build 명령을 사용하여 실행 파일을 컴파일합니다.

    sam build
  3. sam deploy 명령을 사용하여 함수를 Lambda에 배포합니다.

    sam deploy --guided

AWS CloudFormation을 사용하여.zip 파일로 함수 생성 및 업데이트

AWS CloudFormation을 사용하여 .zip 파일 아카이브로 Lambda 함수를 생성할 수 있습니다. .zip 파일에서 Lambda 함수를 생성하려면 먼저 Amazon S3 버킷에 파일을 업로드해야 합니다. AWS CLI를 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 AWS CLI 사용 설명서의 객체 이동을 참조하세요.

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

  • PackageType - Zip으로 설정됨

  • CodeS3Bucket 및 S3Key 필드에 Amazon S3 버킷 이름과 .zip 파일 이름을 입력합니다.

  • Runtime - 선택한 런타임으로 설정됨

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

종속 항목을 위한 Go 계층 생성

참고

계층을 Go와 같은 컴파일된 언어의 함수와 함께 사용하면 Python과 같은 해석된 언어의 함수와 함께 사용할 때와 같은 이점을 얻지 못할 수 있습니다. Go는 컴파일된 언어이므로 함수가 초기화 단계에서 수동으로 공유 어셈블리를 메모리로 로드해야 하기 때문에 콜드 시간 시간이 늘어날 수 있습니다. 대신 컴파일 시간에 모든 공유 코드를 포함하여 기본 제공 최적화를 활용하는 것이 좋습니다.

이 섹션의 지침은 계층에 종속 항목을 포함하는 방법을 보여줍니다.

또한 Lambda는 /opt/lib 디렉터리의 모든 라이브러리와 /opt/bin 디렉터리의 모든 바이너리를 자동으로 감지합니다. Lambda가 계층 콘텐츠를 제대로 찾을 수 있도록 다음 구조로 계층을 생성하세요.

custom-layer.zip └ lib | lib_1 | lib_2 └ bin | bin_1 | bin_2

계층을 패키징한 후 Lambda에서 계층 생성 및 삭제함수에 계층 추가을 참조하여 계층 설정을 완료합니다.