Skip to content

Lambda CLI


AWS Command Line Interface를 사용하여 함수 및 기타 AWS Lambda 리소스를 관리할 수 있다. AWS CLI는 AWS SDK for Python (Boto)를 사용하여 Lambda API와 상호 작용한다. 이를 통해 API에 대해 배운 후 그 지식을 바탕으로 AWS SDK에서 Lambda를 사용하는 애플리케이션을 빌드할 수 있다.

이 자습서에서는 AWS CLI를 사용하여 Lambda 함수를 관리하고 호출한다.


1. 사전 조건

이 자습서에서는 사용자가 기본적인 Lambda 작업과 Lambda 콘솔에 대해 어느 정도 알고 있다고 가정한다. 아직 콘솔로 Lambda 함수 생성의 지침을 따르지 않았다면 지금 따른다.

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

aws --version

다음 결과가 표시된다.

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

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

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용한다.

Note

Windows에서는 Lambda와 함께 일반적으로 사용하는 일부 Bash CLI 명령(예:zip)은 운영 체제의 기본 제공 터미널에서 지원되지 않는다. Ubuntu와 Bash의 Windows 통합 버전을 가져오려면 Linux용 Windows Subsystem을 설치한다.

이 자습서에서는 AWS Command Line Interface(AWS CLI)를 사용하여 서비스 API 작업을 호출한다. AWS CLI를 설치하려면 AWS Command Line Interface 사용 설명서의 AWS CLI 설치를 참조한다.


2. 실행 역할 생성

함수에 AWS 리소스에 액세스할 수 있는 권한을 제공하는 실행 역할을 만든다. AWS CLI를 사용하여 실행 역할을 생성하려면 create-role 명령을 사용한다.

다음 예에서는 신뢰 정책 인라인을 지정한다. JSON 문자열의 인용 부호 요구 사항은 셸에 따라 다르다.

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

JSON 파일을 사용하여 역할에 대한 신뢰 정책을 정의할 수도 있다. 다음 예제에서 trust-policy.json은 최신 디렉터리의 파일이다. 이 신뢰 정책을 통해 Lambda는 서비스 보안 주체에 lambda.amazonaws.com 권한을 제공하여 AWS Security Token Service(AWS STS) AssumeRole 작업을 호출하기 위해 역할의 권한을 사용할 수 있다.

예 trust-policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json

다음 결과가 표시된다.

{
    "Role": {
        "Path": "/",
        "RoleName": "lambda-ex",
        "RoleId": "AROAQFOXMPL6TZ6ITKWND",
        "Arn": "arn:aws:iam::123456789012:role/lambda-ex",
        "CreateDate": "2020-01-17T23:19:12Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Action": "sts:AssumeRole"
                }
            ]
        }
    }
}

역할에 권한을 추가하려면 attach-policy-to-role 명령을 사용한다. 먼저 AWSLambdaBasicExecutionRole 관리형 정책을 추가한다.

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

AWSLambdaBasicExecutionRole 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가진다.


3. 함수 생성

다음 예제는 환경 변수의 값과 이벤트 객체를 로깅한다.

예 index.js

exports.handler = async function(event, context) {
  console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2))
  console.log("EVENT\n" + JSON.stringify(event, null, 2))
  return context.logStreamName
}

함수를 만들려면

  1. 샘플 코드를 index.js 파일에 복사한다.

  2. 배포 패키지를 만든다.

    zip function.zip index.js
    
  3. create-function 명령을 사용해 Lambda 함수를 만든다. 역할 ARN에서 강조 표시된 텍스트를 계정 ID로 바꾼다.

    aws lambda create-function --function-name my-function \
    --zip-file fileb://function.zip --handler index.handler --runtime nodejs16.x \
    --role arn:aws:iam::123456789012:role/lambda-ex
    

    다음 결과가 표시된다:

    {
        "FunctionName": "my-function",
        "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
        "Runtime": "nodejs16.x",
        "Role": "arn:aws:iam::123456789012:role/lambda-ex",
        "Handler": "index.handler",
        "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=",
        "Version": "$LATEST",
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff",
        ...
    }
    

명령줄에서 호출에 대한 로그를 가져오려면 --log-type 옵션을 사용한다. 호출에서 base64로 인코딩된 로그를 최대 4KB까지 포함하는 LogResult 필드가 응답에 포함된다.

aws lambda invoke --function-name my-function out --log-type Tail

다음 결과가 표시된다:

{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}

base64 유틸리티를 사용하면 로그를 디코딩할 수 있다.

aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text |  base64 -d

다음 결과가 표시된다:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
  "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB

base64는 Linux, macOS 및 Ubuntu on Windows에서 사용할 수 있다. macOS의 경우, 명령은 base64 -D이다.

명령줄에서 전체 로그 이벤트를 가져오기 위해 앞의 예와 같이 함수 출력에 로그 스트림 이름을 포함할 수 있다. 다음 예제 스크립트는 my-function이라는 함수를 호출하고 마지막 5개 로그 이벤트를 다운로드한다.

예 get-logs.sh 스크립트

이 예에서는 my-function이 로그 스트림 ID를 반환해야 한다.

# !/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5

스크립트는 sed를 사용하여 출력 파일에서 따옴표를 제거하고, 로그를 사용할 수 있는 시간을 허용하기 위해 15초 동안 대기한다. 출력에는 Lambda의 응답과 get-log-events 명령의 출력이 포함된다.

./get-logs.sh

다음 결과가 표시된다.

{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}

4. 함수 업데이트

함수를 만든 후 트리거, 네트워크 액세스, 파일 시스템 액세스와 같은 함수에 대한 추가 기능을 구성할 수 있다. 함수와 관련된 리소스(예: 메모리 및 동시성)를 조정할 수도 있다. 이러한 구성은 .zip 파일 아카이브로 정의된 함수와 컨테이너 이미지로 정의된 함수에 적용된다.

update-function-configuration 명령을 사용하여 함수를 구성한다. 다음 예제에서는 함수 메모리를 256MB로 설정한다.

예 update-function-configuration 명령

aws lambda update-function-configuration \
--function-name my-function \
--memory-size 256

5. 계정의 Lambda 함수 목록 표시

다음 AWS CLI list-functions 명령을 실행하여, 생성한 함수의 목록을 검색할 수 있다.

aws lambda list-functions --max-items 10

다음 결과가 표시된다:

{
    "Functions": [
        {
            "FunctionName": "cli",
            "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
            "Runtime": "nodejs16.x",
            "Role": "arn:aws:iam::123456789012:role/lambda-ex",
            "Handler": "index.handler",
            ...
        },
        {
            "FunctionName": "random-error",
            "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:random-error",
            "Runtime": "nodejs16.x",
            "Role": "arn:aws:iam::123456789012:role/lambda-role",
            "Handler": "index.handler",
            ...
        },
        ...
      ],
      "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0="
}

응답에서 Lambda는 최대 10개의 함수로 이루어진 목록을 반환한다. 검색할 수 있는 함수가 추가로 있는 경우, NextToken은 다음 list-functions 요청에서 사용할 수 있도록 마커를 제공한다. 다음의 list-functions AWS CLI 명령은 --starting-token 파라미터를 보여주는 예제이다.

aws lambda list-functions --max-items 10 --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=

6. Lambda 함수 검색

Lambda CLI get-function 명령은 함수의 배포 패키지를 다운로드할 때 사용할 수 있도록 Lambda 함수 메타데이터와 미리 서명된 URL을 반환한다.

aws lambda get-function --function-name my-function

다음 결과가 표시된다:

{
    "Configuration": {
        "FunctionName": "my-function",
        "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
        "Runtime": "nodejs16.x",
        "Role": "arn:aws:iam::123456789012:role/lambda-ex",
        "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=",
        "Version": "$LATEST",
        "TracingConfig": {
            "Mode": "PassThrough"
        },
        "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff",
        ...
    },
    "Code": {
        "RepositoryType": "S3",
        "Location": "https://awslambda-us-east-2-tasks.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-function-4203078a-b7c9-4f35-..."
    }
}

자세한 내용은 GetFunction 단원을 참조한다.


7.정리

다음 delete-function 명령을 실행하여 my-function 함수를 삭제한다.

aws lambda delete-function --function-name my-function

IAM 콘솔에서 생성한 IAM 역할을 삭제한다. 역할 삭제에 대한 내용은 IAM 사용 설명서의 역할 또는 인스턴스 프로필 삭제를 참조한다.


References