컨테이너 이미지로 정의된 함수 생성 - AWS Lambda

컨테이너 이미지로 정의된 함수 생성

이 시작하기 연습에서는 컨테이너 이미지로 정의된 함수를 생성합니다. 먼저 도커 CLI를 사용하여 함수 코드에 대한 컨테이너 이미지를 생성한 다음 Lambda 콘솔을 사용하여 컨테이너 이미지에서 함수를 생성합니다.

Prerequisites

다음 단계를 완료하려면 명령을 실행할 명령줄 터미널 또는 셸이 필요합니다. 명령과 예상 결과는 별도의 블록에 나열됩니다.

aws --version

다음 결과가 표시됩니다:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

긴 명령의 경우 이스케이프 문자(\)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다. Windows 10에서 Linux용 Windows Subsystem을 설치하여 Ubuntu와 Bash의 Windows 통합 버전을 가져옵니다.

이 연습에서는 Docker CLI 명령을 사용하여 컨테이너 이미지를 생성합니다. Docker CLI를 설치하려면 Docker Docs 웹 사이트에서 Get Docker를 참조하세요.

컨테이너 이미지 생성

AWS는 Amazon Elastic Container Registry(Amazon ECR)에서 여러 기본 이미지를 제공합니다. 이 시작하기 연습에서는 Node.js 기본 이미지를 사용하여 컨테이너 이미지를 생성합니다. 기본 이미지에 대한 자세한 내용은 Lambda용 AWS 기본 이미지 단원을 참조하세요.

다음 명령에서 123456789012를 AWS 계정 ID로 바꿉니다.

AWS Node.js 14 기본 이미지를 사용하여 이미지를 생성하려면

  1. 로컬 컴퓨터에서 새 함수에 대한 프로젝트 디렉터리를 생성합니다.

  2. 프로젝트 디렉터리에 app.js라는 파일을 생성합니다. 다음 코드를 app.js에 추가합니다.

    exports.handler = async (event) => { // TODO implement const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!'), }; return response; };
  3. 텍스트 편집기를 사용하여 프로젝트 디렉터리에 Dockerfile이라는 새 파일을 생성합니다. 다음 콘텐츠를 Dockerfile에 추가합니다.

    FROM public.ecr.aws/lambda/nodejs:14 # Copy function code COPY app.js ${LAMBDA_TASK_ROOT} # Set the CMD to your handler CMD [ "app.handler" ]
  4. Docker 이미지를 빌드합니다. 프로젝트 디렉터리에서 다음 명령을 실행합니다.

    docker build -t hello-world .
  5. (선택 사항) AWS 기본 이미지에는 Lambda 런타임 인터페이스 에뮬레이터가 포함되어 있으므로 로컬에서 함수를 테스트할 수 있습니다.

    1. Docker 이미지를 실행합니다. 프로젝트 디렉터리에서 docker run 명령을 실행합니다.

      docker run -p 9000:8080 hello-world:latest
    2. Lambda 함수를 테스트합니다. 새 터미널 창에서 curl 명령을 실행하여 함수를 호출합니다.

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

Amazon ECR 리포지토리에 이미지 업로드

  1. Docker CLI를 Amazon ECR 레지스트리에 인증합니다.

    aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  2. create-repository 명령을 사용하여 Amazon ECR에 리포지토리를 생성합니다.

    aws ecr create-repository --repository-name hello-world --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
  3. docker tag 명령을 사용하여 리포지토리 이름과 일치하도록 이미지에 태그를 지정합니다.

    docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
  4. docker push 명령을 사용하여 Amazon ECR에 이미지를 배포합니다.

    docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest

사용자 권한 업데이트

함수를 생성하는 IAM 사용자 또는 역할에 대한 권한에 AWS 관리형 정책 GetRepositoryPolicySetRepositoryPolicy가 포함되어 있는지 확인합니다. Amazon ECR 리포지토리의 이미지에 액세스할 수 있는 사용자 권한에 대한 내용은 Amazon ECR 권한을 참조하세요.

예를 들어 IAM 콘솔을 사용하여 다음 정책을 포함하는 역할을 생성합니다.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": ["ecr:SetRepositoryPolicy","ecr:GetRepositoryPolicy"], "Resource": "arn:aws:ecr:<region>:<account>:repository/<repo name>/" } ] }

컨테이너 이미지로 정의된 Lambda 함수 생성

Lambda 콘솔을 사용하여 컨테이너 이미지로 정의된 함수를 생성합니다.

콘솔을 사용하여 함수를 생성하려면

  1. Lambda 콘솔에서 함수 페이지를 엽니다.

  2. 함수 생성을 선택합니다.

  3. 컨테이너 이미지(Container image) 옵션을 선택합니다.

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

    1. [함수 이름(Function name)]에 my-function을 입력합니다.

    2. 컨테이너 이미지 URI에 앞서 생성한 Amazon ECR 이미지의 URI를 입력합니다.

  5. 함수 생성을 선택합니다.

Lambda는 사용자의 함수와, 로그 업로드 권한을 함수에 부여하는 실행 역할을 생성합니다. Lambda는 함수가 호출될 때 실행 역할을 맡아 해당 실행 역할을 사용하여 AWS SDK에 대한 자격 증명을 생성하고 이벤트 소스에서 데이터를 읽습니다.

Lambda 함수 호출

콘솔에 제공된 샘플 이벤트 데이터를 사용하여 Lambda 함수를 호출합니다.

함수를 호출하려면

  1. 함수를 선택한 후 테스트(Test) 탭을 선택합니다.

  2. 테스트 이벤트(Test event) 섹션에서 새 이벤트(New event)를 선택합니다. 템플릿(Template)에서 기본 hello-world 옵션을 그대로 둡니다. 해당 테스트의 이름을 입력합니다. 다음의 샘플 이벤트 템플릿에 유의하세요.

    { "key1": "value1", "key2": "value2", "key3": "value3" }
  3. 변경 사항 저장테스트를 차례로 선택합니다. 각 사용자는 함수당 최대 10개의 테스트 이벤트를 생성할 수 있습니다. 이러한 테스트 이벤트는 다른 사용자가 사용할 수 없습니다.

    Lambda가 사용자를 대신하여 함수를 실행합니다. 함수 핸들러가 샘플 이벤트를 수신하여 처리합니다.

  4. 성공적으로 완료되면 콘솔에서 결과를 확인합니다.

    • 실행 결과(Execution result)에 실행 상태가 성공(succeeded)으로 표시됩니다. 함수 실행 결과를 확인하기 위해 세부 정보(Details)를 확장합니다. 로그 링크를 클릭하면 CloudWatch 콘솔에서 로그 그룹 페이지가 열립니다.

    • [Summary] 섹션에 [Log output] 섹션(실행 로그의 REPORT 줄)에 보고된 주요 정보가 표시됩니다.

    • 로그 출력 섹션에 Lambda가 각 호출마다 생성하는 로그가 표시됩니다. 함수는 이러한 로그를 CloudWatch에 기록합니다. Lambda 콘솔은 사용자의 편의를 위해 이러한 로그를 표시합니다. 여기를 클릭을 선택하여 CloudWatch 로그 그룹에 로그를 추가하고 CloudWatch 콘솔에서 로그 그룹 페이지를 엽니다.

  5. 몇 차례 더 함수를 실행(테스트 선택)하여 다음 단계에서 볼 수 있는 몇 가지 지표를 수집합니다.

  6. 모니터링 탭을 선택합니다. 이 페이지에는 Lambda가 CloudWatch로 보내는 지표의 그래프가 표시됩니다.

    이러한 그래프에 대한 자세한 내용은 AWS Lambda 콘솔에서 함수 모니터링 단원을 참조하세요.

정리

컨테이너 이미지를 완료했다면 Amazon Elastic Container Registry 사용 설명서이미지 삭제를 참조하세요.

함수를 사용한 작업이 완료되면 해당 함수를 삭제하세요. 함수의 로그를 저장하는 로그 그룹과 콘솔에서 생성된 실행 역할을 삭제할 수도 있습니다.

Lambda 함수 삭제하기

  1. Lambda 콘솔에서 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 작업(Actions), 삭제(Delete)를 선택합니다.

  4. 함수 삭제(Delete function) 대화 상자에서 삭제(Delete)를 선택합니다.

로그 그룹을 삭제하려면

  1. CloudWatch 콘솔에서 로그 그룹 페이지를 엽니다.

  2. 함수의 로그 그룹(/aws/lambda/my-function)을 선택합니다.

  3. 작업(Actions), 로그 그룹 삭제(Delete log group(s))를 선택합니다.

  4. 로그 그룹 삭제(Delete log group(s)) 대화 상자에서 삭제(Delete)를 선택합니다.

실행 역할을 삭제하려면

  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. 함수의 역할(my-function-role-31exxmpl)을 선택합니다.

  3. 역할 삭제를 선택합니다.

  4. 역할 삭제(Delete role) 대화 상자에서 예, 삭제(Yes, Delete)를 선택합니다.

AWS CloudFormation 및 AWS CLI를 사용하여 함수, 로그 그룹 및 역할의 생성 및 정리를 자동화할 수 있습니다. 완전한 기능을 갖춘 샘플 애플리케이션에 대해서는 Lambda 샘플 애플리케이션 단원을 참조하세요.