AWS Lambda 환경 변수 사용 - AWS Lambda

AWS Lambda 환경 변수 사용

환경 변수를 사용하면 코드를 업데이트하지 않고도 함수의 동작을 조정할 수 있습니다. 환경 변수는 함수의 버전별 구성에 저장된 문자열 쌍입니다. Lambda 런타임은 코드에서 환경 변수를 사용할 수 있게 하고 함수 및 호출 요청에 대한 정보가 포함된 추가 환경 변수를 설정합니다.

참고

데이터베이스 보안을 강화하려면 환경 변수 대신 AWS Secrets Manager을 사용하여 데이터베이스 자격 증명을 저장하는 것이 좋습니다. 자세한 내용은 Lambda 함수에 대한 데이터베이스 액세스 구성을 참조하십시오.

키와 값을 지정하여 게시되지 않은 버전의 함수에 대한 환경 변수를 설정합니다. 버전을 게시할 때 환경 변수는 다른 버전별 구성과 함께 해당 버전에 대해 잠금 상태가 됩니다.

Lambda 콘솔에서 환경 변수를 설정하려면

  1. Lambda 콘솔의 함수 페이지(Functions page)를 엽니다.

  2. 함수를 선택합니다.

  3. Environment variables(환경 변수)에서 편집을 선택합니다.

  4. Add environment variable(환경 변수 추가)을 선택합니다.

  5. 키와 값을 입력합니다.

    요구 사항

    • 키는 문자로 시작되며 최소 2자입니다.

    • 키에는 문자, 숫자 및 밑줄(_)만 포함됩니다.

    • 키는 Lambda에 의해 예약되지 않습니다.

    • 모든 환경 변수의 총 크기는 4KB를 초과하지 않습니다.

  6. 저장을 선택합니다.

환경 변수를 사용하여 환경별 설정을 코드에 전달합니다. 예를 들어, 코드는 같지만 구성이 다른 두 개의 함수를 가질 수 있습니다. 한 함수는 테스트 데이터베이스에 연결되고, 다른 함수는 프로덕션 데이터베이스에 연결됩니다. 이 경우 환경 변수를 사용하여 데이터베이스에 대한 호스트 이름 및 기타 연결 세부 정보를 함수에 알립니다.

다음 예는 환경 변수로 데이터베이스 호스트 및 데이터베이스 이름을 정의하는 방법을 보여줍니다.


      Lambda 콘솔의 환경 변수.

테스트 환경에서 프로덕션 환경보다 더 많은 디버그 정보를 생성하도록 하려면 환경 변수를 설정하여 더 많은 상세 표시 로깅 또는 더 자세한 추적을 사용하도록 테스트 환경을 구성하면 됩니다.

참고

환경 변수는 함수 호출 전에 평가되지 않습니다. 정의한 모든 값은 리터럴 문자열로 간주되며 확장되지 않습니다. 함수 코드에서 변수 평가를 수행합니다.

함수 코드에서 환경 변수를 검색하려면 프로그래밍 언어에 대한 표준 메서드를 사용합니다.

Node.js
let region = process.env.AWS_REGION
Python
import os region = os.environ['AWS_REGION']
참고

경우에 따라 다음 형식을 사용해야 할 수 있습니다.

region = os.environ.get('AWS_REGION')
Ruby
region = ENV["AWS_REGION"]
Java
String region = System.getenv("AWS_REGION");
Go
var region = os.Getenv("AWS_REGION")
C#
string region = Environment.GetEnvironmentVariable("AWS_REGION");
PowerShell
$region = $env:AWS_REGION

Lambda는 저장 시 환경 변수를 암호화하여 안전하게 저장합니다. 다른 암호화 키를 사용하도록 Lambda를 구성하거나, 클라이언트 측의 환경 변수 값을 암호화하거나, AWS Secrets Manager를 사용해 AWS CloudFormation 템플릿에서 환경 변수를 설정할 수 있습니다.

런타임 환경 변수

Lambda 런타임은 초기화 중에 여러 환경 변수를 설정합니다. 대부분의 환경 변수는 함수 또는 런타임에 관한 정보를 제공합니다. 이러한 환경 변수의 키는 예약되어 있으며 함수 구성에서 설정할 수 없습니다.

예약된 환경 변수

  • _HANDLER – 함수에 대해 구성된 핸들러 위치입니다.

  • _X_AMZN_TRACE_IDX-Ray 추적 헤더입니다.

  • AWS_REGION – Lambda 함수가 실행되는 AWS 리전입니다.

  • AWS_EXECUTION_ENV런타임 ID이며 앞에 AWS_Lambda_가 붙습니다(예: AWS_Lambda_java8).

  • AWS_LAMBDA_FUNCTION_NAME – 함수의 이름입니다.

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE – 함수에 사용 가능한 총 메모리 양(MB)입니다.

  • AWS_LAMBDA_FUNCTION_VERSION – 실행할 함수의 버전입니다.

  • AWS_LAMBDA_LOG_GROUP_NAME, AWS_LAMBDA_LOG_STREAM_NAME – 함수의 Amazon CloudWatch Logs 그룹 및 스트림 이름입니다.

  • AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, – 함수의 실행 역할에서 가져온 액세스 키입니다.

  • AWS_LAMBDA_RUNTIME_API – (사용자 지정 런타임) 런타임 API의 호스트 및 포트입니다.

  • LAMBDA_TASK_ROOT – Lambda 함수 코드의 경로입니다.

  • LAMBDA_RUNTIME_DIR – 런타임 라이브러리의 경로입니다.

  • TZ – 환경의 표준 시간대(UTC)입니다. 실행 환경에서는 NTP를 사용하여 시스템 클록을 동기화합니다.

다음 추가 환경 변수는 예약되어 있지 않으며 함수 구성에서 확장할 수 있습니다.

예약되지 않은 환경 변수

  • LANG – 이것은 런타임의 로캘입니다(en_US.UTF-8).

  • PATH – 실행 경로(/usr/local/bin:/usr/bin/:/bin:/opt/bin)입니다.

  • LD_LIBRARY_PATH – 시스템 라이브러리 경로(/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib)입니다.

  • NODE_PATH – (Node.js) Node.js 라이브러리 경로(/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules)입니다.

  • PYTHONPATH – (Python 2.7, 3.6, 3.8) Python 라이브러리 경로($LAMBDA_RUNTIME_DIR)입니다.

  • GEM_PATH – (Ruby) Ruby 라이브러리 경로($LAMBDA_TASK_ROOT/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0)입니다.

  • AWS_XRAY_CONTEXT_MISSING – X-Ray 추적의 경우 Lambda는 X-Ray SDK에서 런타임 오류가 발생하지 않도록 LOG_ERROR로 설정합니다.

  • AWS_XRAY_DAEMON_ADDRESS – X-Ray 추적의 경우 X-Ray 데몬의 포트 및 IP 주소입니다.

표시된 샘플 값은 최신 런타임을 반영합니다. 특정 변수 또는 해당 값의 존재는 이전 런타임에 따라 다를 수 있습니다.

환경 변수 보호

Lambda는 계정에서 생성한 키(AWS 관리형 고객 마스터 키(CMK))로 환경 변수를 암호화합니다. 이 키의 사용은 무료입니다. 기본 키 대신에 사용할 Lambda에 자체 키를 제공하는 방법을 선택할 수도 있습니다.

키를 제공하면 키에 대한 액세스 권한이 있는 계정의 사용자만 함수에서 환경 변수를 보거나 관리할 수 있습니다. 또한 조직이 암호화에 사용되는 키를 관리하고 교체 시기를 제어해야 하는 내부 또는 외부 요구 사항을 가질 수 있습니다.

고객 관리형 CMK를 사용하려면

  1. Lambda 콘솔의 함수 페이지(Functions page)를 엽니다.

  2. 함수를 선택합니다.

  3. Environment variables(환경 변수)에서 편집을 선택합니다.

  4. Encryption configuration(암호화 구성)을 확장합니다.

  5. 고객 마스터 키 사용을 선택합니다.

  6. 고객 관리형 CMK를 선택합니다.

  7. 저장을 선택합니다.

고객 관리형 CMK에는 표준 AWS KMS 요금이 발생합니다.

사용자 또는 함수의 실행 역할에 대한 AWS KMS 권한 없이도 기본 암호화 키를 사용할 수 있습니다. 고객 관리형 CMK를 사용하려면 키 사용 권한이 필요합니다. Lambda는 이러한 권한을 사용하여 키에 대한 권한 부여를 생성합니다. 이를 통해 Lambda가 암호화에 해당 키를 사용할 수 있습니다.

  • kms:ListAliases – Lambda 콘솔에서 키 보기.

  • kms:CreateGrant, kms:Encrypt – 함수에 대한 고객 관리형 CMK 구성하기.

  • kms:Decrypt – 고객 관리형 CMK로 암호화된 환경 변수를 보고 관리하기.

사용자 계정 또는 키의 리소스 기반 권한 정책에서 이러한 권한을 얻을 수 있습니다. ListAliasesLambda의 관리형 정책이 제공됩니다. 키 정책에 따라 키 사용자 그룹의 사용자는 나머지 권한을 받습니다.

Decrypt 권한이 없는 사용자도 기능을 관리할 수 있지만 Lambda 콘솔에서 환경 변수를 보거나 관리할 수는 없습니다. 사용자가 환경 변수를 볼 수 없도록 하려면 기본 키, 고객 관리형 키 또는 모든 키에 대한 액세스를 거부하는 사용자 권한에 문을 추가합니다.

예 IAM 정책 – 키 ARN별 액세스 거부

{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc" } ] }

        Lambda 콘솔에서 암호 해독 권한이 없는 사용자에 대한 오류 메시지입니다.

키 권한 관리에 대한 자세한 내용은 AWS KMS의 키 정책 사용을 참조하십시오.

또한 환경 변수 값을 Lambda로 보내기 전에 클라이언트 측에서 암호화하고 함수 코드에서 암호화를 해제할 수 있습니다. 이렇게 하면 키를 사용할 권한이 있는 사용자의 경우에도 Lambda 콘솔 및 API 출력에서 암호 값이 가려집니다. 코드에서 암호화된 값을 환경에서 검색하고 AWS KMS API를 사용하여 암호화를 해제합니다.

클라이언트 측에서 환경 변수를 암호화하려면

  1. Lambda 콘솔의 함수 페이지(Functions page)를 엽니다.

  2. 함수를 선택합니다.

  3. Environment variables(환경 변수)에서 편집을 선택합니다.

  4. Encryption configuration(암호화 구성)을 확장합니다.

  5. Enable helpers for encryption in transit(전송 중 암호화에 대해 도우미 사용)를 선택합니다.

  6. 변수 옆에 있는 암호화를 선택하여 값을 암호화합니다.

  7. 저장을 선택합니다.

참고

콘솔 암호화 도우미를 사용하는 경우 함수는 실행 역할에서 kms:Decrypt API 작업을 호출할 수 있는 권한이 필요합니다.

함수의 언어에 대한 샘플 코드를 보려면 환경 변수 옆에 있는 코드를 선택합니다. 샘플 코드는 함수에서 환경 변수를 검색하고 해당 값을 암호화 해제하는 방법을 보여 줍니다.

또 다른 옵션은 AWS Secrets Manager 보안 암호에 암호를 저장하는 것입니다. AWS CloudFormation 템플릿의 암호를 참조하여 데이터베이스에 암호를 설정할 수 있습니다. 또한 Lambda 함수에서 환경 변수의 값을 설정할 수 있습니다. 다음 단원의 예제를 참조하십시오.

Lambda API를 사용하여 환경 변수 구성

AWS CLI 또는 AWS SDK를 사용하여 환경 변수를 관리하려면 다음 API 작업을 사용합니다.

다음 예제에서는 my-function라는 함수에서 두 개의 환경 변수를 설정합니다 .

$ aws lambda update-function-configuration --function-name my-function \ --environment "Variables={BUCKET=my-bucket,KEY=file.txt}"

update-function-configuration 명령을 사용하여 환경 변수를 적용하면 Variables 구조의 전체 내용이 바뀝니다. 새 환경 변수를 추가할 때 기존 환경 변수를 유지하려면 요청에 기존 값을 모두 포함시킵니다.

현재 구성을 가져오려면 get-function-configuration 명령을 사용합니다.

$ aws lambda get-function-configuration --function-name my-function { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs12.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Environment": { "Variables": { "BUCKET": "my-bucket", "KEY": "file.txt" } }, "RevisionId": "0894d3c1-2a3d-4d48-bf7f-abade99f3c15", ... }

구성을 읽는 시점과 구성을 업데이트하는 시점 사이에 값이 변경되지 않도록 하기 위해 get-function-configuration의 출력에서 나온 개정 ID를 파라미터로서 update-function-configuration에 전달할 수 있습니다.

함수의 암호화 키를 구성하려면 KMSKeyARN 옵션을 설정합니다.

$ aws lambda update-function-configuration --function-name my-function \ --kms-key-arn arn:aws:kms:us-east-2:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599

샘플 코드 및 템플릿

이 가이드의 GitHub 리포지토리에 있는 샘플 애플리케이션은 함수 코드 및 AWS CloudFormation 템플릿에서 환경 변수를 사용하는 방법을 보여줍니다.

샘플 애플리케이션

  • 빈 함수 – 같은 템플릿에 함수와 Amazon SNS 주제를 생성합니다. 주제 이름을 환경 변수의 함수에 전달합니다. 코드에서 환경 변수를 읽어옵니다(여러 언어).

  • RDS MySQL – VPC와 Amazon RDS DB 인스턴스를 하나의 템플릿에서 생생하고 Secrets Manager에 암호를 저장합니다. 애플리케이션 템플릿에서 VPC 스택에서 데이터베이스 세부 정보를 가져오고 Secrets Manager에서 암호를 읽은 다음, 환경 변수의 함수에 모든 연결 구성을 전달합니다.