기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS Secrets Manager 교체 문제 해결
많은 서비스에서 Secrets Manager는 Lambda 함수를 사용하여 보안 암호를 교체합니다. 자세한 내용은 Lambda 함수로 교체 단원을 참조하십시오. Lambda 교체 함수는 Secrets Manager뿐만 아니라 보안 암호가 사용되는 데이터베이스 또는 서비스와도 상호 작용합니다. 교체가 예상대로 작동하지 않을 경우 먼저 CloudWatch 로그를 확인해야 합니다.
참고
자동 교체 관리를 비롯한 일부 서비스는 보안 암호를 대신 관리할 수 있습니다. 자세한 내용은 AWS Secrets Manager 보안 암호에 대한 관리형 교체 단원을 참조하십시오.
Lambda 함수에 대한 CloudWatch 로그를 보려면
http://console.aws.amazon.com/secretsmanager/
에서 Secrets Manager 콘솔을 엽니다. -
보안 암호를 선택한 다음 세부 정보 페이지의 교체 구성(Rotation configuration)에서 Lambda 교체 함수를 선택합니다. Lambda 콘솔이 열립니다.
-
모니터링(Monitor) 탭에서 로그(Logs)를 선택한 후 CloudWatch에서 로그 보기(View logs in CloudWatch)를 선택합니다.
CloudWatch 콘솔이 열리고 함수에 대한 로그가 표시됩니다.
로그를 해석하려면
“환경 변수에서 보안 인증을 찾았습니다.” 이후 활동 없음
“환경 변수에서 보안 인증을 찾았습니다.” 이후에 활동이 없고 작업이 오래 실행되는 경우(예: 기본 Lambda 제한 시간 30000ms), Secrets Manager 엔드포인트에 연결하는 동안 Lambda 함수가 시간 초과될 수 있습니다.
Lambda 교체 함수는 Secrets Manager 엔드포인트에 액세스할 수 있어야 합니다. Lambda 함수가 인터넷에 액세스할 수 있는 경우 퍼블릭 엔드포인트를 사용할 수 있습니다. 엔드포인트를 찾으려면 AWS Secrets Manager 엔드포인트 섹션을 참조하세요.
Lambda 함수가 인터넷에 액세스할 수 없는 VPC에서 실행되는 경우 VPC 내에서 Secrets Manager 서비스 프라이빗 엔드포인트를 구성하는 것이 좋습니다. 그러면 VPC가 퍼블릭 리전 엔드포인트로 전달된 요청을 가로채서 프라이빗 엔드포인트로 리디렉션할 수 있습니다. 자세한 내용은 VPC 엔드포인트(AWS PrivateLink) 단원을 참조하십시오.
또는 VPC에 NAT 게이트웨이 또는 인터넷 게이트웨이를 추가하여 Lambda 함수를 통해 퍼블릭 Secrets Manager 엔드포인트에 액세스할 수 있도록 합니다. 그러면 VPC에서 트래픽이 퍼블릭 엔드포인트에 도달할 수 있습니다. 이렇게 하면 게이트웨이에 대한 IP 주소가 퍼블릭 인터넷에서 공격을 받을 수 있으므로 VPC가 더 많은 위험에 노출됩니다.
“createSecret” 이후 활동 없음
다음은 createSecret 이후에 교체가 중지될 수 있는 문제입니다.
- VPC 네트워크 ACL은 HTTPS 트래픽 송수신을 허용하지 않습니다.
-
자세한 내용은 Amazon VPC 사용 설명서의 네트워크 ACL을 사용하여 서브넷에 대한 트래픽 제어를 참조하세요.
- Lambda 함수 제한 시간 구성이 너무 짧아서 작업을 수행할 수 없습니다.
-
자세한 내용은 AWS Lambda 개발자 안내서의 Lambda 함수 옵션 구성을 참조하세요.
- Secrets Manager VPC 엔드포인트는 할당된 보안 그룹에서 VPC CIDR 수신을 허용하지 않습니다.
-
자세한 내용은 Amazon VPC 사용 설명서의 보안 그룹을 사용하여 리소스에 대한 트래픽 제어를 참조하세요.
- Secrets Manager VPC 엔드포인트 정책에서는 Lambda에서 VPC 엔드포인트를 사용하는 것을 허용하지 않습니다.
-
자세한 내용은 AWS Secrets Manager VPC 엔드포인트 사용 단원을 참조하십시오.
- 암호는 교대로 사용자를 교체하여 사용하고, 슈퍼 사용자 암호는 Amazon RDS에서 관리하며, Lambda 함수는 RDS API에 액세스할 수 없습니다.
-
슈퍼 사용자 보안 암호를 다른 AWS 서비스에서 관리하는 대체 사용자 교체의 경우, Lambda 교체 함수가 서비스 엔드포인트를 호출하여 데이터베이스 연결 정보를 가져올 수 있어야 합니다. 데이터베이스 서비스의 VPC 엔드포인트를 구성하는 것이 좋습니다. 자세한 내용은 다음 섹션을 참조하세요.
-
Amazon RDS 사용 설명서의 Amazon RDS API 및 인터페이스 VPC 엔드포인트.
-
Amazon Redshift 관리 가이드의 VPC 엔드포인트 작업.
-
오류: “KMS에 대한 액세스가 허용되지 않습니다.”
ClientError: An error occurred (AccessDeniedException) when calling the
GetSecretValue operation: Access to KMS is not allowed
에서 보듯 교체 함수에는 암호를 암호화하는 데 사용된 KMS 키를 사용하여 암호를 해독할 권한이 없습니다. 권한 정책에 암호화 컨텍스트를 특정 보안 암호로 제한하는 조건이 있을 수도 있습니다. 필요한 권한에 대한 자세한 내용은 고객 관리형 키에 대한 정책 설명 섹션을 참조하세요.
오류: “보안 암호 JSON에 키가 없습니다.”
Lambda 교체 함수를 사용하려면 보안 암호 값이 특정 JSON 구조에 있어야 합니다. 이 오류가 표시되면 JSON에 교체 함수에서 액세스하려는 키가 없을 수 있습니다. 각 보안 암호 유형별 JSON 구조에 대한 자세한 내용은 AWS Secrets Manager 보안 암호의 JSON 구조 섹션을 참조하세요.
오류: “setSecret: 데이터베이스에 로그인할 수 없음”
이 오류를 유발할 수 있는 문제는 다음과 같습니다.
- 교체 함수가 데이터베이스에 액세스할 수 없습니다.
-
작업 기간이 긴 경우(예: 5000ms 이상) Lambda 교체 함수가 네트워크를 통해 데이터베이스에 액세스하지 못할 수 있습니다.
데이터베이스 또는 인스턴스가 VPC의 Amazon EC2 인스턴스에서 실행 중인 경우, 동일한 VPC에서 Lambda 함수가 실행되도록 구성하는 것이 좋습니다. 그러면 교체 함수가 서비스와 직접 통신할 수 있습니다. 자세한 내용은 VPC 액세스 구성을 참조하세요.
Lambda 함수가 데이터베이스 또는 서비스에 액세스하도록 허용하려면 Lambda 교체 함수에 연결된 보안 그룹이 데이터베이스 또는 서비스에 아웃바운드 연결을 허용하는지 확인해야 합니다. 데이터베이스 또는 서비스에 연결된 보안 그룹이 Lambda 교체 함수에 인바운드 연결을 허용하는지도 확인해야 합니다.
- 보안 암호의 보안 인증이 올바르지 않습니다.
-
작업 기간이 짧은 경우 Lambda 교체 함수가 보안 암호의 보안 인증으로 인증하지 못할 수 있습니다. AWS CLI 명령를 사용하여 보안 암호의
AWSCURRENT
및AWSPREVIOUS
버전에 있는 정보로 수동으로 로그인하여 자격 증명을 확인합니다get-secret-value
. - 데이터베이스는
scram-sha-256
을(를) 사용하여 암호를 암호화합니다. -
데이터베이스가 Aurora PostgreSQL 버전 13 이상이고
scram-sha-256
을(를) 사용하여 암호를 암호화하지만, 교체 함수가scram-sha-256
을(를) 지원하지 않는libpq
버전 9 이하를 사용하는 경우, 교체 함수가 데이터베이스에 연결할 수 없습니다.scram-sha-256
암호화를 사용하는 데이터베이스 사용자 확인 방법-
PostgreSQL 13을 위한 RDS의 SCRAM 인증
블로그에서 비-SCRAM 암호를 사용하는 사용자의 확인을 참조하세요.
해당 교체 함수가 사용하는
libpq
의 버전 확인 방법-
Linux 기반 컴퓨터의 Lambda 콘솔에서 교체 함수로 이동하여 배포 번들을 다운로드합니다. 작업 디렉터리에 zip 파일을 압축 해제합니다.
-
명령줄의 작업 디렉터리에서 다음을 실행합니다:
readelf -a libpq.so.5 | grep RUNPATH
-
문자열
이 표시되거나 메이저 버전이 10 미만인 경우 교체 함수가PostgreSQL-9.4.x
scram-sha-256
을(를) 지원하지 않는 것입니다.-
scram-sha-256
을(를) 지원하지 않는 교체 함수의 출력:0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/
PostgreSQL-9.4.x
_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib] -
scram-sha-256
을(를) 지원하는 교체 함수의 출력:0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild-a1b2c/workspace/build/PostgreSQL/
PostgreSQL-10.x
_client_only.123456.0/AL2_x86_64/DEV.STD.PTHREAD/build/private/tmp/brazil-path/build.libfarm/lib:/local/p4clients/pkgbuild-a1b2c/workspace/src/PostgreSQL/build/private/install/lib]
-
참고
2021년 12월 30일 이전에 자동 보안 암호 교체를 설정한 경우 교체 함수는를 지원하지
libpq
않는 이전 버전의를 번들링했습니다scram-sha-256
.scram-sha-256
을(를) 지원하려면 교체 함수를 다시 생성해야 합니다. -
- 데이터베이스에 SSL/TLS 액세스가 필요합니다.
-
데이터베이스에 SSL/TLS 연결이 필요하지만 교체 함수가 암호화되지 않은 연결을 사용하는 경우, 교체 함수가 데이터베이스에 연결할 수 없습니다. Amazon RDS(Oracle 및 Db2 제외) 및 Amazon DocumentDB에 대한 교체 함수는 사용 가능한 보안 소켓 계층(SSL) 또는 전송 계층 보안(TLS)을 사용하여 데이터베이스에 연결합니다. 그렇지 않으면 암호화되지 않은 연결을 사용합니다.
참고
2021년 12월 20일 이전에 자동 보안 암호 교체를 설정한 경우 교체 함수는 SSL/TLS를 지원하지 않는 이전 템플릿을 기반으로 할 수 있습니다. SSL/TLS를 사용하는 연결을 지원하려면 교체 함수를 재생성해야 합니다.
교체 함수가 언제 생성되었는지 확인하려면
-
Secrets Manager 콘솔(http://console.aws.amazon.com/secretsmanager/
)에서 보안 암호를 엽니다. 교체 구성(Rotation configuration) 섹션의 Lambda 교체 함수(Lambda rotation function)에서 arn:aws:lambda:
과 같은 Lambda 함수 ARN(Lambda function ARN)을 볼 수 있습니다. ARN 끝에서 함수 이름을 복사합니다(이 예에서는aws-region
:123456789012
:function:SecretsManagerMyRotationFunction
SecretsManagerMyRotationFunction
-
AWS Lambda 콘솔 http://console.aws.amazon.com/lambda/
의 함수에서 검색 상자에 Lambda 함수 이름을 붙여 넣고 Enter를 선택한 다음 Lambda 함수를 선택합니다. -
함수 세부 정보 페이지의 구성(Configuration) 탭에서, 태그(Tags) 아래의 aws:cloudformation:stack-name 키 옆에 있는 값을 복사합니다.
-
AWS CloudFormation 콘솔 http://console.aws.amazon.com/cloudformation
의 스택에서 키 값을 검색 상자에 붙여 넣은 다음 Enter를 선택합니다. -
스택 목록은 Lambda 교체 함수를 생성한 스택만 표시되도록 필터링합니다. 생성된 날짜(Created date) 열에서 스택이 생성된 날짜를 확인합니다. 이것은 Lambda 교체 함수가 생성된 날짜입니다.
-
오류: “모듈 'lambda_function'을 가져올 수 없음”
Python 3.7에서 최신 버전의 Python으로 자동 업그레이드된 이전 Lambda 함수를 실행하는 경우 이 오류가 발생할 수 있습니다. 오류를 해결하려면 Lambda 함수 버전을 다시 Python 3.7로 변경한 다음 기존 교체 함수를 Python 3.7에서 3.9로 업그레이드 합니다. 자세한 내용은 AWS
re:Post에서 Secrets Manager Lambda 함수 교체가 “pg 모듈을 찾을 수 없음” 오류로 인해 실패한 이유는 무엇인가요?
기존 교체 함수를 Python 3.7에서 3.9로 업그레이드
2022년 11월 이전에 생성된 일부 교체 함수는 Python 3.7을 사용했습니다. Python용 AWS SDK는 2023년 12월에 Python 3.7 지원을 중단했습니다. 자세한 내용은 AWS SDKs
Python 3.7을 사용하는 Lambda 교체 함수를 찾으려면
에 로그인 AWS Management Console 하고 http://console.aws.amazon.com/lambda/
://http://http://http://http://http://http://http://://http AWS Lambda ://://http://http -
함수 목록에서
SecretsManager
를 필터링합니다. -
필터링된 함수 목록의 런타임에서 Python 3.7을 찾습니다.
Python 3.9로 업그레이드하려면
옵션 1: AWS CloudFormation을 사용하여 교체 함수 다시 생성
Secrets Manager 콘솔을 사용하여 교체를 켜면 Secrets Manager는 AWS CloudFormation 를 사용하여 Lambda 교체 함수를 포함하여 필요한 리소스를 생성합니다. 콘솔을 사용하여 교체를 켜거나 AWS CloudFormation 스택을 사용하여 교체 함수를 생성한 경우 동일한 AWS CloudFormation 스택을 사용하여 새 이름으로 교체 함수를 다시 생성할 수 있습니다. 새 함수는 최신 버전의 Python을 사용합니다.
교체 함수를 생성한 AWS CloudFormation 스택을 찾으려면
Lambda 함수 세부 정보 페이지의 구성 탭에서 태그를 선택합니다. aws:cloudformation:stack-id 옆의 ARN을 확인합니다.
스택 이름은 다음 예와 같이 ARN에 포함되어 있습니다.
ARN:
arn:aws:cloudformation:us-west-2:408736277230:stack/
SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda
-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537스택 이름:
SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda
교체 함수를 다시 생성하려면(AWS CloudFormation)
-
에서 이름으로 스택을 AWS CloudFormation검색한 다음 업데이트를 선택합니다.
루트 스택 업데이트를 권장하는 대화 상자가 나타나면 루트 스택으로 이동을 선택한 다음 업데이트를 선택합니다.
-
스택 업데이트 페이지의 템플릿 준비 에서 Application Composer에서 편집을 선택한 다음, Application Composer에서 템플릿 편집에서 Application Composer에서 편집 버튼을 선택합니다.
-
Application Composer에서 다음을 수행합니다.
-
템플릿 코드에 있는
SecretRotationScheduleHostedRotationLambda
의"functionName": "SecretsManagerTestRotationRDS"
값을 새 함수 이름(예: JSON의 경우
)으로 바꿉니다."functionName": "SecretsManagerTestRotationRDSupdated"
-
템플릿 업데이트를 선택합니다.
-
AWS CloudFormation계속하기 대화 상자에서 확인 후 AWS CloudFormation계속 진행을 선택하여 계속합니다.
-
-
AWS CloudFormation 스택 워크플로를 계속 진행한 다음 제출을 선택합니다.
옵션 2:를 사용하여 기존 교체 함수의 런타임 업데이트 AWS CloudFormation
Secrets Manager 콘솔을 사용하여 교체를 켜면 Secrets Manager는 AWS CloudFormation 를 사용하여 Lambda 교체 함수를 포함하여 필요한 리소스를 생성합니다. 콘솔을 사용하여 교체를 켜거나 AWS CloudFormation 스택을 사용하여 교체 함수를 생성한 경우 동일한 AWS CloudFormation 스택을 사용하여 교체 함수의 런타임을 업데이트할 수 있습니다.
교체 함수를 생성한 AWS CloudFormation 스택을 찾으려면
Lambda 함수 세부 정보 페이지의 구성 탭에서 태그를 선택합니다. aws:cloudformation:stack-id 옆의 ARN을 확인합니다.
스택 이름은 다음 예와 같이 ARN에 포함되어 있습니다.
ARN:
arn:aws:cloudformation:us-west-2:408736277230:stack/
SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda
-3CUDHZMDMBO8/79fc9050-2eef-11ed-80f0-021fb13c0537스택 이름:
SecretsManagerRDSMySQLRotationSingleUser5c2-SecretRotationScheduleHostedRotationLambda
교체 함수의 런타임을 업데이트하려면(AWS CloudFormation)
-
에서 이름으로 스택을 AWS CloudFormation검색한 다음 업데이트를 선택합니다.
루트 스택 업데이트를 권장하는 대화 상자가 나타나면 루트 스택으로 이동을 선택한 다음 업데이트를 선택합니다.
-
스택 업데이트 페이지의 템플릿 준비 에서 Application Composer에서 편집을 선택한 다음, Application Composer에서 템플릿 편집에서 Application Composer에서 편집 버튼을 선택합니다.
-
Application Composer에서 다음을 수행합니다.
-
템플릿 JSON에서
SecretRotationScheduleHostedRotationLambda
의 경우Properties
아래의Parameters
에서"runtime": "python3.9"
을 추가합니다. -
템플릿 업데이트를 선택합니다.
-
AWS CloudFormation계속하기 대화 상자에서 확인 후 AWS CloudFormation계속 진행을 선택하여 계속합니다.
-
-
AWS CloudFormation 스택 워크플로를 계속 진행한 다음 제출을 선택합니다.
옵션 3: AWS CDK 사용자의 경우 CDK 라이브러리 업그레이드
버전 v2.94.0 AWS CDK 이전를 사용하여 보안 암호에 대한 교체를 설정한 경우 v2.94.0 이상으로 업그레이드하여 Lambda 함수를 업데이트할 수 있습니다. 자세한 내용은 AWS Cloud Development Kit (AWS CDK) v2 개발자 안내서를 참조하세요.
AWS Lambda 를 사용한 보안 암호 교체 PutSecretValue
실패
Secrets Manager에서 수임된 역할 또는 교차 계정 교체를 사용하고 AWS CloudTrail에서 Secret SECRET_ARN에 대한 보안 암호 버전 VERSION_ID 보류 중이 Lambda LAMBDA_ARN에 의해 생성되지 않았다는 메시지가 포함된 RotationFailed 이벤트를 발견한 경우.
시작한 다음
AWSPENDING
스테이징 레이블을 제거하고 교체를 다시RotationToken
파라미터를 사용하도록 Lambda 함수를 업데이트해야 합니다.
포함되도록 Lambda 교체 함수 업데이트 RotationToken
-
Lambda 함수 코드 다운로드
-
Lambda 콘솔 열기
-
탐색 창에서 함수를 선택합니다.
-
함수 이름에 대한 Lambda 보안 암호 교체 함수 선택
-
다운로드에서 함수 코드 .zip, AWS SAM 파일, 둘 다 중 하나를 선택합니다.
-
확인을 선택하여 로컬 시스템에 함수를 저장합니다.
-
-
Lambda_handler
편집교차 계정 교체를 위해 create_secret 단계에 rotation_token 파라미터를 포함합니다.
def lambda_handler(event, context): """Secrets Manager Rotation Template This is a template for creating an AWS Secrets Manager rotation lambda Args: event (dict): Lambda dictionary of event parameters. These keys must include the following: - SecretId: The secret ARN or identifier - ClientRequestToken: The ClientRequestToken of the secret version - Step: The rotation step (one of createSecret, setSecret, testSecret, or finishSecret) - RotationToken: the rotation token to put as parameter for PutSecretValue call context (LambdaContext): The Lambda runtime information Raises: ResourceNotFoundException: If the secret with the specified arn and stage does not exist ValueError: If the secret is not properly configured for rotation KeyError: If the event parameters do not contain the expected keys """ arn = event['SecretId'] token = event['ClientRequestToken'] step = event['Step'] # Add the rotation token rotation_token = event['RotationToken'] # Setup the client service_client = boto3.client('secretsmanager', endpoint_url=os.environ['SECRETS_MANAGER_ENDPOINT']) # Make sure the version is staged correctly metadata = service_client.describe_secret(SecretId=arn) if not metadata['RotationEnabled']: logger.error("Secret %s is not enabled for rotation" % arn) raise ValueError("Secret %s is not enabled for rotation" % arn) versions = metadata['VersionIdsToStages'] if token not in versions: logger.error("Secret version %s has no stage for rotation of secret %s." % (token, arn)) raise ValueError("Secret version %s has no stage for rotation of secret %s." % (token, arn)) if "AWSCURRENT" in versions[token]: logger.info("Secret version %s already set as AWSCURRENT for secret %s." % (token, arn)) return elif "AWSPENDING" not in versions[token]: logger.error("Secret version %s not set as AWSPENDING for rotation of secret %s." % (token, arn)) raise ValueError("Secret version %s not set as AWSPENDING for rotation of secret %s." % (token, arn)) # Use rotation_token if step == "createSecret": create_secret(service_client, arn, token, rotation_token) elif step == "setSecret": set_secret(service_client, arn, token) elif step == "testSecret": test_secret(service_client, arn, token) elif step == "finishSecret": finish_secret(service_client, arn, token) else: raise ValueError("Invalid step parameter")
-
create_secret
코드 편집rotation_token
파라미터를 수락하고 사용하도록create_secret
함수를 수정합니다.# Add rotation_token to the function def create_secret(service_client, arn, token, rotation_token): """Create the secret This method first checks for the existence of a secret for the passed in token. If one does not exist, it will generate a new secret and put it with the passed in token. Args: service_client (client): The secrets manager service client arn (string): The secret ARN or other identifier token (string): The ClientRequestToken associated with the secret version rotation_token (string): the rotation token to put as parameter for PutSecretValue call Raises: ResourceNotFoundException: If the secret with the specified arn and stage does not exist """ # Make sure the current secret exists service_client.get_secret_value(SecretId=arn, VersionStage="AWSCURRENT") # Now try to get the secret version, if that fails, put a new secret try: service_client.get_secret_value(SecretId=arn, VersionId=token, VersionStage="AWSPENDING") logger.info("createSecret: Successfully retrieved secret for %s." % arn) except service_client.exceptions.ResourceNotFoundException: # Get exclude characters from environment variable exclude_characters = os.environ['EXCLUDE_CHARACTERS'] if 'EXCLUDE_CHARACTERS' in os.environ else '/@"\'\\' # Generate a random password passwd = service_client.get_random_password(ExcludeCharacters=exclude_characters) # Put the secret, using rotation_token service_client.put_secret_value(SecretId=arn, ClientRequestToken=token, SecretString=passwd['RandomPassword'], VersionStages=['AWSPENDING'], RotationToken=rotation_token) logger.info("createSecret: Successfully put secret for ARN %s and version %s." % (arn, token))
-
업데이트된 Lambda 함수 코드 업로드
Lambda 함수 코드를 업데이트한 후 업로드하여 보안 암호를 교체합니다.