AWS Lambda 함수에서 Parameter Store 파라미터 사용
AWS Systems Manager의 기능인 Parameter Store는 구성 데이터 관리 및 암호 관리를 위한 안전한 계층적 스토리지를 제공합니다. 암호, 데이터베이스 문자열, Amazon Machine Image(AMI) ID, 라이선스 코드와 같은 데이터를 파라미터 값으로 저장할 수 있습니다.
SDK를 사용하지 않고 AWS Lambda 함수에서 Parameter Store의 파라미터를 사용하려면 AWS 파라미터 및 보안 Lambda 익스텐션을 사용할 수 있습니다. 이 익스텐션은 파라미터 값을 검색한 후 나중에 사용할 수 있도록 캐시합니다. Lambda 익스텐션을 사용하면 Parameter Store에 대한 API 호출 수를 줄여 비용을 절감할 수 있습니다. 익스텐션을 사용하면 Parameter Store에서 검색할 때보다 캐시된 파라미터를 더 빠르게 검색할 수 있으므로 지연 시간을 줄일 수 있습니다.
Lambda 익스텐션은 Lambda 함수의 기능을 강화하는 동반 프로세스입니다. 익스텐션은 Lambda 호출과 병렬로 실행되는 클라이언트와 같습니다. 이 병렬 클라이언트는 수명 주기 중 언제든지 함수와 연결될 수 있습니다. Lambda 익스텐션에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 Lambda 익스텐션 API를 참조하세요.
AWS 파라미터 및 보안 Lambda 익스텐션은 Parameter Store 및 AWS Secrets Manager 모두에서 작동합니다. Lambda 익스텐션을 Secrets Manager의 보안 암호와 함께 사용하는 방법은 AWS Secrets Manager사용자 안내서의 AWS Lambda 함수에 AWS Secrets Manager 보안 암호 사용을 참조하세요.
관련 정보
AWS 파라미터 및 Secrets Lambda 확장을 사용하여 파라미터와 보안 암호 캐싱
익스텐션 작동 방법
Lambda 익스텐션 없이 Lambda 함수에서 파라미터를 사용하려면 Parameter Store의 GetParameter
API 작업과 통합하여 구성 업데이트를 수신하도록 Lambda 함수를 구성해야 합니다.
AWS 파라미터 및 보안 Lambda 익스텐션을 사용하는 경우 익스텐션은 Parameter Store에서 파라미터 값을 검색한 후 로컬 캐시에 저장합니다. 그런 다음 캐시된 값은 만료될 때까지 이후 호출에 사용됩니다. 캐시된 값은 TTL(time-to-live)이 경과한 이후에 만료됩니다. 이 항목의 뒷부분에 설명된 대로 SSM_PARAMETER_STORE_TTL
환경 변수를 사용하여 TTL 값을 구성할 수 있습니다.
구성된 캐시 TTL이 만료되지 않은 경우 캐시된 파라미터 값이 사용됩니다. 시간이 만료된 경우 캐시된 값은 무효화되고 파라미터 값이 Parameter Store에서 검색됩니다.
또한 자주 사용되는 파라미터 값을 감지하여 캐시에서 유지하고 만료되거나 사용되지 않는 값은 지웁니다.
구현 세부 정보
다음 세부 정보를 사용하여 AWS 파라미터 및 보안 Lambda 익스텐션을 구성할 수 있습니다.
- 인증
-
Parameter Store 요청을 승인하고 인증하기 위해 익스텐션은 Lambda 함수를 실행하는 데 사용된 것과 동일한 보안 인증을 사용합니다. 따라서 함수를 실행하는 데 사용되는AWS Identity and Access Management(IAM) 역할에 다음과 같은 권한이 있어야 Parameter Store와 상호 작용할 수 있습니다.
-
ssm:GetParameter
- Parameter Store에서 파라미터를 검색하는 데 필요합니다. -
kms:Decrypt
– Parameter Store에서SecureString
파라미터를 검색하는 경우에 필요합니다.
자세한 내용은 AWS Lambda 개발자 가이드의 AWS Lambda 실행 역할을 참조하세요.
-
- 인스턴스화
-
Lambda는 함수에 필요한 동시성 레벨에 해당하는 별도의 인스턴스를 인스턴스화합니다. 각 인스턴스는 격리되며 구성 데이터의 자체 로컬 캐시를 유지합니다. Lambda 인스턴스 및 동시성에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 예약된 동시성 구성을 참조하세요.
- SDK에 종속되지 않음
-
AWS 파라미터 및 보안 Lambda 익스텐션은 AWS SDK 언어 라이브러리와 독립적으로 작동합니다. Parameter Store에 대한 GET 요청을 생성하는 데 AWS SDK가 필요하지 않습니다.
- Localhost port
-
GET 요청에는
localhost
를 사용합니다. 이 익스텐션은 localhost 포트 2773에 요청합니다. 익스텐션을 사용하기 위해 외부 또는 내부 엔드포인트를 지정할 필요가 없습니다. 환경 변수PARAMETERS_SECRETS_EXTENSION_HTTP_PORT
를 설정하여 포트를 구성할 수 있습니다.예를 들어 Python에서 GET URL은 다음 예제와 비슷합니다.
parameter_url = ('http://localhost:' + port + '/systemsmanager/parameters/get/?name=' + ssm_parameter_path)
- TTL 만료 전 파라미터 값 변경
-
익스텐션은 파라미터 값에 대한 변경 사항을 감지하지 못하며 TTL이 만료되기 전에 자동 새로 고침을 수행하지 않습니다. 파라미터 값을 변경하면 캐시된 파라미터 값을 사용하는 작업이 다음에 캐시를 새로 고칠 때까지 실패할 수 있습니다. 파라미터 값을 자주 변경할 경우 TTL 값을 더 짧게 설정하는 것이 좋습니다.
- 헤더 요구 사항
-
익스텐션 캐시에서 파라미터를 검색하려면 GET 요청의 헤더에
X-Aws-Parameters-Secrets-Token
참조가 포함되어야 합니다. 모든 실행 중인 함수에 대해 Lambda에서 제공하는AWS_SESSION_TOKEN
으로 토큰을 설정합니다. 이 헤더를 사용하면 호출자가 Lambda 환경 내에 있음을 나타냅니다. - 예
-
Python의 다음 예제는 캐시된 파라미터 값을 검색하기 위한 기본 요청을 보여줍니다.
import urllib.request import os import json aws_session_token = os.environ.get('AWS_SESSION_TOKEN') def lambda_handler(event, context): # Retrieve /my/parameter from Parameter Store using extension cache req = urllib.request.Request('http://localhost:2773/systemsmanager/parameters/get?name=%2Fmy%2Fparameter') req.add_header('X-Aws-Parameters-Secrets-Token', aws_session_token) config = urllib.request.urlopen(req).read() return json.loads(config)
- ARM 지원
-
확장에서는 x86_64 및 x86 아키텍처가 지원되는 모든 동일한 AWS 리전의 ARM 아키텍처를 지원하지 않습니다.
익스텐션 ARN의 전체 목록은 AWS 파라미터 및 보안 암호 Lambda 익스텐션 ARN 단원을 참조하세요.
- 로깅
-
Lambda는 Amazon CloudWatch Logs를 사용하여 익스텐션에 대한 실행 정보를 함수와 함께 기록합니다. 기본적으로 이 익스텐션은 CloudWatch에 최소한의 정보를 기록합니다. 세부 정보를 기록하려면 환경 변수
PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL
을DEBUG
로 설정합니다.
Lambda 함수에 익스텐션 추가
AWS 파라미터 및 보안 Lambda 익스텐션을 사용하려면 Lambda 함수에 익스텐션을 계층으로 추가합니다.
다음 중 한 가지 방법으로 함수에 익스텐션을 추가합니다.
- AWS Management Console(계층 추가 옵션)
-
https://console.aws.amazon.com/lambda/
에서 AWS Lambda 콘솔을 엽니다. -
함수를 선택합니다. Layers(계층) 영역에서 Add a layer(계층 추가)를 선택합니다.
-
계층 선택 영역에서 AWS 계층 옵션을 선택합니다.
-
AWS 계층의 경우 AWS-Parameters-and-Secrets-Lambda-Extension을 선택하고, 버전을 선택한 다음에 추가를 선택합니다.
- AWS Management Console(ARN 옵션 지정)
-
https://console.aws.amazon.com/lambda/
에서 AWS Lambda 콘솔을 엽니다. -
함수를 선택합니다. Layers(계층) 영역에서 Add a layer(계층 추가)를 선택합니다.
-
Choose a layer(계층 선택) 영역에서 Specify an ARN(ARN 지정) 옵션을 선택합니다.
-
Specify an ARN(ARN 지정)에서 AWS 리전 및 아키텍처에 대한 익스텐션 ARN을 입력한 다음 Add(추가)를 선택합니다.
- AWS Command Line Interface
-
AWS CLI에서 다음과 같은 명령을 실행합니다. 각
example resource placeholder
를 사용자의 정보로 바꿉니다.aws lambda update-function-configuration \ --function-name
function-name
\ --layerslayer-ARN
관련 정보
AWS 파라미터 및 보안 암호 Lambda 익스텐션 환경 변수
다음 환경 변수를 변경하여 익스텐션을 구성할 수 있습니다. 현재 설정을 보려면 PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL
을 DEBUG
로 설정합니다. 자세한 내용은 AWS Lambda 개발자 안내서의 AWS Lambda 환경 변수 사용을 참조하세요.
참고
AWS Lambda는 Lambda 익스텐션 및 Lambda 함수에 대한 작업 세부 정보를 Amazon CloudWatch Logs에 기록합니다.
환경 변수 | Details | 필수 | 유효값 | 기본값 |
---|---|---|---|---|
|
Parameter Store에 대한 요청 제한 시간(밀리초)입니다.
0 값은 시간 제한이 없는 것을 나타냅니다. |
아니요 | 모든 정수 | 0(제로) |
|
Secrets Manager에 대한 요청 제한 시간(밀리초)입니다.
값이 0이면 시간 제한이 없습니다. |
아니요 | 모든 정수 |
0(제로) |
|
캐시에서 파라미터가 무효화되기 전의 최대 유효 기간(초)입니다. 값이 0이면 캐시가 우회됩니다. |
아니요 | 0~300초(5분) | 300초(5분) |
|
캐시에서 암호가 무효화되기 전의 최대 유효 기간(초)입니다. 값이 0이면 캐시가 우회됩니다. |
아니요 | 0~300초(5분) | 300초(5분) |
PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED |
확장에 대한 캐시가 활성화되었는지 여부를 결정합니다. 유효한 값: |
아니요 | TRUE | FALSE | TRUE |
PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE |
항목 수를 기준으로 한 캐시의 최대 크기입니다. 값이 0이면 캐시가 우회됩니다. 두 캐시 TTL 값이 모두 0인 경우 이 변수는 무시됩니다. |
아니요 | 0~1000 |
1000 |
PARAMETERS_SECRETS_EXTENSION_HTTP_PORT |
로컬 HTTP 서버의 포트입니다. | 아니요 | 1~65535 |
2773 |
PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS |
익스텐션에서 Parameter Store 또는 Secrets Manager에 요청하는 데 사용되는 HTTP 클라이언트의 최대 연결 수입니다. Secrets Manager 클라이언트와 Parameter Store 클라이언트가 모두 백엔드 서비스에 연결하는 개수에 대한 클라이언트별 구성입니다. |
아니요 | 최소값은 1이고 최대 제한은 없습니다. |
3 |
PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL |
익스텐션에 대해 로그에 보고된 세부 정보 수준입니다. 익스텐션을 설정하고 테스트할 때 캐시 구성에 대한 자세한 내용을 보려면 Lambda 작업에 대한 로그는 연결된 CloudWatch Logs 로그 그룹에 자동으로 푸시됩니다. |
아니요 |
|
INFO |
AWS Systems Manager Parameter Store 및 AWS Secrets Manager 익스텐션 사용을 위한 샘플 명령
이 단원의 예제는 AWS Systems Manager Parameter Store 및 AWS Secrets Manager 익스텐션에 사용하기 위한 API 작업을 보여줍니다.
Parameter Store에 대한 샘플 명령
Lambda 익스텐션은 GetParameter API 작업에 대한 읽기 전용 액세스를 사용합니다.
이 작업을 호출하려면 다음과 비슷한 HTTP GET 호출을 수행합니다. 이 명령 형식은 표준 파라미터 계층의 파라미터에 대한 액세스를 제공합니다.
GET http://localhost:
port
/systemsmanager/parameters/get?name=parameter-name
&version=version
&label=label
&withDecryption={true|false}
이 예제에서 parameter-name
은 전체 파라미터 이름을 나타냅니다. 예를 들어 계층 구조에 없는 파라미터의 경우 MyParameter
이고, 계층 구조에 속하는 명명된 파라미터 /Dev/Production/East/Project-ABC/MyParameter
의 경우 %2FDev%2FProduction%2FEast%2FProject-ABC%2FMyParameter
입니다.
참고
GET 호출을 사용하는 경우 특수 문자를 보존하려면 파라미터 값을 HTTP용으로 인코딩해야 합니다. 예를 들어 계층적 경로 형식(예: /a/b/c
)을 지정하는 대신 URL의 일부로 해석될 수 있는 문자(예: %2Fa%2Fb%2Fc
)를 인코딩합니다.
version
및 label
은 GetParameter
작업에 사용할 수 있는 선택기입니다.
GET http://localhost:
port
/systemsmanager/parameters/get/?name=MyParameter&version=5
계층 구조로 파라미터를 호출하려면 HTTP GET을 다음과 비슷하게 호출합니다.
GET http://localhost:
port
/systemsmanager/parameters/get?name=%2Fa%2Fb%2F&label=release
퍼블릭(글로벌) 파라미터를 호출하려면 HTTP GET을 다음과 비슷하게 호출합니다.
GET http://localhost:
port
/systemsmanager/parameters/get/?name=%2Faws%2Fservice%20list%2F…
Parameter Store 참조를 사용하여 Secrets Manager 암호에 대한 HTTP GET 호출을 생성하려면 HTTP GET을 다음과 비슷하게 호출합니다.
GET http://localhost:
port
/systemsmanager/parameters/get?name=%2Faws%2Freference%2Fsecretsmanager%2F…
파라미터에 대해 Amazon Resource Name(ARN)을 사용하여 호출하려면 HTTP GET을 다음과 비슷하게 호출합니다.
GET http://localhost:
port
/systemsmanager/parameters/get?name=arn:aws:ssm:us-east-1:123456789012:parameter/MyParameter
암호 해독을 통해 SecureString
파라미터에 액세스하는 호출을 실행하려면 HTTP GET을 다음과 비슷하게 호출합니다.
GET http://localhost:
port
/systemsmanager/parameters/get?name=MyParameter&withDecryption=true
withDecryption
을 생략하거나 false
로 명시적으로 설정하여 파라미터가 해독되지 않도록 지정할 수 있습니다. 버전, 레이블 또는 둘 모두를 지정할 수도 있습니다. 그러면 URL에서 물음표(?
) 뒤에 있는 첫 번째 항목만 사용됩니다.
AWS 파라미터 및 보안 암호 Lambda 익스텐션 ARN
다음 표는 지원되는 아키텍처 및 리전에 대한 익스텐션 ARN을 제공합니다.
x86_64 및 x86 아키텍처용 익스텐션 ARN
리전 | ARN |
---|---|
미국 동부(오하이오) |
|
미국 동부(버지니아 북부) |
|
미국 서부(캘리포니아 북부) |
|
미국 서부(오레곤) |
|
아프리카(케이프타운) |
|
아시아 태평양(홍콩) |
|
아시아 태평양(하이데라바드) 리전 |
|
아시아 태평양(자카르타) |
|
아시아 태평양(멜버른) |
|
아시아 태평양(뭄바이) |
|
아시아 태평양(오사카) |
|
아시아 태평양(서울) |
|
아시아 태평양(싱가포르) |
|
아시아 태평양(시드니) |
|
아시아 태평양(도쿄) |
|
캐나다(중부) |
|
캐나다 서부(캘거리) | arn:aws:lambda:ca-west-1:243964427225:layer:AWS-Parameters-and-Secrets-Lambda-Extension:1 |
중국(베이징) |
|
중국(닝샤) |
|
유럽(프랑크푸르트) |
|
유럽(아일랜드) |
|
유럽(런던) |
|
유럽(밀라노) |
|
유럽(파리) |
|
유럽(스페인) 리전 |
|
유럽(스톡홀름) |
|
이스라엘(텔아비브) |
|
유럽(취리히) 리전 |
|
중동(바레인) |
|
중동(UAE) | arn:aws:lambda:me-central-1:858974508948:layer:AWS-Parameters-and-Secrets-Lambda-Extension:11 |
남아메리카(상파울루) |
|
AWS GovCloud(미국 동부) |
|
AWS GovCloud(미국 서부) |
|
ARM64 및 Mac with Apple silicon 아키텍처용 익스텐션 ARN
리전 | ARN |
---|---|
미국 동부(오하이오) |
|
미국 동부(버지니아 북부) |
|
US West (N. California) Region |
|
미국 서부(오레곤) |
|
아프리카(케이프타운) 리전 |
|
Asia Pacific (Hong Kong) Region |
|
Asia Pacific (Jakarta) Region |
|
아시아 태평양(뭄바이) |
|
아시아 태평양(오사카) |
|
Asia Pacific (Seoul) Region |
|
아시아 태평양(싱가포르) |
|
아시아 태평양(시드니) |
|
아시아 태평양(도쿄) |
|
캐나다(중부) 리전 |
|
유럽(프랑크푸르트) |
|
유럽(아일랜드) |
|
유럽(런던) |
|
Europe (Milan) Region |
|
Europe (Paris) Region |
|
유럽(스톡홀름) 리전 |
|
Middle East (Bahrain) Region |
|
South America (São Paulo) Region |
|