Lambda 함수에서 Secrets Manager 시크릿 사용
Lambda 함수에서 Secrets Manager 시크릿 사용 (Use Secrets Manager secrets in Lambda functions)
이 페이지는 애플리케이션에서 사용하는 Lambda 함수에서 AWS Secrets Manager 시크릿을 검색하고 사용하는 방법을 보여줍니다. 생성한 함수에서 데이터베이스 자격 증명, API 키, 기타 시크릿을 환경 변수 대신 Secrets Manager 시크릿으로 안전하게 저장할 수 있습니다.
본문
시크릿 사용 이점
환경 변수 대신 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 권한이 필요합니다.
콘솔에서 시크릿 만들기
시크릿을 만들려면:
- https://console.aws.amazon.com/secretsmanager/ 에서 AWS Secrets Manager 콘솔을 엽니다.
- Store a new secret(새 시크릿 저장) 을 선택합니다.
- Secret type(시크릿 유형) 에서 자격 증명 유형을 선택합니다. 예를 들어 데이터베이스 자격 증명의 경우 Credentials for Amazon RDS database(RDS 데이터베이스용 자격 증명) 을 선택합니다.
- 사용자 이름과 비밀번호를 입력합니다.
- 시크릿을 암호화할 KMS 키를 선택합니다(선택 사항).
- Secret name(시크릿 이름) 과 설명을 입력합니다.
- 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에 대한 요청 수를 줄입니다.
시크릿 캐시 확장 기능을 추가하려면:
- Lambda 콘솔의 Functions(함수) 페이지를 엽니다.
- 함수를 선택합니다.
- Layers(레이어) 아래에서 Add a layer(레이어 추가) 를 선택합니다.
- AWS layers 를 선택합니다.
- 시크릿 캐시 확장 기능을 선택합니다.
- 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 함수에서 환경 변수 사용
- 시크릿 캐시 구성 요소