Lambda 함수에서 Secrets Manager 시크릿 사용

Lambda 함수에서 Secrets Manager 시크릿 사용 (Use Secrets Manager secrets in Lambda functions)

이 페이지는 애플리케이션에서 사용하는 Lambda 함수에서 AWS Secrets Manager 시크릿을 검색하고 사용하는 방법을 보여줍니다. 생성한 함수에서 데이터베이스 자격 증명, API 키, 기타 시크릿을 환경 변수 대신 Secrets Manager 시크릿으로 안전하게 저장할 수 있습니다.

출처: AWS Lambda 개발자 안내서

본문

시크릿 사용 이점

환경 변수 대신 Secrets Manager를 사용하면:

  • 시크릿을 코드에서 분리해 유지하므로 배포 시 실수로 노출되지 않습니다.
  • 자격 증명 회전을 중앙에서 관리할 수 있습니다.
  • 호출 시 최신 시크릿 값을 검색할 수 있습니다.
  • 시크릿 저장 데이터를 AWS KMS로 암호화할 수 있습니다.

보안 시크릿 검색 모범 사례

함수에서 시크릿을 검색하고 사용할 때 다음 모범 사례를 따르세요:

  • 호출당 시크릿을 다시 검색하지 마세요. 시크릿 값을 함수 초기화 단계에서 한 번만 검색해 변수에 저장한 후 재사용하세요. 초기화 단계에서 검색한 시크릿 값은 동일한 실행 환경의 후속 호출에서도 사용할 수 있습니다.
  • 시크릿을 안전하게 저장하세요. 시크릿 값을 함수 코드나 환경 변수에 하드코딩하지 마세요. 검색한 시크릿 값은 함수의 메모리에만 보관하세요.
  • 시크릿을 기록하지 마세요. 시크릿 값이나 전체 시크릿 객체를 로그에 출력하지 마세요.

함수에 Secrets Manager 액세스 권한 부여

함수가 Secrets Manager와 상호작용하려면 실행 역할에 다음 최소 권한이 있어야 합니다:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-secret-*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "arn:aws:kms:us-east-1:123456789012:key/your-KMS-key-id"
        }
    ]
}

시크릿이 AWS KMS 고객 관리형 키로 암호화된 경우 kms:Decrypt 권한이 필요합니다.

콘솔에서 시크릿 만들기

시크릿을 만들려면:

  1. https://console.aws.amazon.com/secretsmanager/ 에서 AWS Secrets Manager 콘솔을 엽니다.
  2. Store a new secret(새 시크릿 저장) 을 선택합니다.
  3. Secret type(시크릿 유형) 에서 자격 증명 유형을 선택합니다. 예를 들어 데이터베이스 자격 증명의 경우 Credentials for Amazon RDS database(RDS 데이터베이스용 자격 증명) 을 선택합니다.
  4. 사용자 이름과 비밀번호를 입력합니다.
  5. 시크릿을 암호화할 KMS 키를 선택합니다(선택 사항).
  6. Secret name(시크릿 이름) 과 설명을 입력합니다.
  7. Store(저장) 를 선택합니다.

시크릿 값을 저장합니다. 나중에 Lambda 함수에서 사용합니다.

Lambda 함수에서 시크릿 검색

다음 코드 예제는 Python 함수에서 시크릿을 검색하고 사용하는 방법을 보여줍니다.

Python:

import json
import boto3
from botocore.exceptions import ClientError

def get_secret():
    secret_name = "my-secret"
    region_name = "us-east-1"

    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        raise e

    # Decrypts secret using the associated KMS key.
    secret = get_secret_value_response['SecretString']
    return json.loads(secret)

def lambda_handler(event, context):
    secret = get_secret()
    username = secret['username']
    password = secret['password']
    # Use the credentials
    return {
        'statusCode': 200,
        'body': 'Successfully retrieved secret'
    }

Node.js:

const { SecretsManagerClient, GetSecretValueCommand } = require("@aws-sdk/client-secrets-manager");

const region = "us-east-1";
const secretName = "my-secret";

const client = new SecretsManagerClient({ region });

async function getSecret() {
  let response;
  try {
    response = await client.send(
      new GetSecretValueCommand({
        SecretId: secretName,
        VersionStage: "AWSCURRENT",
      })
    );
  } catch (error) {
    throw error;
  }
  const secret = response.SecretString;
  return JSON.parse(secret);
}

exports.handler = async (event) => {
  const secret = await getSecret();
  const username = secret.username;
  const password = secret.password;
  // Use the credentials
  return {
    statusCode: 200,
    body: "Successfully retrieved secret"
  };
};

파이썬용 시크릿 캐시 확장 기능 사용

시크릿 검색의 성능과 비용을 최적화하려면 대형 계층에서 관리되는 시크릿 캐시 구성 요소를 사용할 수 있습니다. 이 구성 요소는 시크릿 값을 캐시하고 주기적으로 새로 고쳐서 Secrets Manager에 대한 요청 수를 줄입니다.

시크릿 캐시 확장 기능을 추가하려면:

  1. Lambda 콘솔의 Functions(함수) 페이지를 엽니다.
  2. 함수를 선택합니다.
  3. Layers(레이어) 아래에서 Add a layer(레이어 추가) 를 선택합니다.
  4. AWS layers 를 선택합니다.
  5. 시크릿 캐시 확장 기능을 선택합니다.
  6. Add 를 선택합니다.

확장 기능은 CACHE_SECRETS_MANAGER_SECRETS_MOUNT_PATH, CACHE_SECRETS_MANAGER_SECRETS_MAX_CACHE_SIZE_KB, CACHE_SECRETS_MANAGER_SECRETS_MIN_CACHE_SIZE_KB 같은 환경 변수로 구성할 수 있습니다. 자세한 내용은 Secrets Manager 시크릿 캐시 문서를 참조하세요.

문제 해결

시크릿 검색 문제가 발생하면 다음을 확인하세요:

  • 실행 역할에 secretsmanager:GetSecretValue 권한이 있는지 확인합니다.
  • 시크릿이 AWS KMS 키로 암호화된 경우 실행 역할에 kms:Decrypt 권한이 있는지 확인합니다.
  • 시크릿 이름과 리전이 올바른지 확인합니다.
  • 함수가 시크릿이 있는 리전에 있는지 확인합니다.

더 알아보기 (Learn more)

  • AWS Secrets Manager
  • Lambda 함수에서 환경 변수 사용
  • 시크릿 캐시 구성 요소