

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Lambda 교체 함수
<a name="rotate-secrets_lambda-functions"></a>

에서 AWS Lambda 함수[Lambda 함수로 교체](rotate-secrets_lambda.md)는 보안 암호를 교체합니다. AWS Secrets Manager 는 [스테이징 레이블](whats-in-a-secret.md)을 사용하여 교체 중에 보안 암호 버전을 식별합니다.

 AWS Secrets Manager 가 보안 암호 유형에 대한 [교체 함수 템플릿을](reference_available-rotation-templates.md) 제공하지 않는 경우 사용자 지정 교체 함수를 생성할 수 있습니다. 교체 함수를 작성할 때 다음 지침을 따르세요.

**사용자 지정 교체 함수 모범 사례**
+ [일반 교체 템플릿](reference_available-rotation-templates.md#OTHER_rotation_templates)을 시작점으로 사용하세요.
+ 디버깅 또는 로깅 문에 주의하세요. 이 문이 Amazon CloudWatch Logs에 기록될 수 있으므로, 로그에 민감한 정보가 포함되지 않도록 하세요.

  로그 문 예시는 [AWS Secrets Manager 교체 함수 템플릿](reference_available-rotation-templates.md) 소스 코드를 참조하세요.
+ 보안을 위해 Lambda 교체 함수만 보안 암호를 직접 교체하도록 AWS Secrets Manager 허용합니다. 교체 함수가 다른 Lambda 함수를 호출하여 보안 암호를 교체할 수 없습니다.
+ 디버깅 안내를 원한다면 [서버리스 애플리케이션 테스트 및 디버깅](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-test-and-debug.html)을 참조하세요.
+ 외부 바이너리나 라이브러리를 사용하는 경우(예: 리소스 연결용) 패치 및 업데이트는 사용자가 책임져야 합니다.
+ 교체 함수와 모든 종속 항목을 ZIP 파일(예: *my-function.zip*)로 패키징하세요.

**주의**  
프로비저닝된 동시성 파라미터를 10보다 낮게 설정하면 Lambda 함수 실행 스레드가 부족하여 스로틀링이 발생할 수 있습니다. 자세한 내용은 AWS Lambda AWS Lambda 개발자 가이드의 [예약된 동시성 및 프로비저닝된 동시성 이해](https://docs.aws.amazon.com/lambda/latest/dg/lambda-concurrency.html#reserved-and-provisioned)를 참조하세요.

## 교체 함수의 4단계
<a name="rotate-secrets_lambda-functions-code"></a>

**Topics**
+ [`createSecret`: 새로운 버전의 보안 암호 생성](#w2aac21c11c29c11b5)
+ [**setSecret**: 데이터베이스 또는 서비스의 보안 인증 변경](#w2aac21c11c29c11b7)
+ [**testSecret**: 새 보안 암호 버전 테스트](#w2aac21c11c29c11b9)
+ [**finishSecret**: 교체 완료](#w2aac21c11c29c11c11)

### `createSecret`: 새로운 버전의 보안 암호 생성
<a name="w2aac21c11c29c11b5"></a>

`createSecret` 메서드에서는 먼저 전달된 `ClientRequestToken`으로 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_secret_value](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_secret_value)를 호출하여 보안 암호가 존재하는지 확인합니다. 보안 암호가 없는 경우 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.create_secret](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.create_secret) 및 토큰을 `VersionId`로 사용하여 새 보안 암호를 생성합니다. 그러면 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_random_password](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.get_random_password)를 사용하여 새 보안 암호 값이 생성됩니다. 그다음, [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.put_secret_value](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.put_secret_value)를 호출하여 스테이징 레이블 `AWSPENDING`와 함께 저장합니다. 새 보안 암호 값을 `AWSPENDING`에 저장하면 멱등성을 보장하는 데 도움이 됩니다. 어떤 이유로든 교체에 실패할 경우 후속 호출에서 해당 보안 암호 값을 참조할 수 있습니다. [멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/) 섹션을 참조하세요.

**교체 함수를 직접 작성하기 위한 팁**
+ 새 보안 암호 값에 데이터베이스 또는 서비스에 유효한 문자만 포함되어 있는지 확인해야 합니다. `ExcludeCharacters` 파라미터를 사용하여 문자를 제외합니다.
+ 함수를 테스트할 때 AWS CLI 를 사용하여 버전 단계를 확인합니다.를 호출[https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html)하고를 확인합니다`VersionIdsToStages`.
+ Amazon RDS MySQL의 경우 대체 사용자 교체 시 Secrets Manager는 이름이 16자를 넘지 않는 클론 사용자를 생성합니다. 더 긴 사용자 이름을 허용하도록 교체 함수를 수정할 수 있습니다. MySQL 버전 5.7 이상에서는 최대 32자의 사용자 이름을 지원하지만 Secrets Manager는 사용자 이름 끝에 "\$1clone"(6자)을 추가하므로 사용자 이름을 최대 26자로 유지해야 합니다.

### **setSecret**: 데이터베이스 또는 서비스의 보안 인증 변경
<a name="w2aac21c11c29c11b7"></a>

`setSecret` 메서드는 데이터베이스 또는 서비스의 자격 증명을 `AWSPENDING` 버전 보안 암호의 새 보안 암호 값과 일치하도록 변경합니다.

**교체 함수를 직접 작성하기 위한 팁**
+ 데이터베이스처럼 문을 해석하는 서비스에 문을 전달할 경우 쿼리 파라미터화를 사용합니다. 자세한 내용은 *OWASP 웹 사이트*의 [Query Parameterization Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Query_Parameterization_Cheat_Sheet.html)를 참조하세요.
+ 교체 함수는 Secrets Manager 보안 암호와 대상 리소스 모두에서 고객 보안 인증을 액세스하고 수정할 수 있는 권한을 가진 대리자입니다. 잠재적으로 [혼동된 대리자 공격](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)을 방지하려면 공격자가 함수를 사용하여 다른 리소스에 액세스할 수 없도록 해야 합니다. 보안 인증을 업데이트하기 전에:
  + `AWSCURRENT` 버전 보안 암호의 보안 인증이 유효한지 확인합니다. `AWSCURRENT` 보안 인증이 유효하지 않은 경우 교체 시도를 중단합니다.
  + `AWSCURRENT` 및 `AWSPENDING` 보안 암호 값이 동일한 리소스에 대한 값인지 확인합니다. 사용자 이름과 암호의 경우 `AWSCURRENT` 및 `AWSPENDING` 사용자 이름이 동일한지 확인합니다.
  + 대상 서비스 리소스가 동일한지 확인합니다. 데이터베이스의 경우 `AWSCURRENT` 및 `AWSPENDING` 호스트 이름이 동일한지 확인합니다.
+ 드문 경우지만 데이터베이스에 대한 기존 교체 함수를 사용자 지정할 수 있습니다. 예를 들어 대체 사용자 교체가 있는 경우 Secrets Manager는 첫 번째 사용자의 [런타임 구성 매개변수를](https://www.postgresql.org/docs/8.0/runtime-config.html) 복사하여 복제된 사용자를 생성합니다. 더 많은 속성을 포함하거나 복제된 사용자에게 부여되는 속성을 변경하려면 `set_secret` 함수의 코드를 업데이트해야 합니다.

### **testSecret**: 새 보안 암호 버전 테스트
<a name="w2aac21c11c29c11b9"></a>

다음으로 Lambda 교체 함수는 데이터베이스나 서비스에 액세스하는 데 보안 암호의 `AWSPENDING` 버전을 사용하여 해당 버전을 테스트합니다. [교체 함수 템플릿](reference_available-rotation-templates.md) 기반 교체 함수는 읽기 액세스를 사용하여 새 보안 암호를 테스트합니다.

### **finishSecret**: 교체 완료
<a name="w2aac21c11c29c11c11"></a>

마지막으로 Lambda 교체 함수는 `AWSCURRENT` 레이블을 이전 보안 암호 버전에서 이 버전으로 이동하며 동일한 API 직접 호출에서 `AWSPENDING` 레이블도 제거합니다. Secrets Manager에서 `AWSPREVIOUS` 스테이징 레이블을 이전 버전으로 추가하여 보안 암호의 마지막으로 확인된 정상 버전을 유지할 수 있습니다.

**finish\$1secret** 메서드는 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.update_secret_version_stage](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html#SecretsManager.Client.update_secret_version_stage)를 사용하여 `AWSCURRENT` 스테이징 레이블을 이전 보안 암호 버전에서 새 보안 암호 버전으로 이동합니다. Secrets Manager에서 `AWSPREVIOUS` 스테이징 레이블을 이전 버전에 자동으로 추가하여 보안 암호의 마지막으로 확인된 정상 버전을 유지할 수 있습니다.

**교체 함수를 직접 작성하기 위한 팁**
+ 이 시점 이전에는 `AWSPENDING` 을 제거해서는 안 되며, 별도의 API 직접 호출을 사용하여 제거하면 교체가 성공적으로 완료되지 않았음을 Secrets Manager에 알릴 수 있으므로 별도의 API 직접 호출을 사용하여 제거해서도 안 됩니다. Secrets Manager에서 `AWSPREVIOUS` 스테이징 레이블을 이전 버전으로 추가하여 보안 암호의 마지막으로 확인된 정상 버전을 유지할 수 있습니다.

교체가 성공하면 `AWSPENDING` 스테이징 레이블은 `AWSCURRENT` 버전과 동일한 버전에 첨부되거나 어떤 버전에도 연결되지 않을 수 있습니다. `AWSPENDING` 스테이징 레이블이 있지만 `AWSCURRENT`와 동일한 버전에 연결되지 않은 경우 이후의 교체 호출은 이전 교체 요청이 아직 진행 중인 것으로 간주하여 오류를 반환합니다. 교체에 실패하면 `AWSPENDING` 스테이징 레이블은 빈 암호 버전에 연결될 수 있습니다. 자세한 내용은 [교체 문제 해결](troubleshoot_rotation.md) 단원을 참조하십시오.