컨테이너 이미지로 Go Lambda 함수 배포

컨테이너 이미지로 Go Lambda 함수 배포

Go Lambda 함수용 컨테이너 이미지를 빌드하는 방법은 두 가지가 있어요:

  • AWS OS 전용 기본 이미지 사용

    Go는 다른 관리형 런타임과 다르게 구현돼요. Go는 네이티브로 실행 가능한 바이너리로 컴파일되기 때문에 전용 언어 런타임이 필요 없죠. Go 이미지를 Lambda용으로 빌드하려면 OS 전용 기본 이미지를 사용하세요. 이미지를 Lambda와 호환되게 만들려면 이미지에 aws-lambda-go/lambda 패키지를 포함해야 해요.

  • AWS가 아닌 기본 이미지 사용

    Alpine Linux나 Debian 같은 다른 컨테이너 레지스트리의 대체 기본 이미지를 사용할 수 있어요. 조직에서 만든 커스텀 이미지도 쓸 수 있죠. 이미지를 Lambda와 호환되게 만들려면 이미지에 aws-lambda-go/lambda 패키지를 포함해야 합니다.

팁
Lambda 컨테이너 함수가 활성화되는 데 걸리는 시간을 줄이려면 Docker 문서의 멀티 스테이지 빌드 사용을 참고하세요. 효율적인 컨테이너 이미지를 빌드하려면 Dockerfile 작성 모범 사례를 따르세요.

이 페이지는 Lambda용 컨테이너 이미지를 빌드·테스트·배포하는 방법을 설명해요.

출처: AWS Lambda 개발자 안내서

본문

Go 함수 배포를 위한 AWS 기본 이미지

Go는 다른 관리형 런타임과 다르게 구현돼요. Go는 네이티브로 실행 가능한 바이너리로 컴파일되기 때문에 전용 언어 런타임이 필요 없죠. Go 함수를 Lambda에 배포하려면 OS 전용 기본 이미지를 사용하세요.

이름 식별자 운영 체제 폐기 예정일 함수 생성 차단 함수 업데이트 차단
OS-only Runtime provided.al2023 Amazon Linux 2023 2029년 6월 30일 2029년 7월 31일 2029년 8월 31일

Amazon Elastic Container Registry Public Gallery: gallery.ecr.aws/lambda/provided

Go 런타임 인터페이스 클라이언트

aws-lambda-go/lambda 패키지에는 런타임 인터페이스 구현이 포함돼 있어요. 이미지에서 aws-lambda-go/lambda를 사용하는 예제는 AWS OS 전용 기본 이미지 사용 또는 AWS가 아닌 기본 이미지 사용을 참고하세요.

AWS OS 전용 기본 이미지 사용

Go는 다른 관리형 런타임과 다르게 구현돼요. Go는 네이티브로 실행 가능한 바이너리로 컴파일되기 때문에 전용 언어 런타임이 필요 없죠. Go 함수용 컨테이너 이미지를 빌드하려면 OS 전용 기본 이미지를 사용하세요.

태그 런타임 운영 체제 Dockerfile 폐기
al2023 OS-only Runtime Amazon Linux 2023 GitHub의 OS 전용 런타임 Dockerfile 2029년 6월 30일

이 기본 이미지에 대한 자세한 내용은 Amazon ECR public gallery의 provided를 참고하세요.

Go 핸들러에 aws-lambda-go/lambda 패키지를 포함해야 해요. 이 패키지는 런타임 인터페이스를 포함한 Go 프로그래밍 모델을 구현해요.

사전 요구 사항

이 섹션의 단계를 완료하려면 다음이 필요해요:

provided.al2023 기본 이미지에서 이미지 만들기

provided.al2023 기본 이미지로 Go 함수 빌드·배포하기

  1. 프로젝트용 디렉토리를 만들고 그 디렉토리로 이동합니다.

    mkdir hello
    cd hello
    
  2. 새 Go 모듈을 초기화합니다.

    go mod init {{example.com/hello-world}}
    
  3. 새 모듈의 의존성으로 lambda 라이브러리를 추가합니다.

    go get github.com/aws/aws-lambda-go/lambda
    
  4. main.go라는 파일을 만들고 텍스트 편집기로 엽니다. 이는 Lambda 함수 코드예요. 테스트용으로 다음 샘플 코드를 사용하거나 여러분의 코드로 바꿀 수 있어요.

    package main
    
    import (
    	"context"
    	"github.com/aws/aws-lambda-go/events"
    	"github.com/aws/aws-lambda-go/lambda"
    )
    
    func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    	response := events.APIGatewayProxyResponse{
    		StatusCode: 200,
    		Body:       "\"Hello from Lambda!\"",
    	}
    	return response, nil
    }
    
    func main() {
    	lambda.Start(handler)
    }
    
  5. 텍스트 편집기를 사용해 프로젝트 디렉토리에 Dockerfile을 만듭니다.

    • 다음 예제 Dockerfile은 Docker 문서 웹사이트의 멀티 스테이지 빌드를 사용해요. 멀티 스테이지 빌드에서는 각 단계에서 서로 다른 기본 이미지를 사용할 수 있죠. Docker Hub의 Go 기본 이미지 같은 이미지 하나로 코드를 컴파일하고 실행 바이너리를 만들 수 있어요. 그런 다음 provided.al2023 같은 다른 이미지를 마지막 FROM 문에서 사용해 Lambda에 배포할 이미지를 정의하죠. 멀티 스테이지 빌드는 빌드 과정을 최종 배포 이미지와 분리하므로, 최종 이미지에는 애플리케이션을 실행하는 데 필요한 파일만 들어 있습니다.
    • 선택적으로 lambda.norpc 태그를 사용해 lambda 라이브러리의 RPC(Remote Procedure Call) 구성 요소를 제외할 수 있어요. RPC 구성 요소는 폐기된 Go 1.x 런타임을 사용할 때만 필요하죠. RPC를 제외하면 배포 패키지 크기가 줄어듭니다.
    • 예제 Dockerfile에는 USER 지시문이 없다는 점에 주의하세요. 컨테이너 이미지를 Lambda에 배포하면 Lambda가 최소 권한을 가진 기본 Linux 사용자를 자동으로 정의해요. 이는 USER 지시문이 없을 때 root 사용자로 기본 설정되는 표준 Docker 동작과는 다릅니다.
      예제 — 멀티 스테이지 빌드 Dockerfile
      참고
      Dockerfile에 지정하는 Go 버전(예: golang:1.20)이 애플리케이션을 만드는 데 사용한 Go 버전과 같은지 확인하세요.
    FROM {{golang:1.20}} as build
    WORKDIR /helloworld
    # Copy dependencies list
    COPY go.mod go.sum ./
    # Build with optional lambda.norpc tag
    COPY main.go .
    RUN go build {{-tags lambda.norpc}} -o main main.go
    # Copy artifacts to a clean image
    FROM {{public.ecr.aws/lambda/provided:al2023}}
    COPY --from=build /helloworld/main ./main
    ENTRYPOINT [ "./main" ]
    
  6. docker build 명령으로 Docker 이미지를 빌드합니다. 다음 예제는 이미지 이름을 docker-image로 지정하고 test 태그를 붙여요. 이미지를 Lambda와 호환되게 만들려면 --provenance=false 옵션을 사용해야 합니다.

    docker buildx build --platform linux/amd64 --provenance=false -t {{docker-image}}:{{test}} .
    

참고
이 명령은 빌드 머신의 아키텍처와 관계없이 컨테이너가 Lambda 실행 환경과 호환되도록 --platform linux/amd64 옵션을 지정해요. ARM64 명령어 세트 아키텍처를 사용하는 Lambda 함수를 만들려면 명령에서 --platform linux/arm64 옵션을 대신 사용하도록 변경하세요.

(선택 사항) 로컬에서 이미지 테스트

런타임 인터페이스 에뮬레이터를 사용해 로컬에서 이미지를 테스트해 보세요. 런타임 인터페이스 에뮬레이터는 provided.al2023 기본 이미지에 포함되어 있어요.

로컬 머신에서 런타임 인터페이스 에뮬레이터 실행하기

  1. docker run 명령으로 Docker 이미지를 시작합니다. 다음을 참고하세요:

    • docker-image는 이미지 이름이고 test는 태그예요.
    • ./main은 Dockerfile의 ENTRYPOINT예요.
    docker run -d -p 9000:8080 \
    --entrypoint /usr/local/bin/aws-lambda-rie \
    {{docker-image:test ./main}}
    

    이 명령은 이미지를 컨테이너로 실행하고 localhost:9000/2015-03-31/functions/function/invocations에 로컬 엔드포인트를 만듭니다.

  2. 새 터미널 창에서 curl 명령으로 다음 엔드포인트에 이벤트를 게시합니다:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
    

    이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 일부 함수는 JSON 페이로드가 필요할 수 있습니다. 예:

    curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{{{"payload":"hello world!"}}}'
    
  3. 컨테이너 ID를 가져옵니다.

    docker ps
    
  4. docker kill 명령으로 컨테이너를 중지합니다. 이 명령에서 3766c4ab331c를 이전 단계의 컨테이너 ID로 바꾸세요.

    docker kill {{3766c4ab331c}}
    

이미지 배포

이미지를 Amazon ECR에 업로드하고 Lambda 함수 만들기

  1. get-login-password 명령을 실행해 Docker CLI를 Amazon ECR 레지스트리에 인증합니다.

    • --region 값을 Amazon ECR 저장소를 만들 AWS 리전으로 설정합니다.
    • 111122223333을 여러분의 AWS 계정 ID로 바꿉니다.
    aws ecr get-login-password --region {{us-east-1}} | docker login --username AWS --password-stdin {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com
    
  2. create-repository 명령으로 Amazon ECR에 저장소를 만듭니다.

    aws ecr create-repository --repository-name {{hello-world}} --region {{us-east-1}} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    

참고
Amazon ECR 저장소는 Lambda 함수와 같은 AWS 리전에 있어야 합니다.

성공하면 다음과 같은 응답이 보일 거예요:

{
    "repository": {
        "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
        "registryId": "111122223333",
        "repositoryName": "hello-world",
        "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
        "createdAt": "2023-03-09T10:39:01+00:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}
  1. 이전 단계 출력에서 repositoryUri를 복사합니다.

  2. docker tag 명령으로 로컬 이미지를 최신 버전으로 Amazon ECR 저장소에 태그합니다. 이 명령에서:

    • docker-image:test는 Docker 이미지의 이름과 태그예요. docker build 명령에서 지정한 이미지 이름과 태그죠.
    • <ECRrepositoryUri>를 복사한 repositoryUri로 바꿉니다. URI 끝에 :latest를 포함해야 해요.
    docker tag docker-image:test {{<ECRrepositoryUri>}}:latest
    

    예:

    docker tag {{docker-image}}:{{test}} {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
    
  3. docker push 명령으로 로컬 이미지를 Amazon ECR 저장소에 배포합니다. 저장소 URI 끝에 :latest를 포함해야 해요.

    docker push {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
    
  4. 함수용 실행 역할을 아직 만들지 않았다면 만듭니다. 다음 단계에서 역할의 Amazon Resource Name(ARN)이 필요해요.

  5. Lambda 함수를 만듭니다. ImageUri에는 이전의 저장소 URI를 지정하세요. URI 끝에 :latest를 포함해야 해요.

    aws lambda create-function \
      --function-name {{hello-world}} \
      --package-type Image \
      --code ImageUri={{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest \
      --role {{arn:aws:iam::111122223333:role/lambda-ex}}
    

참고
이미지가 Lambda 함수와 같은 리전에 있다면 다른 AWS 계정의 이미지로도 함수를 만들 수 있어요. 자세한 내용은 Amazon ECR 교차 계정 권한을 참고하세요.

  1. 함수를 호출합니다.

    aws lambda invoke --function-name {{hello-world}} response.json
    

    다음과 같은 응답이 보일 거예요:

    {
      "ExecutedVersion": "$LATEST", 
      "StatusCode": 200
    }
    
  2. 함수의 출력을 보려면 response.json 파일을 확인합니다.

함수 코드를 업데이트하려면 이미지를 다시 빌드하고 새 이미지를 Amazon ECR 저장소에 업로드한 뒤 update-function-code 명령으로 이미지를 Lambda 함수에 배포해야 해요.

Lambda는 이미지 태그를 특정 이미지 다이제스트(digest)로 resolve해요. 즉 함수 배포에 사용한 이미지 태그를 Amazon ECR의 새 이미지로 가리켜도 Lambda는 함수를 새 이미지로 자동 업데이트하지 않아요.

새 이미지를 같은 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 그대로여도 update-function-code 명령을 사용해야 해요. 다음 예제에서 --publish 옵션은 업데이트된 컨테이너 이미지를 사용해 함수의 새 버전을 만들어요.

aws lambda update-function-code \
  --function-name {{hello-world}} \
  --image-uri {{111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest}} \
  --publish

AWS가 아닌 기본 이미지 사용

AWS가 아닌 기본 이미지로 Go용 컨테이너 이미지를 빌드할 수 있어요. 다음 단계의 예제 Dockerfile은 Alpine 기본 이미지를 사용합니다.

Go 핸들러에 aws-lambda-go/lambda 패키지를 포함해야 해요. 이 패키지는 런타임 인터페이스를 포함한 Go 프로그래밍 모델을 구현해요.

사전 요구 사항

이 섹션의 단계를 완료하려면 다음이 필요해요:

대체 기본 이미지에서 이미지 만들기

Alpine 기본 이미지로 Go 함수 빌드·배포하기

  1. 프로젝트용 디렉토리를 만들고 그 디렉토리로 이동합니다.

    mkdir hello
    cd hello
    
  2. 새 Go 모듈을 초기화합니다.

    go mod init {{example.com/hello-world}}
    
  3. 새 모듈의 의존성으로 lambda 라이브러리를 추가합니다.

    go get github.com/aws/aws-lambda-go/lambda
    
  4. main.go라는 파일을 만들고 텍스트 편집기로 엽니다. 이는 Lambda 함수 코드예요. 테스트용으로 다음 샘플 코드를 사용하거나 여러분의 코드로 바꿀 수 있어요.

    package main
    
    import (
    	"context"
    	"github.com/aws/aws-lambda-go/events"
    	"github.com/aws/aws-lambda-go/lambda"
    )
    
    func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    	response := events.APIGatewayProxyResponse{
    		StatusCode: 200,
    		Body:       "\"Hello from Lambda!\"",
    	}
    	return response, nil
    }
    
    func main() {
    	lambda.Start(handler)
    }
    
  5. 텍스트 편집기를 사용해 프로젝트 디렉토리에 Dockerfile을 만듭니다. 다음 예제 Dockerfile은 Alpine 기본 이미지를 사용해요. 예제 Dockerfile에는 USER 지시문이 없다는 점에 주의하세요. 컨테이너 이미지를 Lambda에 배포하면 Lambda가 최소 권한을 가진 기본 Linux 사용자를 자동으로 정의해요. 이는 USER 지시문이 없을 때 root 사용자로 기본 설정되는 표준 Docker 동작과는 다릅니다.
    예제 Dockerfile
    참고
    Dockerfile에 지정하는 Go 버전(예: golang:1.20)이 애플리케이션을 만드는 데 사용한 Go 버전과 같은지 확인하세요.

    FROM golang:1.20.2-alpine3.16 as build
    WORKDIR /helloworld
    # Copy dependencies list
    COPY go.mod go.sum ./
    # Build
    COPY main.go .
    RUN go build -o main main.go
    # Copy artifacts to a clean image
    FROM alpine:3.16
    COPY --from=build /helloworld/main /main
    ENTRYPOINT [ "/main" ]
    
  6. docker build 명령으로 Docker 이미지를 빌드합니다. 다음 예제는 이미지 이름을 docker-image로 지정하고 test 태그를 붙여요. 이미지를 Lambda와 호환되게 만들려면 --provenance=false 옵션을 사용해야 합니다.

    docker buildx build --platform linux/amd64 --provenance=false -t {{docker-image}}:{{test}} .
    

참고
이 명령은 빌드 머신의 아키텍처와 관계없이 컨테이너가 Lambda 실행 환경과 호환되도록 --platform linux/amd64 옵션을 지정해요. ARM64 명령어 세트 아키텍처를 사용하는 Lambda 함수를 만들려면 명령에서 --platform linux/arm64 옵션을 대신 사용하도록 변경하세요.

(선택 사항) 로컬에서 이미지 테스트

런타임 인터페이스 에뮬레이터를 사용해 로컬에서 이미지를 테스트해 보세요. 에뮬레이터를 이미지에 빌드하거나 다음 절차로 로컬 머신에 설치할 수 있어요.

로컬 머신에서 런타임 인터페이스 에뮬레이터 설치·실행하기

  1. 프로젝트 디렉토리에서 다음 명령을 실행해 GitHub에서 런타임 인터페이스 에뮬레이터(x86-64 아키텍처)를 다운로드하고 로컬 머신에 설치합니다.

[ Linux/macOS ]

mkdir -p ~/.aws-lambda-rie && \
    curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
    chmod +x ~/.aws-lambda-rie/aws-lambda-rie

arm64 에뮬레이터를 설치하려면 이전 명령의 GitHub 저장소 URL을 다음으로 바꾸세요:

https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64

[ PowerShell ]

$dirPath = "$HOME\.aws-lambda-rie"
if (-not (Test-Path $dirPath)) {
    New-Item -Path $dirPath -ItemType Directory
}
      
$downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
$destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath

arm64 에뮬레이터를 설치하려면 $downloadLink를 다음으로 바꾸세요:

https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64

  1. docker run 명령으로 Docker 이미지를 시작합니다. 다음을 참고하세요:
    • docker-image는 이미지 이름이고 test는 태그예요.
    • /main은 Dockerfile의 ENTRYPOINT예요.

[ Linux/macOS ]

docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
    --entrypoint /aws-lambda/aws-lambda-rie \
    {{docker-image:test}} \
        {{/main}}

[ PowerShell ]

docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
--entrypoint /aws-lambda/aws-lambda-rie `
{{docker-image:test}} `
    {{/main}}

이 명령은 이미지를 컨테이너로 실행하고 localhost:9000/2015-03-31/functions/function/invocations에 로컬 엔드포인트를 만듭니다. 참고
ARM64 명령어 세트 아키텍처용 Docker 이미지를 빌드했다면 --platform linux/{{amd64}} 대신 --platform linux/{{arm64}} 옵션을 사용해야 해요.

  1. 로컬 엔드포인트에 이벤트를 게시합니다.

[ Linux/macOS ]

Linux와 macOS에서는 다음 curl 명령을 실행합니다:

curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 샘플 함수 코드 대신 여러분의 함수 코드를 쓴다면 JSON 페이로드로 함수를 호출하고 싶을 수도 있어요. 예:

curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{{{"payload":"hello world!"}}}'

[ PowerShell ]

PowerShell에서는 다음 Invoke-WebRequest 명령을 실행합니다:

Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"

이 명령은 빈 이벤트로 함수를 호출하고 응답을 반환해요. 샘플 함수 코드 대신 여러분의 함수 코드를 쓴다면 JSON 페이로드로 함수를 호출하고 싶을 수도 있어요. 예:

Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{{{"payload":"hello world!"}}}' -ContentType "application/json"

  1. 컨테이너 ID를 가져옵니다.

    docker ps
    
  2. docker kill 명령으로 컨테이너를 중지합니다. 이 명령에서 3766c4ab331c를 이전 단계의 컨테이너 ID로 바꾸세요.

    docker kill {{3766c4ab331c}}
    

이미지 배포

이미지를 Amazon ECR에 업로드하고 Lambda 함수 만들기

  1. get-login-password 명령을 실행해 Docker CLI를 Amazon ECR 레지스트리에 인증합니다.

    • --region 값을 Amazon ECR 저장소를 만들 AWS 리전으로 설정합니다.
    • 111122223333을 여러분의 AWS 계정 ID로 바꿉니다.
    aws ecr get-login-password --region {{us-east-1}} | docker login --username AWS --password-stdin {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com
    
  2. create-repository 명령으로 Amazon ECR에 저장소를 만듭니다.

    aws ecr create-repository --repository-name {{hello-world}} --region {{us-east-1}} --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
    

참고
Amazon ECR 저장소는 Lambda 함수와 같은 AWS 리전에 있어야 합니다.

성공하면 다음과 같은 응답이 보일 거예요:

{
    "repository": {
        "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
        "registryId": "111122223333",
        "repositoryName": "hello-world",
        "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
        "createdAt": "2023-03-09T10:39:01+00:00",
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}
  1. 이전 단계 출력에서 repositoryUri를 복사합니다.

  2. docker tag 명령으로 로컬 이미지를 최신 버전으로 Amazon ECR 저장소에 태그합니다. 이 명령에서:

    • docker-image:test는 Docker 이미지의 이름과 태그예요. docker build 명령에서 지정한 이미지 이름과 태그죠.
    • <ECRrepositoryUri>를 복사한 repositoryUri로 바꿉니다. URI 끝에 :latest를 포함해야 해요.
    docker tag docker-image:test {{<ECRrepositoryUri>}}:latest
    

    예:

    docker tag {{docker-image}}:{{test}} {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
    
  3. docker push 명령으로 로컬 이미지를 Amazon ECR 저장소에 배포합니다. 저장소 URI 끝에 :latest를 포함해야 해요.

    docker push {{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest
    
  4. 함수용 실행 역할을 아직 만들지 않았다면 만듭니다. 다음 단계에서 역할의 Amazon Resource Name(ARN)이 필요해요.

  5. Lambda 함수를 만듭니다. ImageUri에는 이전의 저장소 URI를 지정하세요. URI 끝에 :latest를 포함해야 해요.

    aws lambda create-function \
      --function-name {{hello-world}} \
      --package-type Image \
      --code ImageUri={{111122223333}}.dkr.ecr.{{us-east-1}}.amazonaws.com/{{hello-world}}:latest \
      --role {{arn:aws:iam::111122223333:role/lambda-ex}}
    

참고
이미지가 Lambda 함수와 같은 리전에 있다면 다른 AWS 계정의 이미지로도 함수를 만들 수 있어요. 자세한 내용은 Amazon ECR 교차 계정 권한을 참고하세요.

  1. 함수를 호출합니다.

    aws lambda invoke --function-name {{hello-world}} response.json
    

    다음과 같은 응답이 보일 거예요:

    {
      "ExecutedVersion": "$LATEST", 
      "StatusCode": 200
    }
    
  2. 함수의 출력을 보려면 response.json 파일을 확인합니다.

함수 코드를 업데이트하려면 이미지를 다시 빌드하고 새 이미지를 Amazon ECR 저장소에 업로드한 뒤 update-function-code 명령으로 이미지를 Lambda 함수에 배포해야 해요.

Lambda는 이미지 태그를 특정 이미지 다이제스트(digest)로 resolve해요. 즉 함수 배포에 사용한 이미지 태그를 Amazon ECR의 새 이미지로 가리켜도 Lambda는 함수를 새 이미지로 자동 업데이트하지 않아요.

새 이미지를 같은 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 그대로여도 update-function-code 명령을 사용해야 해요. 다음 예제에서 --publish 옵션은 업데이트된 컨테이너 이미지를 사용해 함수의 새 버전을 만들어요.

aws lambda update-function-code \
  --function-name {{hello-world}} \
  --image-uri {{111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest}} \
  --publish

더 알아보기 (Learn more)

  • AWS OS 전용 기본 이미지와 비-AWS 기본 이미지로 Go 컨테이너 이미지를 빌드하고, 로컬 테스트 후 Amazon ECR에 업로드해 Lambda 함수를 배포하는 흐름을 다뤄 보세요.