

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

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

여러 유형의 보안 암호의 경우 Secrets Manager는 AWS Lambda 함수를 사용하여 보안 암호와 데이터베이스 또는 서비스를 업데이트합니다. Lambda 함수 사용 비용에 대한 자세한 내용은 [가격 책정](intro.md#asm_pricing) 섹션을 참조하세요.

일부 [다른 서비스에서 관리하는 보안 암호](service-linked-secrets.md)의 경우 *관리형 교체*를 사용합니다. [관리형 교체](rotate-secrets_managed.md)을(를) 사용하려면 먼저 관리 서비스를 통해 보안 암호를 생성해야 합니다.

교체하는 동안 Secrets Manager는 교체 상태를 나타내는 이벤트를 로그합니다. 자세한 내용은 [를 사용하여 AWS Secrets Manager 이벤트 로깅 AWS CloudTrail](monitoring-cloudtrail.md) 단원을 참조하십시오.

보안 암호를 교체하기 위해 Secrets Manager는 설정한 교체 일정에 따라 [Lambda 함수](rotate-secrets_lambda-functions.md)를 호출합니다. 자동 교체가 설정된 상태에서 암호 값을 수동으로도 업데이트하는 경우, Secrets Manager는 다음 교체 날짜를 계산할 때 이를 유효한 교체로 간주합니다.

교체를 수행하는 동안 Secrets Manager에서는 파라미터가 다를 때마다 동일한 함수를 여러 번 호출합니다. Secrets Manager에서는 파라미터의 다음 JSON 요청 구조를 사용하여 함수를 호출합니다.

```
{
    "Step" : "request.type",
    "SecretId" : "string",
    "ClientRequestToken" : "string",
    "RotationToken" : "string"
}
```

**파라미터:**
+ **단계** - 교체 단계: `create_secret`, `set_secret`, `test_secret`, 또는 `finish_secret`. 자세한 내용은 [교체 함수의 4단계](rotate-secrets_lambda-functions.md#rotate-secrets_lambda-functions-code) 단원을 참조하십시오.
+ **SecretId** - 교체할 보안 암호의 ARN입니다.
+ **ClientRequestToken** - 새 버전의 보안 암호에 대한 고유 식별자입니다. 이 값은 멱등성을 보장하는 데 도움이 됩니다. 자세한 내용은 **AWS Secrets Manager API 참조의 [PutSecretValue: ClientRequestToken](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_PutSecretValue.html#SecretsManager-PutSecretValue-request-ClientRequestToken)을 참조하세요.
+ **RotationToken** - 요청의 소스를 나타내는 고유 식별자입니다. 다른 계정에서 Lambda 교체 함수를 사용하여 한 계정의 보안 암호를 교체하는 수임된 역할 또는 교차 계정 회전에 의한 보안 암호 교체 시 필요합니다. 두 경우 모두, 교체 함수는 Secrets Manager를 호출하기 위해 IAM 역할을 담당하며, 이후 Secrets Manager는 교체 토큰을 사용하여 IAM 역할의 신원을 검증합니다.

교체 단계가 실패하면 Secrets Manager는 전체 교체 프로세스를 여러 번 다시 시도합니다.

**Topics**
+ [데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-db.md)
+ [비데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-other.md)
+ [자동 교체(AWS CLI)](rotate-secrets_turn-on-cli.md)
+ [Lambda 함수 교체 전략](rotation-strategy.md)
+ [Lambda 교체 함수](rotate-secrets_lambda-functions.md)
+ [교체 함수 템플릿](reference_available-rotation-templates.md)
+ [교체 권한](rotating-secrets-required-permissions-function.md)
+ [AWS Lambda 교체 함수에 대한 네트워크 액세스](rotation-function-network-access.md)
+ [교체 문제 해결](troubleshoot_rotation.md)

# Amazon Aurora, Amazon Redshift 또는 Amazon DocumentDB 보안 암호 자동 교체 설정
<a name="rotate-secrets_turn-on-for-db"></a>

이 자습서에서는 데이터베이스 보안 암호에 대해 [Lambda 함수로 교체](rotate-secrets_lambda.md)를 설정하는 방법을 설명합니다. 교체는 주기적으로 보안 암호를 업데이트하는 프로세스입니다. 보안 암호를 교체하면 보안 암호와 데이터베이스 모두에서 보안 인증 정보가 업데이트됩니다. Secrets Manager에서 데이터베이스 보안 암호에 대한 자동 교체를 설정할 수 있습니다.

콘솔을 사용하여 교체를 설정하려면 먼저 교체 전략을 선택해야 합니다. 그런 다음 교체에 대한 보안 암호를 구성하여 Lambda 교체 함수(아직 없는 경우)를 생성합니다. 콘솔은 Lambda 함수 실행 역할에 대한 권한도 설정합니다. 마지막 단계에서는 Lambda 교체 함수가 네트워크를 통해 Secrets Manager와 데이터베이스 모두에 액세스할 수 있는지 확인합니다.

**주의**  
자동 교체를 켜려면 Lambda 교체 함수에 대한 IAM 실행 역할을 생성하고 이 역할에 권한 정책을 연결할 수 있는 권한이 있어야 합니다. `iam:CreateRole` 및 `iam:AttachRolePolicy` 권한이 모두 필요합니다. 자격 증명에 이러한 권한을 부여하면 해당 자격 증명은 자신에게 모든 권한을 부여할 수 있습니다.

**Topics**
+ [1단계: 교체 전략 선택 및 (선택 사항) 슈퍼유저 보안 암호 생성](#rotate-secrets_turn-on-for-db_step1)
+ [2단계: 교체 구성 및 교체 함수 생성](#rotate-secrets_turn-on-for-db_step2)
+ [3단계: (선택 사항) 교체 함수에 대한 추가 권한 조건 설정](#rotate-secrets_turn-on-for-db_step3)
+ [4단계: 교체 함수에 대한 네트워크 액세스 설정](#rotate-secrets_turn-on-for-db_step4)
+ [다음 단계](#rotate-secrets_turn-on-for-db_stepnext)

## 1단계: 교체 전략 선택 및 (선택 사항) 슈퍼유저 보안 암호 생성
<a name="rotate-secrets_turn-on-for-db_step1"></a>

Secrets Manager에서 제공하는 전략에 대한 내용은 [Lambda 함수 교체 전략](rotation-strategy.md) 섹션을 참조하세요.

*대체 사용자 전략*을 선택하는 경우 [보안 암호 생성](create_secret.md)하고 데이터베이스 슈퍼유저 보안 인증을 저장해야 합니다. 교체에서는 첫 번째 사용자를 복제하므로 슈퍼유저 보안 인증을 가진 보안 암호가 필요하며, 대부분의 사용자는 해당 권한이 없습니다. Amazon RDS Proxy는 대체 사용자 전략을 지원하지 않습니다.

## 2단계: 교체 구성 및 교체 함수 생성
<a name="rotate-secrets_turn-on-for-db_step2"></a>

**Amazon RDS, Amazon DocumentDB, Amazon Redshift 보안 암호 교체를 켜려면**

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)에서 Secrets Manager 콘솔을 엽니다.

1. **보안 암호(Secrets)** 페이지에서 보안 암호를 선택합니다.

1. **보안 암호 세부 정보(Secret details)** 페이지의 **교체 구성(Rotation configuration)** 섹션에서 **교체 편집(Edit rotation)**을 선택합니다.

1. **Edit rotation configuration**(교체 구성 편집) 대화 상자에서 다음을 수행합니다.

   1. **Automatic rotation**(자동 교체)을 켭니다.

   1. **Rotation schedule**(교체 일정)에서 **Schedule expression builder**(예약 표현식 빌더) 또는 **Schedule expression**(예약 표현식)으로 일정(UTC 표준 시간대)을 입력합니다. Secrets Manager는 일정을 `rate()` 또는 `cron()` 표현식으로 저장합니다. 교체 기간은 **Start time**(시작 시간)을 지정하지 않는 한 자정에 자동으로 시작됩니다. 보안 암호를 4시간마다 교체할 수 있습니다. 자세한 내용은 [교체 일정](rotate-secrets_schedule.md) 단원을 참조하십시오.

   1. (선택 사항) **Window duration**(지속 시간)에서 Secrets Manager가 보안 암호를 교체할 기간의 길이를 입력합니다. 예를 들어 **3h**는 3시간입니다. 기간은 그 다음 교체 기간까지 연장되지 않아야 합니다. 시간 단위의 교체 일정에서 **지속 시간**을 지정하지 않으면 한 시간 후에 자동으로 종료됩니다. 일 단위의 교체 일정인 경우 해당 날짜의 하루가 끝나면 자동으로 종료됩니다.

   1. (선택 사항) 변경 사항을 저장할 때 보안 암호가 교체되게 하려면 **보안 암호를 저장할 때 즉시 교체(Rotate immediately when the secret is stored)**를 선택합니다. 확인란의 선택을 취소하는 경우에는 설정한 예약에 따라 첫 번째 교체가 시작됩니다.

      예를 들어 3단계와 4단계를 아직 완료하지 않아서 교체에 실패하는 경우 Secrets Manager는 교체 프로세스를 여러 번 재시도합니다.

   1. **교체 함수(Rotation function)**에서 다음 중 하나를 수행합니다.
      + **Create a new Lambda function**(새 Lambda 함수 생성)을 선택하고 새 함수의 이름을 입력합니다. Secrets Manager에서 함수 이름의 시작 부분에 `SecretsManager`를 추가합니다. Secrets Manager는 적절한 [템플릿](reference_available-rotation-templates.md)을 기반으로 함수를 생성하고 Lambda 실행 역할에 필요한 [권한](rotating-secrets-required-permissions-function.md)을 설정합니다.
      + 다른 보안 암호에 사용한 교체 함수를 재사용하려면 **Use an existing Lambda function**(기존 Lambda 함수 사용)을 선택합니다. **Recommended VPC configurations**(권장 VPC 구성)에 나열된 교체 함수에는 데이터베이스와 동일한 VPC 및 보안 그룹이 있으므로, 함수가 데이터베이스에 액세스하는 데 도움이 됩니다.

   1. **교체 전략**에서 **단일 사용자** 또는 **대체 사용자** 전략을 선택합니다. 자세한 내용은 [1단계: 교체 전략 선택 및 (선택 사항) 슈퍼유저 보안 암호 생성](#rotate-secrets_turn-on-for-db_step1) 단원을 참조하십시오.

1. **저장**을 선택합니다.

## 3단계: (선택 사항) 교체 함수에 대한 추가 권한 조건 설정
<a name="rotate-secrets_turn-on-for-db_step3"></a>

교체 함수에 대한 리소스 정책에서는 컨텍스트 키 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)를 포함하여 Lambda가 [혼동된 대리자](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)로 사용되지 않도록 하는 것이 좋습니다. 일부 AWS 서비스의 경우 혼동된 대리자 시나리오를 방지하려면 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 및 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 전역 조건 키를 모두 사용하는 것이 AWS 좋습니다. 그러나 교체 함수 정책에 `aws:SourceArn` 조건을 포함하는 경우 교체 함수는 해당 ARN에서 지정한 보안 암호를 교체하는 데만 사용할 수 있습니다. 여러 보안 암호에 대해 교체 기능을 사용할 수 있도록 컨텍스트 키 `aws:SourceAccount`만 포함하는 것이 좋습니다.

**교체 함수 리소스 정책을 업데이트하려면**

1. Secrets Manager 콘솔에서 보안 암호를 선택한 다음 세부 정보 페이지의 **Rotation configuration**(교체 구성)에서 Lambda 교체 함수를 선택합니다. Lambda 콘솔이 열립니다.

1. [Lambda에 리소스 기반 정책 사용](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)의 지침에 따라 `aws:sourceAccount` 조건을 추가합니다.

   ```
   "Condition": {
       "StringEquals": {
           "AWS:SourceAccount": "123456789012"
       }
   },
   ```

 AWS 관리형 키 `aws/secretsmanager` 이외의 KMS 키를 사용하여 보안 암호를 암호화할 경우 Secrets Manager가 Lambda 실행 역할에 키 사용 권한을 부여합니다. [SecretARN 암호화 컨텍스트](security-encryption.md#security-encryption-encryption-context)를 사용하여 암호 해독 기능의 사용을 제한할 수 있으므로 교체 함수 역할은 교체를 담당하는 암호의 암호 해독에만 액세스할 수 있습니다.

**교체 함수의 실행 역할 업데이트**

1. Lambda 교체 함수에서 **구성**을 선택한 다음 **실행 역할**에서 **역할 이름**을 선택합니다.

1. `kms:EncryptionContext:SecretARN` 조건을 추가하려면 [역할 권한 정책 수정](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)의 지침을 따르세요.

   ```
   "Condition": {
       "StringEquals": {
           "kms:EncryptionContext:SecretARN": "SecretARN"
       }
   },
   ```

## 4단계: 교체 함수에 대한 네트워크 액세스 설정
<a name="rotate-secrets_turn-on-for-db_step4"></a>

자세한 내용은 [AWS Lambda 교체 함수에 대한 네트워크 액세스](rotation-function-network-access.md) 단원을 참조하십시오.

## 다음 단계
<a name="rotate-secrets_turn-on-for-db_stepnext"></a>

[AWS Secrets Manager 교체 문제 해결](troubleshoot_rotation.md)을(를) 참조하세요.

# 데이터베이스가 아닌 AWS Secrets Manager 보안 암호에 대한 자동 교체 설정
<a name="rotate-secrets_turn-on-for-other"></a>

이 자습서에서는 비데이터베이스 보안 암호에 대해 [Lambda 함수로 교체](rotate-secrets_lambda.md)를 설정하는 방법을 설명합니다. 교체는 주기적으로 보안 암호를 업데이트하는 프로세스입니다. 보안 암호를 교체하면 보안 암호와 보안 암호가 사용되는 데이터베이스 또는 서비스 모두에서 보안 인증이 업데이트됩니다.

데이터베이스 보안 암호는 [데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-db.md) 섹션을 참조하세요.

**주의**  
자동 교체를 켜려면 Lambda 교체 함수에 대한 IAM 실행 역할을 생성하고 이 역할에 권한 정책을 연결할 수 있는 권한이 있어야 합니다. `iam:CreateRole` 및 `iam:AttachRolePolicy` 권한이 모두 필요합니다. 자격 증명에 이러한 권한을 부여하면 해당 자격 증명은 자신에게 모든 권한을 부여할 수 있습니다.

**Topics**
+ [1단계: 일반 교체 함수 생성](#rotate-secrets_turn-on-for-other_create)
+ [2단계: 교체 함수 코드 작성](#rotate-secrets_turn-on-for-other_write)
+ [3단계: 보안 암호에 대한 교체 구성](#rotate-secrets_turn-on-for-other_configure)
+ [4단계: 교체 함수가 Secrets Manager와 데이터베이스 또는 서비스에 액세스하도록 허용](#rotate-secrets_turn-on-for-other_perms)
+ [5단계: Secrets Manager가 교체 함수를 간접적으로 호출하도록 허용](#rotate-secrets_turn-on-for-other_perms2)
+ [6단계: 교체 함수에 대한 네트워크 액세스 설정](#rotate-secrets_turn-on-for-other_network)
+ [다음 단계](#rotate-secrets_turn-on-for-other_stepnext)

## 1단계: 일반 교체 함수 생성
<a name="rotate-secrets_turn-on-for-other_create"></a>

시작하려면 Lambda 교체 함수를 생성합니다. 보안 암호를 교체하기 위한 코드는 포함되지 않으므로 이후 단계에서 작성하겠습니다. 교체 함수의 작동 방식에 대한 내용은 [Lambda 교체 함수](rotate-secrets_lambda-functions.md) 섹션을 참조하세요.

지원되는 리전에서는 AWS Serverless Application Repository 를 사용하여 템플릿에서 함수를 생성할 수 있습니다. 지원되는 리전 목록은 [AWS Serverless Application Repository FAQ](https://aws.amazon.com/serverless/serverlessrepo/faqs/) 섹션을 참조하세요. 다른 리전의 경우, 함수를 처음부터 새로 생성하고 템플릿 코드를 함수에 복사합니다.

**일반 교체 함수를 생성하는 방법**

1.  AWS Serverless Application Repository 가 해당 리전에서 지원되는지 확인하려면 *AWS 일반* 참조의 [AWS Serverless Application Repository 엔드포인트 및 할당량을 참조하세요](https://docs.aws.amazon.com/general/latest/gr/serverlessrepo.html).

1. 다음 중 하나를 수행하세요.
   + 해당 리전에서 AWS Serverless Application Repository 가 지원되는 경우:

     1. 탐색 창에서 **애플리케이션**을 선택한 다음 **애플리케이션 생성**을 선택합니다.

     1. **애플리케이션 생성** 페이지에서 **서버리스 애플리케이션** 탭을 선택합니다.

     1. **퍼블릭 애플리케이션** 아래의 검색 상자에 **SecretsManagerRotationTemplate**을 입력합니다.

     1. **Show apps that create custom IAM roles or resource policies**를 선택합니다.

     1. **SecretsManagerRotationTemplate** 타일을 선택합니다.

     1. **검토, 구성 및 배포** 페이지의 **애플리케이션 설정** 타일에서 필수 필드를 채웁니다.
        + **엔드포인트**의 경우 **https://**를 포함하여, 리전의 엔드포인트를 입력합니다. 엔드포인트 목록은 [AWS Secrets Manager 엔드포인트](asm_access.md#endpoints) 섹션을 참조하세요.
        + Lambda 함수를 VPC에 입력하려면 **vpcSecurityGroupIds** 및 **vpcSubnetIds**를 포함합니다.

     1. **배포(Deploy)**를 선택합니다.
   +  AWS Serverless Application Repository 가 해당 리전에서 지원되지 않는 경우:

     1. Lambda 콘솔 페이지의 **함수**를 선택하고 **함수 생성**을 선택합니다.

     1. **함수 생성** 페이지에서 다음을 수행합니다.

        1. **새로 작성**을 선택합니다.

        1. **Function name**(함수 이름)에 교체 함수의 이름을 입력합니다.

        1. **런타임**에서 **Python 3.10**을 선택합니다.

        1. **함수 생성**을 선택합니다.

## 2단계: 교체 함수 코드 작성
<a name="rotate-secrets_turn-on-for-other_write"></a>

이 단계에서는 보안 암호를 업데이트하고, 보안 암호가 사용되는 서비스 또는 데이터베이스를 업데이트하는 코드를 작성합니다. 교체 함수를 직접 작성할 경우에 대한 팁을 포함하여, 교체 함수의 기능에 대한 자세한 내용은 [Lambda 교체 함수](rotate-secrets_lambda-functions.md) 섹션을 참조하세요. [교체 함수 템플릿](reference_available-rotation-templates.md)도 참조로 사용할 수 있습니다.

## 3단계: 보안 암호에 대한 교체 구성
<a name="rotate-secrets_turn-on-for-other_configure"></a>

이 단계에서는 보안 암호에 대한 교체 일정을 설정하고, 교체 함수를 보안 암호에 연결합니다.

**교체를 구성하고 교체 함수를 생성하려면**

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)에서 Secrets Manager 콘솔을 엽니다.

1. **보안 암호(Secrets)** 페이지에서 보안 암호를 선택합니다.

1. **보안 암호 세부 정보(Secret details)** 페이지의 **교체 구성(Rotation configuration)** 섹션에서 **교체 편집(Edit rotation)**을 선택합니다. **Edit rotation configuration**(교체 구성 편집) 대화 상자에서 다음을 수행합니다.

   1. **Automatic rotation**(자동 교체)을 켭니다.

   1. **Rotation schedule**(교체 일정)에서 **Schedule expression builder**(예약 표현식 빌더) 또는 **Schedule expression**(예약 표현식)으로 일정(UTC 표준 시간대)을 입력합니다. Secrets Manager는 일정을 `rate()` 또는 `cron()` 표현식으로 저장합니다. 교체 기간은 **Start time**(시작 시간)을 지정하지 않는 한 자정에 자동으로 시작됩니다. 보안 암호를 4시간마다 교체할 수 있습니다. 자세한 내용은 [교체 일정](rotate-secrets_schedule.md) 단원을 참조하십시오.

   1. (선택 사항) **Window duration**(지속 시간)에서 Secrets Manager가 보안 암호를 교체할 기간의 길이를 입력합니다. 예를 들어 **3h**는 3시간입니다. 기간은 그 다음 교체 기간까지 연장되지 않아야 합니다. 시간 단위의 교체 일정에서 **지속 시간**을 지정하지 않으면 한 시간 후에 자동으로 종료됩니다. 일 단위의 교체 일정인 경우 해당 날짜의 하루가 끝나면 자동으로 종료됩니다.

   1. (선택 사항) 변경 사항을 저장할 때 보안 암호가 교체되게 하려면 **보안 암호를 저장할 때 즉시 교체(Rotate immediately when the secret is stored)**를 선택합니다. 확인란의 선택을 취소하는 경우에는 설정한 예약에 따라 첫 번째 교체가 시작됩니다.

   1. **교체 함수**에서 1단계에서 생성한 Lambda 함수를 선택합니다.

   1. **저장**을 선택합니다.

## 4단계: 교체 함수가 Secrets Manager와 데이터베이스 또는 서비스에 액세스하도록 허용
<a name="rotate-secrets_turn-on-for-other_perms"></a>

Lambda 교체 함수에는 Secrets Manager 보안 암호에 액세스할 수 있는 권한과, 데이터베이스 또는 서비스에 액세스할 수 있는 권한이 필요합니다. 이 단계에서는 Lambda 실행 역할에 이러한 권한을 부여합니다. AWS 관리형 키 `aws/secretsmanager` 이외의 KMS 키를 사용하여 보안 암호를 암호화할 경우 Lambda 실행 역할에 키 사용 권한을 부여해야 합니다. [SecretARN 암호화 컨텍스트](security-encryption.md#security-encryption-encryption-context)를 사용하여 암호 해독 기능의 사용을 제한할 수 있으므로 교체 함수 역할은 교체를 담당하는 암호의 암호 해독에만 액세스할 수 있습니다. 정책 예시는 [교체 권한](rotating-secrets-required-permissions-function.md) 섹션을 참조하세요.

지침은 *AWS Lambda 개발자 가이드*의 [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)을 참조하세요.

## 5단계: Secrets Manager가 교체 함수를 간접적으로 호출하도록 허용
<a name="rotate-secrets_turn-on-for-other_perms2"></a>

Secrets Manager가 설정한 교체 일정에 따라 교체 함수를 간접적으로 호출하도록 허용하려면, Lambda 함수의 리소스 정책에서 Secrets Manager 서비스 보안 주체에게 `lambda:InvokeFunction` 권한을 부여해야 합니다.

교체 함수에 대한 리소스 정책에서는 컨텍스트 키 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount)를 포함하여 Lambda가 [혼동된 대리자](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)로 사용되지 않도록 하는 것이 좋습니다. 일부 AWS 서비스의 경우 혼동된 대리자 시나리오를 방지하려면 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 및 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 전역 조건 키를 모두 사용하는 것이 AWS 좋습니다. 그러나 교체 함수 정책에 `aws:SourceArn` 조건을 포함하는 경우 교체 함수는 해당 ARN에서 지정한 보안 암호를 교체하는 데만 사용할 수 있습니다. 여러 보안 암호에 대해 교체 기능을 사용할 수 있도록 컨텍스트 키 `aws:SourceAccount`만 포함하는 것이 좋습니다.

리소스 정책을 Lambda 함수에 연결하려면 [Lambda에 대한 리소스 기반 정책 사용](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)을 참조하세요.

다음 정책에서는 Secrets Manager가 Lambda 함수를 간접적으로 호출하도록 허용하는 방법을 보여줍니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "default",
    "Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "Service": "secretsmanager.amazonaws.com"
            },
        "Action": "lambda:InvokeFunction",
        "Condition": {
            "StringEquals": {
                "AWS:SourceAccount": "123456789012"
            }
        },
        "Resource": "arn:aws:lambda:us-east-1:123456789012:function:function-name"
    }
    ]
}
```

------

## 6단계: 교체 함수에 대한 네트워크 액세스 설정
<a name="rotate-secrets_turn-on-for-other_network"></a>

이 단계에서는 교체 함수가 Secrets Manager에 연결하고, 보안 암호가 사용되는 서비스 또는 데이터베이스에도 연결할 수 있도록 허용합니다. 보안 암호를 교체하려면 교체 함수가 두 가지 모두에 액세스할 수 있어야 합니다. [AWS Lambda 교체 함수에 대한 네트워크 액세스](rotation-function-network-access.md)을(를) 참조하세요.

## 다음 단계
<a name="rotate-secrets_turn-on-for-other_stepnext"></a>

3단계에서 교체를 구성한 경우, 보안 암호를 교체하기 위한 일정을 설정합니다. 예약된 시간에 교체가 실패하면 Secrets Manager는 교체를 여러 번 시도합니다. [보안 암호 즉시 교체](rotate-secrets_now.md)의 지침에 따라 즉시 교체를 시작할 수도 있습니다.

교체에 실패한 경우 [교체 문제 해결](troubleshoot_rotation.md) 단원을 참조하세요.

# 를 사용하여 자동 교체 설정 AWS CLI
<a name="rotate-secrets_turn-on-cli"></a>

이 자습서에서는를 사용하여 [Lambda 함수로 교체](rotate-secrets_lambda.md)를 설정하는 방법을 설명합니다 AWS CLI. 보안 암호를 교체하면 보안 암호와 보안 암호가 사용되는 데이터베이스 또는 서비스 모두에서 보안 인증이 업데이트됩니다.

콘솔을 사용하여 교체를 설정할 수도 있습니다. 데이터베이스 보안 암호는 [데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-db.md) 섹션을 참조하세요. 다른 유형의 보안 암호에 대해서는 [비데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-other.md) 섹션을 참조하세요.

를 사용하여 교체를 설정하려면 데이터베이스 보안 암호를 교체하는 AWS CLI경우 먼저 교체 전략을 선택해야 합니다. 대체 사용자 전략을 선택하는 경우 별도의 보안 암호를 데이터베이스 슈퍼유저의 보안 인증과 함께 저장해야 합니다. 그런 다음 교체 함수 코드를 작성합니다. Secrets Manager는 함수의 기반이 될 수 있는 템플릿을 제공합니다. 그러면 코드를 사용하여 Lambda 함수를 생성하고 Lambda 함수와 Lambda 실행 역할 모두에 대한 권한을 설정합니다. 다음 단계에서는 Lambda 함수가 네트워크를 통해 Secrets Manager와 데이터베이스 또는 서비스 모두에 액세스할 수 있는지 확인합니다. 마지막으로 교체에 대한 보안 암호를 구성합니다.

**Topics**
+ [데이터베이스 보안 암호의 사전 조건: 교체 전략 선택](#rotate-secrets_turn-on-cli_step1)
+ [1단계: 교체 함수 코드 작성](#rotate-secrets_turn-on-cli_write)
+ [2단계: Lambda 함수 만들기](#w2aac21c11c25c15)
+ [3단계: 네트워크 액세스 설정](#w2aac21c11c25c17)
+ [4단계: 보안 암호에 대한 교체 구성](#w2aac21c11c25c19)
+ [다음 단계](#w2aac21c11c25c21)

## 데이터베이스 보안 암호의 사전 조건: 교체 전략 선택
<a name="rotate-secrets_turn-on-cli_step1"></a>

Secrets Manager에서 제공하는 전략에 대한 내용은 [Lambda 함수 교체 전략](rotation-strategy.md) 섹션을 참조하세요.

### 옵션 1: 단일 사용자 전략
<a name="w2aac21c11c25c11b5"></a>

*단일 사용자 전략*을 선택할 경우 1단계를 계속 진행하면 됩니다.

### 옵션 2: 대체 사용자 전략
<a name="w2aac21c11c25c11b7"></a>

*대체 사용자 전략*을 선택할 경우 다음을 수행해야 합니다.
+ [보안 암호를 생성](create_secret.md#create_secret_cli)하고 데이터베이스 슈퍼 사용자 자격 증명을 저장합니다. 대체 사용자 교체에서는 첫 번째 사용자를 복제하므로 슈퍼 사용자 보안 인증을 가진 보안 암호가 필요하며, 대부분의 사용자는 해당 권한이 없습니다.
+ 수퍼 사용자 보안 암호의 ARN을 원본 보안 암호에 추가합니다. 자세한 내용은 [AWS Secrets Manager 보안 암호의 JSON 구조](reference_secret_json_structure.md) 단원을 참조하십시오.

Amazon RDS Proxy는 대체 사용자 전략을 지원하지 않습니다.

## 1단계: 교체 함수 코드 작성
<a name="rotate-secrets_turn-on-cli_write"></a>

보안 암호를 교체하려면 교체 함수가 필요합니다. 교체 함수는 Secrets Manager에서 보안 암호를 교체하기 위해 호출하는 Lambda 함수입니다. 자세한 내용은 [Lambda 함수로 교체](rotate-secrets_lambda.md) 단원을 참조하십시오. 이 단계에서는 보안 암호를 업데이트하고, 보안 암호가 사용되는 서비스 또는 데이터베이스를 업데이트하는 코드를 작성합니다.

Secrets Manager는 [교체 함수 템플릿](reference_available-rotation-templates.md)에서 Amazon RDS, Amazon Aurora, Amazon Redshift, Amazon DocumentDB 보안 암호에 대한 템플릿을 제공합니다.

**교체 함수 코드를 작성하는 방법**

1. 다음 중 하나를 수행하세요.
   + [교체 함수 템플릿](reference_available-rotation-templates.md) 목록을 확인합니다. 서비스 및 교체 전략과 일치하는 항목이 있을 경우 해당 코드를 복사합니다.
   + 다른 유형의 보안 암호의 경우 교체 함수를 직접 작성할 수 있습니다. 지침은 [Lambda 교체 함수](rotate-secrets_lambda-functions.md) 섹션을 참조하세요.

1. 파일을 필요한 종속성과 함께 *my-function.zip* ZIP 파일에 저장합니다.

## 2단계: Lambda 함수 만들기
<a name="w2aac21c11c25c15"></a>

이 단계에서는 1단계에서 생성한 ZIP 파일을 사용하여 Lambda 함수를 생성합니다. [Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)은 함수가 호출될 때 Lambda가 맡는 역할입니다.

**Lambda 교체 함수 및 실행 역할을 생성하려면**

1. Lambda 실행 역할에 대한 신뢰 정책을 생성한 후 JSON 파일로 저장합니다. 예제와 추가 정보는 [에 대한 Lambda 교체 함수 실행 역할 권한 AWS Secrets Manager](rotating-secrets-required-permissions-function.md) 섹션을 참조하세요. 정책은 다음을 충족해야 합니다.
   + 역할이 보안 암호에 대해 Secrets Manager 작업을 호출할 수 있도록 허용합니다.
   + 역할이 보안 암호가 사용되는 서비스를 직접적으로 호출하여 새 암호를 생성하도록 허용합니다.

1. [https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html](https://docs.aws.amazon.com/cli/latest/reference/iam/create-role.html)을 호출하여 Lambda 실행 역할을 생성하고 이전 단계에서 생성한 신뢰 정책을 적용합니다.

   ```
   aws iam create-role \
       --role-name rotation-lambda-role \
       --assume-role-policy-document file://trust-policy.json
   ```

1. [https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html)을 호출하여 ZIP 파일에서 Lambda 함수를 생성합니다.

   ```
   aws lambda create-function \
     --function-name my-rotation-function \
     --runtime python3.7 \
     --zip-file fileb://my-function.zip \
     --handler .handler \
     --role arn:aws:iam::123456789012:role/service-role/rotation-lambda-role
   ```

1. Secrets Manager가 [https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html)을 호출하여 호출할 수 있도록 Lambda 함수에 대한 리소스 정책을 설정합니다.

   ```
   aws lambda add-permission \
     --function-name my-rotation-function \
     --action lambda:InvokeFunction \
     --statement-id SecretsManager \
     --principal secretsmanager.amazonaws.com \
     --source-account 123456789012
   ```

## 3단계: 네트워크 액세스 설정
<a name="w2aac21c11c25c17"></a>

자세한 내용은 [AWS Lambda 교체 함수에 대한 네트워크 액세스](rotation-function-network-access.md) 단원을 참조하십시오.

## 4단계: 보안 암호에 대한 교체 구성
<a name="w2aac21c11c25c19"></a>

보안 암호에 대한 자동 교체를 켜려면 [https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/rotate-secret.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/rotate-secret.html)을 호출합니다. `cron()` 또는 `rate()` 일정 표현식을 사용하여 교체 일정을 설정하고 교체 기간을 설정할 수 있습니다. 자세한 내용은 [교체 일정](rotate-secrets_schedule.md) 단원을 참조하십시오.

```
aws secretsmanager rotate-secret \
    --secret-id MySecret \
    --rotation-lambda-arn arn:aws:lambda:Region:123456789012:function:my-rotation-function \
    --rotation-rules "{\"ScheduleExpression\": \"cron(0 16 1,15 * ? *)\", \"Duration\": \"2h\"}"
```

## 다음 단계
<a name="w2aac21c11c25c21"></a>

[AWS Secrets Manager 교체 문제 해결](troubleshoot_rotation.md)을(를) 참조하세요.

# Lambda 함수 교체 전략
<a name="rotation-strategy"></a>

[Lambda 함수로 교체](rotate-secrets_lambda.md)의 경우, 데이터베이스 보안 암호에 대해 Secrets Manager는 두 가지 교체 전략을 제공합니다.

## 교체 전략: 단일 사용자
<a name="rotating-secrets-one-user-one-password"></a>

이 전략은 한 보안 암호로 한 사용자에 대한 보안 인증을 업데이트합니다. Amazon RDS Db2 인스턴스의 경우 사용자가 자신의 암호를 변경할 수 없으므로 별도의 보안 암호로 관리자 자격 증명을 제공해야 합니다. **이 전략은 가장 간단한 교체 전략이며 대부분의 사용 사례에 적합합니다.** 특히 일회성 (임시) 또는 대화형 사용자의 보안 인증에 이 전략을 사용하는 것이 좋습니다.

보안 암호가 교체될 때 열린 데이터베이스 연결은 삭제되지 않습니다. 교체가 진행되는 동안 데이터베이스의 암호가 변경되는 시점부터 보안 암호가 업데이트되는 시점까지 짧은 기간이 소요됩니다. 이 시간동안 데이터베이스가 교체된 보안 인증을 사용하는 호출을 거부할 위험은 적습니다. [적절한 재시도 전략](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)을 사용하여 이 위험을 완화할 수 있습니다. 교체 후에는 새 연결에서 새 보안 인증이 사용됩니다.

## 교체 전략: 대체 사용자
<a name="rotating-secrets-two-users"></a>

이 전략은 한 보안 암호로 두 사용자에 대한 보안 인증을 업데이트합니다. 첫 번째 사용자를 생성하고 첫 번째 교체 중에 교체 함수가 해당 사용자를 복제하여 두 번째 사용자를 생성합니다. 보안 암호가 교체될 때마다 교체 함수는 업데이트하는 사용자의 암호를 교체합니다. 대부분의 사용자는 본인을 복제할 수 있는 권한이 없으므로 다른 보안 암호에서 `superuser`에 대한 보안 인증을 제공해야 합니다. 데이터베이스의 복제된 사용자가 원래 사용자와 동일한 권한을 가지고 있지 않은 경우(일회성(임시) 또는 대화형 사용자라고도 함), 단일 사용자 교체 전략을 사용하는 것이 좋습니다.

이 전략은 첫 번째 역할이 데이터베이스 테이블을 소유하고 두 번째 역할이 데이터베이스 테이블에 액세스할 수 있는 권한이 있는 권한 모델을 포함하는 데이터베이스에 적합합니다. 이 전력은 고가용성이 필요한 애플리케이션에도 적합합니다. 애플리케이션은 교체 중에 보안 암호가 검색되더라도 유효한 보안 인증 세트를 가져옵니다. 교체 후에는 `user` 및`user_clone` 보안 인증이 모두 유효합니다. 이러한 유형의 교체 중에 애플리케이션이 거부될 가능성은 단일 사용자 교체보다 훨씬 적습니다. 암호 변경 사항이 모든 서버로 전파되는 데 시간이 걸리는 서버 팜에서 데이터베이스가 호스트되는 경우 데이터베이스가 새 보안 인증을 사용하는 호출을 거부할 위험이 있습니다. [적절한 재시도 전략](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)을 사용하여 이 위험을 완화할 수 있습니다.

Secrets Manager는 원래 사용자와 동일한 권한이 있는 복제된 사용자를 생성합니다. 클론이 생성된 후 원래 사용자의 권한을 변경하는 경우 복제된 사용자의 권한도 변경해야 합니다.

예를 들어 데이터베이스 사용자의 보안 인증으로 암호를 만드는 경우 암호에는 해당 보안 인증이 있는 버전 하나가 포함됩니다.

 ![\[The secret contains one secret version labeled AWSCURRENT. The username for the AWSCURRENT version is MyUser.\]](http://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/images/AlternatingUsers1.png) 

**첫 번째 교체** – 교체 기능은 생성된 암호로 사용자의 클론을 생성하고 해당 보안 인증은 현재 암호 버전이 됩니다.

 ![\[The secret contains two secret versions, one labeled AWSCURRENT and one labeled AWSPREVIOUS. The username for the AWSCURRENT version is MyUser_clone.\]](http://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/images/AlternatingUsers2.png) 

**두 번째 교체** – 교체 기능은 원래 사용자의 암호를 업데이트합니다.

 ![\[The secret contains two secret versions, one labeled AWSCURRENT and one labeled AWSPREVIOUS. The username for the AWSCURRENT version is MyUser.\]](http://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/images/AlternatingUsers3.png) 

**세 번째 교체** – 교체 기능은 복제된 사용자의 암호를 업데이트합니다.

 ![\[The secret contains two secret versions, one labeled AWSCURRENT and one labeled AWSPREVIOUS. The username for the AWSCURRENT version is MyUser_clone.\]](http://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/images/AlternatingUsers4.png) 

# 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) 단원을 참조하십시오.

# AWS Secrets Manager 교체 함수 템플릿
<a name="reference_available-rotation-templates"></a>

AWS Secrets Manager 는 다양한 데이터베이스 시스템 및 서비스에 대한 자격 증명의 보안 관리를 자동화하는 데 도움이 되는 교체 함수 템플릿 세트를 제공합니다. 이 템플릿들은 바로 사용 가능한 Lambda 함수로, 자격 증명 교체에 대한 모범 사례를 구현하여 수동 개입 없이 보안 상태를 유지할 수 있도록 도와줍니다.

이 템플릿들은 두 가지 주요 교체 전략을 지원합니다.
+ *단일 사용자 교체*: 단일 사용자의 자격 증명을 업데이트합니다.
+ *교대 사용자 교체*: 두 개의 별도 사용자를 유지하여 자격 증명 변경 시 가동 중지 시간을 최소화합니다.

또한 Secrets Manager는 모든 유형의 보안 암호를 위한 출발점으로 사용할 수 있는 일반 템플릿도 제공합니다.

템플릿을 사용하려면 다음 섹션을 참조하세요.
+ [데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-db.md)
+ [비데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-other.md)

자체 교체 함수를 작성하려면 [교체 함수 쓰기](rotate-secrets_lambda-functions.md)를 참조하세요.

**Contents**
+ [Amazon RDS 및 Amazon Aurora](#RDS_rotation_templates)
  + [Amazon RDS Db2 단일 사용자](#sar-template-db2-singleuser)
  + [Amazon RDS Db2 대체 사용자](#sar-template-db2-multiuser)
  + [Amazon RDS MariaDB 단일 사용자](#sar-template-mariadb-singleuser)
  + [Amazon RDS MariaDB 대체 사용자](#sar-template-mariadb-multiuser)
  + [Amazon RDS 및 Amazon Aurora MySQL 단일 사용자](#sar-template-mysql-singleuser)
  + [Amazon RDS 및 Amazon Aurora MySQL 대체 사용자](#sar-template-mysql-multiuser)
  + [Amazon RDS Oracle 단일 사용자](#sar-template-oracle-singleuser)
  + [Amazon RDS Oracle 대체 사용자](#sar-template-oracle-multiuser)
  + [Amazon RDS 및 Amazon Aurora PostgreSQL 단일 사용자](#sar-template-postgre-singleuser)
  + [Amazon RDS 및 Amazon Aurora PostgreSQL 대체 사용자](#sar-template-postgre-multiuser)
  + [Amazon RDS Microsoft SQLServer 단일 사용자](#sar-template-sqlserver-singleuser)
  + [Amazon RDS Microsoft SQLServer 대체 사용자](#sar-template-sqlserver-multiuser)
+ [Amazon DocumentDB(MongoDB 호환)](#NON-RDS_rotation_templates)
  + [Amazon DocumentDB 단일 사용자](#sar-template-mongodb-singleuser)
  + [Amazon DocumentDB 대체 사용자](#sar-template-mongodb-multiuser)
+ [Amazon Redshift](#template-redshift)
  + [Amazon Redshift 단일 사용자](#sar-template-redshift-singleuser)
  + [Amazon Redshift 대체 사용자](#sar-template-redshift-multiuser)
+ [Amazon Timestream for InfluxDB](#template-TimeStream)
  + [Amazon Timestream for InfluxDB 단일 사용자](#template-TimeStream-singleuser)
  + [Amazon Timestream for InfluxDB 대체 사용자](#template-TimeStream-multiuser)
+ [Amazon ElastiCache](#template-ELC)
+ [Active Directory](#template-AD)
  + [Active Directory 자격 증명](#template-AD-password)
  + [Active Directory keytab](#template-AD-keytab)
+ [다른 유형의 보안 암호](#OTHER_rotation_templates)

## Amazon RDS 및 Amazon Aurora
<a name="RDS_rotation_templates"></a>

### Amazon RDS Db2 단일 사용자
<a name="sar-template-db2-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRDSDb2RotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **`SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationSingleUser/lambda_function.py)
+ **종속성: **[python-ibmdb](https://github.com/ibmdb/python-ibmdb)

### Amazon RDS Db2 대체 사용자
<a name="sar-template-db2-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRDSDb2RotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **`SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드:** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSDb2RotationMultiUser/lambda_function.py)
+ **종속성: **[python-ibmdb](https://github.com/ibmdb/python-ibmdb)

### Amazon RDS MariaDB 단일 사용자
<a name="sar-template-mariadb-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRDSMariaDBRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **`SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationSingleUser/lambda_function.py)
+ **종속성: **PyMySQL 1.0.2. 인증에 sha256 암호를 사용할 경우에는 PyMySQL[rsa]입니다. Lambda 런타임에서 컴파일된 코드가 있는 패키지를 사용하는 방법에 대한 자세한 내용은 **AWS 지식 센터의 [컴파일된 바이너리가 포함된 Python 패키지를 배포 패키지에 추가하고 해당 패키지가 Lambda와 호환되도록 하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-python-package-compatible)를 참조하세요.

### Amazon RDS MariaDB 대체 사용자
<a name="sar-template-mariadb-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRDSMariaDBRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **`SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드:** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMariaDBRotationMultiUser/lambda_function.py)
+ **종속성: **PyMySQL 1.0.2. 인증에 sha256 암호를 사용할 경우에는 PyMySQL[rsa]입니다. Lambda 런타임에서 컴파일된 코드가 있는 패키지를 사용하는 방법에 대한 자세한 내용은 **AWS 지식 센터의 [컴파일된 바이너리가 포함된 Python 패키지를 배포 패키지에 추가하고 해당 패키지가 Lambda와 호환되도록 하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-python-package-compatible)를 참조하세요.

### Amazon RDS 및 Amazon Aurora MySQL 단일 사용자
<a name="sar-template-mysql-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRDSMySQLRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드:** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationSingleUser/lambda_function.py)
+ **종속성: **PyMySQL 1.0.2. 인증에 sha256 암호를 사용할 경우에는 PyMySQL[rsa]입니다. Lambda 런타임에서 컴파일된 코드가 있는 패키지를 사용하는 방법에 대한 자세한 내용은 **AWS 지식 센터의 [컴파일된 바이너리가 포함된 Python 패키지를 배포 패키지에 추가하고 해당 패키지가 Lambda와 호환되도록 하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-python-package-compatible)를 참조하세요.

### Amazon RDS 및 Amazon Aurora MySQL 대체 사용자
<a name="sar-template-mysql-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRDSMySQLRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSMySQLRotationMultiUser/lambda_function.py)
+ **종속성: **PyMySQL 1.0.2. 인증에 sha256 암호를 사용할 경우에는 PyMySQL[rsa]입니다. Lambda 런타임에서 컴파일된 코드가 있는 패키지를 사용하는 방법에 대한 자세한 내용은 **AWS 지식 센터의 [컴파일된 바이너리가 포함된 Python 패키지를 배포 패키지에 추가하고 해당 패키지가 Lambda와 호환되도록 하려면 어떻게 해야 하나요?](https://repost.aws/knowledge-center/lambda-python-package-compatible)를 참조하세요.

### Amazon RDS Oracle 단일 사용자
<a name="sar-template-oracle-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRDSOracleRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationSingleUser/lambda_function.py)
+ **종속성: **[python-oracledb 2.4.1](https://github.com/oracle/python-oracledb)

### Amazon RDS Oracle 대체 사용자
<a name="sar-template-oracle-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRDSOracleRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSOracleRotationMultiUser/lambda_function.py)
+ **종속성: **[python-oracledb 2.4.1](https://github.com/oracle/python-oracledb)

### Amazon RDS 및 Amazon Aurora PostgreSQL 단일 사용자
<a name="sar-template-postgre-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRDSPostgreSQLRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationSingleUser/lambda_function.py)
+ **종속성: **PyGreSQL 5.2.5

### Amazon RDS 및 Amazon Aurora PostgreSQL 대체 사용자
<a name="sar-template-postgre-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRDSPostgreSQLRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSPostgreSQLRotationMultiUser/lambda_function.py)
+ **종속성: **PyGreSQL 5.2.5

### Amazon RDS Microsoft SQLServer 단일 사용자
<a name="sar-template-sqlserver-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRDSSQLServerRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationSingleUser/lambda_function.py)
+ **종속성: **Pymssql 2.2.2

### Amazon RDS Microsoft SQLServer 대체 사용자
<a name="sar-template-sqlserver-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRDSSQLServerRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **예상 `SecretString` 구조:** [Amazon RDS 및 Aurora 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_rds).
+ **소스 코드: **[https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRDSSQLServerRotationMultiUser/lambda_function.py)
+ **종속성: **Pymssql 2.2.2

## Amazon DocumentDB(MongoDB 호환)
<a name="NON-RDS_rotation_templates"></a>

### Amazon DocumentDB 단일 사용자
<a name="sar-template-mongodb-singleuser"></a>
+ **템플릿 이름:** SecretsManagerMongoDBRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **예상 `SecretString` 구조:** [Amazon DocumentDB 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_docdb).
+ **소스 코드:** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationSingleUser/lambda_function.py)
+ **종속성: **PyMongo 4.2.0

### Amazon DocumentDB 대체 사용자
<a name="sar-template-mongodb-multiuser"></a>
+ **템플릿 이름:** SecretsManagerMongoDBRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **예상 `SecretString` 구조:** [Amazon DocumentDB 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_docdb).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerMongoDBRotationMultiUser/lambda_function.py)
+ **종속성: **PyMongo 4.2.0

## Amazon Redshift
<a name="template-redshift"></a>

### Amazon Redshift 단일 사용자
<a name="sar-template-redshift-singleuser"></a>
+ **템플릿 이름:** SecretsManagerRedshiftRotationSingleUser
+ **교체 전략:** [교체 전략: 단일 사용자](rotation-strategy.md#rotating-secrets-one-user-one-password).
+ **예상 `SecretString` 구조:** [Amazon Redshift 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_RS).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationSingleUser/lambda_function.py)
+ **종속성: **PyGreSQL 5.2.5

### Amazon Redshift 대체 사용자
<a name="sar-template-redshift-multiuser"></a>
+ **템플릿 이름:** SecretsManagerRedshiftRotationMultiUser
+ **교체 전략:** [교체 전략: 대체 사용자](rotation-strategy.md#rotating-secrets-two-users).
+ **예상 `SecretString` 구조:** [Amazon Redshift 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_RS).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRedshiftRotationMultiUser/lambda_function.py)
+ **종속성: **PyGreSQL 5.2.5

## Amazon Timestream for InfluxDB
<a name="template-TimeStream"></a>

이러한 템플릿을 사용하려면 **Amazon Timestream 개발자 가이드의 [How Amazon Timestream for InfluxDB uses secrets](https://docs.aws.amazon.com/timestream/latest/developerguide/timestream-for-influx-security-db-secrets.html)를 참조하세요.

### Amazon Timestream for InfluxDB 단일 사용자
<a name="template-TimeStream-singleuser"></a>
+ **템플릿 이름:** SecretsManagerInfluxDBRotationSingleUser
+ **예상 `SecretString` 구조:** [Amazon Timestream for InfluxDB 보안 암호 구조](reference_secret_json_structure.md#reference_secret_json_structure_TIME).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationSingleUser/lambda_function.py)
+ **종속성: **InfluxDB 2.0 python 클라이언트

### Amazon Timestream for InfluxDB 대체 사용자
<a name="template-TimeStream-multiuser"></a>
+ **템플릿 이름:** SecretsManagerInfluxDBRotationMultiUser
+ **예상 `SecretString` 구조:** [Amazon Timestream for InfluxDB 보안 암호 구조](reference_secret_json_structure.md#reference_secret_json_structure_TIME).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationMultiUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerInfluxDBRotationMultiUser/lambda_function.py)
+ **종속성: **InfluxDB 2.0 python 클라이언트

## Amazon ElastiCache
<a name="template-ELC"></a>

이 템플릿을 사용하려면 *Amazon ElastiCache 사용 설명서*의 [사용자를 위한 자동 암호 교체](https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/User-Secrets-Manager.html)를 참조하세요.
+ **템플릿 이름:** SecretsManagerElasticacheUserRotation
+ **예상 `SecretString` 구조:** [Amazon ElastiCache 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_ELC).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerElasticacheUserRotation/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerElasticacheUserRotation/lambda_function.py)

## Active Directory
<a name="template-AD"></a>

### Active Directory 자격 증명
<a name="template-AD-password"></a>
+ **템플릿 이름:** SecretsManagerActiveDirectoryRotationSingleUser
+ **예상 `SecretString` 구조:** [Active Directory 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_AD).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryRotationSingleUser/lambda_function.py)

### Active Directory keytab
<a name="template-AD-keytab"></a>
+ **템플릿 이름:** SecretsManagerActiveDirectoryAndKeytabRotationSingleUser
+ **예상 `SecretString` 구조:** [Active Directory 자격 증명](reference_secret_json_structure.md#reference_secret_json_structure_AD).
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryAndKeytabRotationSingleUser/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerActiveDirectoryAndKeytabRotationSingleUser/lambda_function.py)
+ **종속성:** msktutil

## 다른 유형의 보안 암호
<a name="OTHER_rotation_templates"></a>

Secrets Manager은 이 템플릿을 모든 유형의 보안 암호에 대한 교체 함수를 생성할 수 있는 시작점으로 제공합니다.
+ **템플릿 이름:** SecretsManagerRotationTemplate
+ **소스 코드: ** [https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRotationTemplate/lambda\$1function.py](https://github.com/aws-samples/aws-secrets-manager-rotation-lambdas/tree/master/SecretsManagerRotationTemplate/lambda_function.py)

# 에 대한 Lambda 교체 함수 실행 역할 권한 AWS Secrets Manager
<a name="rotating-secrets-required-permissions-function"></a>

[Lambda 함수로 교체](rotate-secrets_lambda.md)의 경우, Secrets Manager가 Lambda 함수를 사용하여 보안 암호를 교체하면 Lambda는 [IAM 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)을 담당하고 해당 자격 증명을 Lambda 함수 코드에 제공합니다. 자동 교체를 설정하는 방법에 대한 지침은 다음 섹션을 참조하세요.
+ [데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-db.md)
+ [비데이터베이스 보안 암호 자동 교체(콘솔)](rotate-secrets_turn-on-for-other.md)
+ [자동 교체(AWS CLI)](rotate-secrets_turn-on-cli.md)

다음 예제에서는 Lambda 교체 함수 실행 역할에 대한 인라인 정책을 보여 줍니다. 실행 역할을 생성하고 권한 정책을 연결하려면 [AWS Lambda 실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)을 참조하세요.

**Topics**
+ [Lambda 교체 함수 실행 역할에 대한 정책](#rotating-secrets-required-permissions-function-example)
+ [고객 관리형 키에 대한 정책 설명](#rotating-secrets-required-permissions-function-cust-key-example)
+ [대체 사용자 전략에 대한 정책 설명](#rotating-secrets-required-permissions-function-alternating-example)

## Lambda 교체 함수 실행 역할에 대한 정책
<a name="rotating-secrets-required-permissions-function-example"></a>

다음 예제 정책에서는 교체 함수가 다음 작업을 수행할 수 있도록 허용합니다.
+ *SecretARN*에 대한 Secrets Manager 작업을 실행합니다.
+ 새 암호를 생성합니다.
+ 데이터베이스 또는 서비스가 VPC에서 실행되는 경우 필수 구성을 설정하세요. [VPC에서 리소스에 액세스하도록 Lambda 함수 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html)을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:DescribeSecret",
                "secretsmanager:GetSecretValue",
                "secretsmanager:PutSecretValue",
                "secretsmanager:UpdateSecretVersionStage"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

## 고객 관리형 키에 대한 정책 설명
<a name="rotating-secrets-required-permissions-function-cust-key-example"></a>

 AWS 관리형 키 `aws/secretsmanager` 이외의 KMS 키를 사용하여 보안 암호를 암호화할 경우 Lambda 실행 역할에 키 사용 권한을 부여해야 합니다. [SecretARN 암호화 컨텍스트](security-encryption.md#security-encryption-encryption-context)를 사용하여 암호 해독 기능의 사용을 제한할 수 있으므로 교체 함수 역할은 교체를 담당하는 암호의 암호 해독에만 액세스할 수 있습니다. 다음 예시에서는 함수가 KMS 키를 이용하여 비밀을 해독할 수 있도록 실행 역할 정책에 추가할 선언문을 보여 줍니다.

```
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "KMSKeyARN",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:SecretARN": "SecretARN"
                }
            }
        }
```

고객 관리형 키로 암호화된 여러 암호에 교체 기능을 사용하려면 다음 예와 같은 명령문을 추가하여 실행 역할이 암호를 해독하도록 허용하세요.

```
        {
            "Effect": "Allow",
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "KMSKeyARN",
            "Condition": {
                "StringEquals": {
                    "kms:EncryptionContext:SecretARN": [
                        "arn1",
                        "arn2"
                    ]
                }
            }
        }
```

## 대체 사용자 전략에 대한 정책 설명
<a name="rotating-secrets-required-permissions-function-alternating-example"></a>

*대체 사용자 교체 전략*에 대한 자세한 내용은 [Lambda 함수 교체 전략](rotation-strategy.md) 섹션을 참조하세요.

Amazon RDS 보안 인증 정보가 포함된 암호의 경우, 대체 사용자 전략을 사용하고 [Amazon RDS에서 슈퍼 사용자 암호를 관리](rotate-secrets_managed.md)한다면 교체 함수가 Amazon RDS에서 읽기 전용 API를 호출하도록 허용해야 데이터베이스의 연결 정보를 가져올 수도 있습니다. AWS 관리형 정책 [AmazonRDSReadOnlyAccess](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSReadOnlyAccess.html)를 연결하는 것이 좋습니다.

다음 예제 정책에서는 함수가 다음 작업을 수행할 수 있도록 허용합니다.
+ *SecretARN*에 대한 Secrets Manager 작업을 실행합니다.
+ 슈퍼유저 보안 암호에서 보안 인증을 검색합니다. 슈퍼유저 보안 암호의 보안 인증은 Secrets Manager가 교체된 보안 암호의 보안 인증을 업데이트하는 데 사용됩니다.
+ 새 암호를 생성합니다.
+ 데이터베이스 또는 서비스가 VPC에서 실행되는 경우 필수 구성을 설정하세요. 자세한 내용은 [VPC의 리소스에 액세스하도록 Lambda 함수 구성(Configuring a Lambda function to access resources in a VPC)](https://docs.aws.amazon.com/lambda/latest/dg/vpc.html)을 참조하세요.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:DescribeSecret",
                "secretsmanager:GetSecretValue",
                "secretsmanager:PutSecretValue",
                "secretsmanager:UpdateSecretVersionStage"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue"
            ],
            "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName-AbCdEf"
    },
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

# AWS Lambda 교체 함수에 대한 네트워크 액세스
<a name="rotation-function-network-access"></a>

[Lambda 함수로 교체](rotate-secrets_lambda.md)의 경우, Secrets Manager가 Lambda 함수를 사용하여 보안 암호를 교체할 때 Lambda 교체 함수가 보안 암호에 액세스할 수 있어야 합니다. 보안 암호에 보안 인증이 포함된 경우 Lambda 함수가 해당 보안 인증의 소스(예: 데이터베이스 또는 서비스)에도 액세스할 수 있어야 합니다.

**보안 암호에 액세스하려면**  
Lambda 교체 함수는 Secrets Manager 엔드포인트에 액세스할 수 있어야 합니다. Lambda 함수가 인터넷에 액세스할 수 있는 경우 퍼블릭 엔드포인트를 사용할 수 있습니다. 엔드포인트를 찾으려면 [AWS Secrets Manager 엔드포인트](asm_access.md#endpoints) 섹션을 참조하세요.  
Lambda 함수가 인터넷에 액세스할 수 없는 VPC에서 실행되는 경우 VPC 내에서 Secrets Manager 서비스 프라이빗 엔드포인트를 구성하는 것이 좋습니다. 그러면 VPC가 퍼블릭 리전 엔드포인트로 전달된 요청을 가로채서 프라이빗 엔드포인트로 리디렉션할 수 있습니다. 자세한 내용은 [VPC 엔드포인트(AWS PrivateLink)](vpc-endpoint-overview.md) 단원을 참조하십시오.  
또는 VPC에 [NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) 또는 [인터넷 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)를 추가하여 Lambda 함수를 통해 퍼블릭 Secrets Manager 엔드포인트에 액세스할 수 있도록 합니다. 그러면 VPC에서 트래픽이 퍼블릭 엔드포인트에 도달할 수 있습니다. 이렇게 하면 게이트웨이에 대한 IP 주소가 퍼블릭 인터넷에서 공격을 받을 수 있으므로 VPC가 더 많은 위험에 노출됩니다.

**(선택 사항) 데이터베이스 또는 서비스에 액세스하려면**  
보안 암호(예: API 키)의 경우 보안 암호와 함께 업데이트해야 하는 소스 데이터베이스 또는 서비스가 없습니다.  
데이터베이스 또는 인스턴스가 VPC의 Amazon EC2 인스턴스에서 실행 중인 경우, 동일한 VPC에서 Lambda 함수가 실행되도록 구성하는 것이 좋습니다. 그러면 교체 함수가 서비스와 직접 통신할 수 있습니다. 자세한 내용은 [VPC 액세스 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)을 참조하세요.  
Lambda 함수가 데이터베이스 또는 서비스에 액세스하도록 허용하려면 Lambda 교체 함수에 연결된 보안 그룹이 데이터베이스 또는 서비스에 아웃바운드 연결을 허용하는지 확인해야 합니다. 데이터베이스 또는 서비스에 연결된 보안 그룹이 Lambda 교체 함수에 인바운드 연결을 허용하는지도 확인해야 합니다.

# AWS Secrets Manager 교체 문제 해결
<a name="troubleshoot_rotation"></a>

많은 서비스에서 Secrets Manager는 Lambda 함수를 사용하여 보안 암호를 교체합니다. 자세한 내용은 [Lambda 함수로 교체](rotate-secrets_lambda.md) 단원을 참조하십시오. Lambda 교체 함수는 Secrets Manager뿐만 아니라 보안 암호가 사용되는 데이터베이스 또는 서비스와도 상호 작용합니다. 교체가 예상대로 작동하지 않을 경우 먼저 CloudWatch 로그를 확인해야 합니다.

**참고**  
자동 교체 관리를 비롯한 일부 서비스는 보안 암호를 대신 관리할 수 있습니다. 자세한 내용은 [AWS Secrets Manager 보안 암호에 대한 관리형 교체](rotate-secrets_managed.md) 단원을 참조하십시오.

**Topics**
+ [AWS Lambda 함수의 보안 암호 교체 실패 문제를 해결하는 방법](#troubleshooting-secret-rotation-failures)
+ [“환경 변수에서 보안 인증을 찾았습니다.” 이후 활동 없음](#troubleshoot_rotation_timing-out)
+ [“createSecret” 이후 활동 없음](#troubleshoot_rotation_createSecret)
+ [오류: “KMS에 대한 액세스가 허용되지 않습니다.”](#troubleshoot_rotation_kms-key)
+ [오류: “보안 암호 JSON에 키가 없습니다.”](#tshoot-lambda-mismatched-secretvalue)
+ [오류: “setSecret: 데이터베이스에 로그인할 수 없음”](#troubleshoot_rotation_setSecret)
+ [오류: “모듈 'lambda\$1function'을 가져올 수 없음”](#tshoot-python-version)
+ [기존 교체 함수를 Python 3.7에서 3.9로 업그레이드](#troubleshoot_rotation_python39)
+ [기존 교체 함수를 Python 3.9에서 3.10으로 업그레이드](#troubleshoot_rotation_python_310)
+ [AWS Lambda 를 사용한 보안 암호 교체 `PutSecretValue` 실패](#troubleshoot_rotation_putsecretvalue)
+ [오류: "*<a rotation>* 단계에서 Lambda *<arn>*을 실행할 때 오류"](#concurrency-related-failures)

## AWS Lambda 함수의 보안 암호 교체 실패 문제를 해결하는 방법
<a name="troubleshooting-secret-rotation-failures"></a>

Lambda 함수에서 보안 암호 교체 실패가 발생하면 다음 단계에 따라 문제를 해결할 수 있습니다.

### 가능한 원인
<a name="possible-causes"></a>
+ Lambda 함수의 동시 실행 수 부족
+ 교체 중 여러 API 호출로 인한 경쟁 조건
+ Lambda 함수의 잘못된 로직
+ Lambda 함수와 데이터베이스 간의 네트워킹 문제

### 일반적인 문제 해결 단계
<a name="general-troubleshooting-steps"></a>

1. CloudWatch 로그 분석:
   + Lambda 함수 로그에서 구체적인 오류 메시지나 예상치 못한 동작을 확인합니다.
   + 모든 교체 단계(**CreateSecret**, **SetSecret**, **TestSecret**, **FinishSecret**)가 시도되고 있는지 확인합니다.

1. 교체 중 API 호출 검토:
   + Lambda 교체 중 보안 암호에 대한 변경 API 호출을 피합니다.
   + **RotateSecret**와 **PutSecretValue** 호출 간 경쟁 조건이 없는지 확인합니다.

1. Lambda 함수 로직 확인:
   + 보안 암호 교체를 위해 최신 AWS 샘플 코드를 사용하고 있는지 확인합니다.
   + 사용자 지정 코드를 사용하는 경우 모든 교체 단계가 올바르게 처리되는지 검토합니다.

1. 네트워크 구성 확인:
   + Lambda 함수가 데이터베이스에 액세스할 수 있도록 보안 그룹 규칙을 확인합니다.
   + Secrets Manager에 대한 VPC 엔드포인트 또는 퍼블릭 엔드포인트 액세스가 올바른지 확인합니다.

1. 보안 암호 버전 테스트:
   + 보안 암호의 AWSCURRENT 버전이 데이터베이스 액세스를 허용하는지 확인합니다.
   + AWSPREVIOUS 또는 AWSPENDING 버전이 유효한지 확인합니다.

1. 보류 중인 교체 지우기:
   + 교체가 계속 실패하면 AWSPENDING 스테이징 레이블을 제거하고 교체를 재시도합니다.

1. Lambda 동시성 설정 확인:
   + 워크로드에 맞는 동시성 설정인지 확인합니다.
   + 동시성 관련 문제가 의심되면 "동시성 관련 교체 실패 문제 해결" 섹션을 참조하세요.

## “환경 변수에서 보안 인증을 찾았습니다.” 이후 활동 없음
<a name="troubleshoot_rotation_timing-out"></a>

“환경 변수에서 보안 인증을 찾았습니다.” 이후에 활동이 없고 작업이 오래 실행되는 경우(예: 기본 Lambda 제한 시간 30000ms), Secrets Manager 엔드포인트에 연결하는 동안 Lambda 함수가 시간 초과될 수 있습니다.

Lambda 교체 함수는 Secrets Manager 엔드포인트에 액세스할 수 있어야 합니다. Lambda 함수가 인터넷에 액세스할 수 있는 경우 퍼블릭 엔드포인트를 사용할 수 있습니다. 엔드포인트를 찾으려면 [AWS Secrets Manager 엔드포인트](asm_access.md#endpoints) 섹션을 참조하세요.

Lambda 함수가 인터넷에 액세스할 수 없는 VPC에서 실행되는 경우 VPC 내에서 Secrets Manager 서비스 프라이빗 엔드포인트를 구성하는 것이 좋습니다. 그러면 VPC가 퍼블릭 리전 엔드포인트로 전달된 요청을 가로채서 프라이빗 엔드포인트로 리디렉션할 수 있습니다. 자세한 내용은 [VPC 엔드포인트(AWS PrivateLink)](vpc-endpoint-overview.md) 단원을 참조하십시오.

또는 VPC에 [NAT 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) 또는 [인터넷 게이트웨이](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)를 추가하여 Lambda 함수를 통해 퍼블릭 Secrets Manager 엔드포인트에 액세스할 수 있도록 합니다. 그러면 VPC에서 트래픽이 퍼블릭 엔드포인트에 도달할 수 있습니다. 이렇게 하면 게이트웨이에 대한 IP 주소가 퍼블릭 인터넷에서 공격을 받을 수 있으므로 VPC가 더 많은 위험에 노출됩니다.

## “createSecret” 이후 활동 없음
<a name="troubleshoot_rotation_createSecret"></a>

다음은 createSecret 이후에 교체가 중지될 수 있는 문제입니다.

**VPC 네트워크 ACL은 HTTPS 트래픽 송수신을 허용하지 않습니다.**  
자세한 내용은 *Amazon VPC 사용 설명서*의 [네트워크 ACL을 사용하여 서브넷에 대한 트래픽 제어](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html)를 참조하세요.

**Lambda 함수 제한 시간 구성이 너무 짧아서 작업을 수행할 수 없습니다.**  
자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambda 함수 옵션 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html)을 참조하세요.

**Secrets Manager VPC 엔드포인트는 할당된 보안 그룹에서 VPC CIDR 수신을 허용하지 않습니다.**  
자세한 내용은 *Amazon VPC 사용 설명서*의 [보안 그룹을 사용하여 리소스에 대한 트래픽 제어](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)를 참조하세요.

**Secrets Manager VPC 엔드포인트 정책에서는 Lambda에서 VPC 엔드포인트를 사용하는 것을 허용하지 않습니다.**  
자세한 내용은 [AWS Secrets Manager VPC 엔드포인트 사용](vpc-endpoint-overview.md) 단원을 참조하십시오.

**암호는 교대로 사용자를 교체하여 사용하고, 슈퍼 사용자 암호는 Amazon RDS에서 관리하며, Lambda 함수는 RDS API에 액세스할 수 없습니다.**  
슈퍼 사용자 보안 암호를 [다른 AWS 서비스에서 관리하는](service-linked-secrets.md) [대체 사용자 교체](rotation-strategy.md#rotating-secrets-two-users)의 경우, Lambda 교체 함수가 서비스 엔드포인트를 호출하여 데이터베이스 연결 정보를 가져올 수 있어야 합니다. 데이터베이스 서비스의 VPC 엔드포인트를 구성하는 것이 좋습니다. 자세한 내용은 다음 섹션을 참조하세요.  
+  *Amazon RDS 사용 설명서*의 [Amazon RDS API 및 인터페이스 VPC 엔드포인트](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/vpc-interface-endpoints.html).
+ *Amazon Redshift 관리 가이드*의 [VPC 엔드포인트 작업](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-working-with-endpoints.html).

## 오류: “KMS에 대한 액세스가 허용되지 않습니다.”
<a name="troubleshoot_rotation_kms-key"></a>

`ClientError: An error occurred (AccessDeniedException) when calling the GetSecretValue operation: Access to KMS is not allowed`에서 보듯 교체 함수에는 암호를 암호화하는 데 사용된 KMS 키를 사용하여 암호를 해독할 권한이 없습니다. 권한 정책에 암호화 컨텍스트를 특정 보안 암호로 제한하는 조건이 있을 수도 있습니다. 필요한 권한에 대한 자세한 내용은 [고객 관리형 키에 대한 정책 설명](rotating-secrets-required-permissions-function.md#rotating-secrets-required-permissions-function-cust-key-example) 섹션을 참조하세요.

## 오류: “보안 암호 JSON에 키가 없습니다.”
<a name="tshoot-lambda-mismatched-secretvalue"></a>

Lambda 교체 함수를 사용하려면 보안 암호 값이 특정 JSON 구조에 있어야 합니다. 이 오류가 표시되면 JSON에 교체 함수에서 액세스하려는 키가 없을 수 있습니다. 각 보안 암호 유형별 JSON 구조에 대한 자세한 내용은 [AWS Secrets Manager 보안 암호의 JSON 구조](reference_secret_json_structure.md) 섹션을 참조하세요.

## 오류: “setSecret: 데이터베이스에 로그인할 수 없음”
<a name="troubleshoot_rotation_setSecret"></a>

이 오류를 유발할 수 있는 문제는 다음과 같습니다.

**교체 함수가 데이터베이스에 액세스할 수 없습니다.**  
작업 기간이 긴 경우(예: 5000ms 이상) Lambda 교체 함수가 네트워크를 통해 데이터베이스에 액세스하지 못할 수 있습니다.  
데이터베이스 또는 인스턴스가 VPC의 Amazon EC2 인스턴스에서 실행 중인 경우, 동일한 VPC에서 Lambda 함수가 실행되도록 구성하는 것이 좋습니다. 그러면 교체 함수가 서비스와 직접 통신할 수 있습니다. 자세한 내용은 [VPC 액세스 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html#vpc-configuring)을 참조하세요.  
Lambda 함수가 데이터베이스 또는 서비스에 액세스하도록 허용하려면 Lambda 교체 함수에 연결된 보안 그룹이 데이터베이스 또는 서비스에 아웃바운드 연결을 허용하는지 확인해야 합니다. 데이터베이스 또는 서비스에 연결된 보안 그룹이 Lambda 교체 함수에 인바운드 연결을 허용하는지도 확인해야 합니다.

**보안 암호의 보안 인증이 올바르지 않습니다.**  
작업 기간이 짧은 경우 Lambda 교체 함수가 보안 암호의 보안 인증으로 인증하지 못할 수 있습니다. AWS CLI 명령을 사용하여 보안 암호의 `AWSCURRENT` 및 `AWSPREVIOUS` 버전에 있는 정보로 수동으로 로그인하여 자격 증명을 확인합니다[https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html).

**데이터베이스는 `scram-sha-256`을(를) 사용하여 암호를 암호화합니다.**  
데이터베이스가 Aurora PostgreSQL 버전 13 이상이고 `scram-sha-256`을(를) 사용하여 암호를 암호화하지만, 교체 함수가 `scram-sha-256`을(를) 지원하지 않는 `libpq` 버전 9 이하를 사용하는 경우, 교체 함수가 데이터베이스에 연결할 수 없습니다.  

**`scram-sha-256` 암호화를 사용하는 데이터베이스 사용자 확인 방법**
+ [PostgreSQL 13을 위한 RDS의 SCRAM 인증](https://aws.amazon.com/blogs/database/scram-authentication-in-rds-for-postgresql-13/) 블로그에서 *비-SCRAM 암호를 사용하는 사용자의 확인*을 참조하세요.

**해당 교체 함수가 사용하는 `libpq`의 버전 확인 방법**

1. Linux 기반 컴퓨터의 Lambda 콘솔에서 교체 함수로 이동하여 배포 번들을 다운로드합니다. 작업 디렉터리에 zip 파일을 압축 해제합니다.

1. 명령줄의 작업 디렉터리에서 다음을 실행합니다:

   `readelf -a libpq.so.5 | grep RUNPATH`

1. 문자열 *`PostgreSQL-9.4.x`*이 표시되거나 메이저 버전이 10 미만인 경우 교체 함수가 `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]`
   + `scram-sha-256`을(를) 지원하는 교체 함수의 출력:

     `0x000000000000001d (RUNPATH) Library runpath: [/local/p4clients/pkgbuild- a1b2c /workspace/build/PostgreSQL/PostgreSQL-14.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- 14.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일 이전에 자동 보안 암호 교체를 설정한 경우, 교체 함수에는 `scram-sha-256`을 지원하지 않는 이전 버전의 `libpq`가 포함되어 있습니다. `scram-sha-256`을 지원하려면 [교체 함수를 다시 생성](rotate-secrets_turn-on-for-db.md)해야 합니다.

**데이터베이스에 SSL/TLS 액세스가 필요합니다.**  
데이터베이스에 SSL/TLS 연결이 필요하지만 교체 함수가 암호화되지 않은 연결을 사용하는 경우, 교체 함수가 데이터베이스에 연결할 수 없습니다. Amazon RDS(Oracle 및 Db2 제외) 및 Amazon DocumentDB에 대한 교체 함수는 사용 가능한 보안 소켓 계층(SSL) 또는 전송 계층 보안(TLS)을 사용하여 데이터베이스에 연결합니다. 그렇지 않으면 암호화되지 않은 연결을 사용합니다.  
2021년 12월 20일 전에 자동 보안 암호 교체을 설정한 경우, 교체 함수는 SSL/TLS를 지원하지 않는 이전 템플릿을 기반으로 할 수 있습니다. SSL/TLS를 사용하는 연결을 지원하려면 [교체 함수를 재생성](rotate-secrets_turn-on-for-db.md)해야 합니다.

**교체 함수가 언제 생성되었는지 확인하려면**

1. Secrets Manager 콘솔([https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/))에서 보안 암호를 엽니다. **교체 구성(Rotation configuration)** 섹션의 **Lambda 교체 함수(Lambda rotation function)**에서 `arn:aws:lambda:aws-region:123456789012:function:SecretsManagerMyRotationFunction `과 같은 **Lambda 함수 ARN(Lambda function ARN)**을 볼 수 있습니다. ARN 끝에서 함수 이름을 복사합니다(이 예에서는 ` SecretsManagerMyRotationFunction `입니다).

1.  AWS Lambda 콘솔 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) **함수**에서 검색 상자에 Lambda 함수 이름을 붙여 넣고 Enter를 선택한 다음 Lambda 함수를 선택합니다.

1. 함수 세부 정보 페이지의 **구성(Configuration)** 탭에서, **태그(Tags)** 아래의 **aws:cloudformation:stack-name** 키 옆에 있는 값을 복사합니다.

1.  AWS CloudFormation 콘솔 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) **스택**에서 검색 상자에 키 값을 붙여넣은 다음 Enter를 선택합니다.

1. 스택 목록은 Lambda 교체 함수를 생성한 스택만 표시되도록 필터링합니다. **생성된 날짜(Created date)** 열에서 스택이 생성된 날짜를 확인합니다. 이것은 Lambda 교체 함수가 생성된 날짜입니다.

## 오류: “모듈 'lambda\$1function'을 가져올 수 없음”
<a name="tshoot-python-version"></a>

Python 3.7에서 최신 버전의 Python으로 자동 업그레이드된 이전 Lambda 함수를 실행하는 경우 이 오류가 발생할 수 있습니다. 오류를 해결하려면 Lambda 함수 버전을 다시 Python 3.7로 변경한 다음 [기존 교체 함수를 Python 3.7에서 3.9로 업그레이드](#troubleshoot_rotation_python39) 합니다. 자세한 내용은 *AWS re:Post*에서 [Secrets Manager Lambda 함수 교체가 “pg 모듈을 찾을 수 없음” 오류로 인해 실패한 이유는 무엇인가요?](https://repost.aws/knowledge-center/secrets-manager-lambda-rotation)를 참조하세요.

## 기존 교체 함수를 Python 3.7에서 3.9로 업그레이드
<a name="troubleshoot_rotation_python39"></a>

2022년 11월 이전에 생성된 일부 교체 함수는 Python 3.7을 사용했습니다. Python용 AWS SDK는 2023년 12월에 Python 3.7 지원을 중단했습니다. 자세한 내용은 [AWS SDKs](https://aws.amazon.com/blogs/developer/python-support-policy-updates-for-aws-sdks-and-tools/). Python 3.9를 사용하는 새 교체 함수로 전환하려면 기존 교체 함수에 런타임 속성을 추가하거나 교체 함수를 다시 생성할 수 있습니다.

**Python 3.7을 사용하는 Lambda 교체 함수를 찾으려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. **함수** 목록에서 **SecretsManager** 를 필터링합니다.

1. 필터링된 함수 목록의 **런타임**에서 Python 3.7을 찾습니다.

**Topics**
+ [옵션 1:를 사용하여 교체 함수 다시 생성 CloudFormation](#update-python-opt-1)
+ [옵션 2:를 사용하여 기존 교체 함수의 런타임 업데이트 CloudFormation](#update-python-opt-2)
+ [옵션 3: AWS CDK 사용자의 경우 CDK 라이브러리 업그레이드](#update-python-opt-3)

### 옵션 1:를 사용하여 교체 함수 다시 생성 CloudFormation
<a name="update-python-opt-1"></a>

Secrets Manager 콘솔을 사용하여 교체를 켜면 Secrets Manager는 CloudFormation 를 사용하여 Lambda 교체 함수를 포함하여 필요한 리소스를 생성합니다. 콘솔을 사용하여 교체를 켜거나 CloudFormation 스택을 사용하여 교체 함수를 생성한 경우 동일한 CloudFormation 스택을 사용하여 새 이름으로 교체 함수를 다시 생성할 수 있습니다. 새 함수는 최신 버전의 Python을 사용합니다.

**교체 함수를 생성한 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**

**교체 함수를 다시 생성하려면(CloudFormation)**

1. 에서 이름으로 스택을 CloudFormation검색한 다음 **업데이트를** 선택합니다.

   루트 스택 업데이트를 권장하는 대화 상자가 나타나면 **루트 스택으로 이동**을 선택한 다음 **업데이트**를 선택합니다.

1. **스택 업데이트** 페이지의 **템플릿 준비** 에서 **Application Composer에서 편집**을 선택한 다음, **Application Composer에서 템플릿 편집**에서 **Application Composer에서 편집** 버튼을 선택합니다.

1. Application Composer에서 다음을 수행합니다.

   1. 템플릿 코드에 있는 `SecretRotationScheduleHostedRotationLambda`의 `"functionName": "SecretsManagerTestRotationRDS"` 값을 새 함수 이름(예: JSON의 경우 `"functionName": "SecretsManagerTestRotationRDSupdated"`)으로 바꿉니다.

   1. **템플릿 업데이트**를 선택합니다.

   1. ** CloudFormation계속하기** 대화 상자에서 **확인 후 CloudFormation계속 진행**을 선택하여 계속합니다.

1.  CloudFormation 스택 워크플로를 계속 진행한 다음 **제출**을 선택합니다.

### 옵션 2:를 사용하여 기존 교체 함수의 런타임 업데이트 CloudFormation
<a name="update-python-opt-2"></a>

Secrets Manager 콘솔을 사용하여 교체를 켜면 Secrets Manager는 CloudFormation 를 사용하여 Lambda 교체 함수를 포함하여 필요한 리소스를 생성합니다. 콘솔을 사용하여 교체를 켜거나 CloudFormation 스택을 사용하여 교체 함수를 생성한 경우 동일한 CloudFormation 스택을 사용하여 교체 함수의 런타임을 업데이트할 수 있습니다.

**교체 함수를 생성한 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**

**교체 함수의 런타임을 업데이트하려면(CloudFormation)**

1. 에서 이름으로 스택을 CloudFormation검색한 다음 **업데이트를** 선택합니다.

   루트 스택 업데이트를 권장하는 대화 상자가 나타나면 **루트 스택으로 이동**을 선택한 다음 **업데이트**를 선택합니다.

1. **스택 업데이트** 페이지의 **템플릿 준비** 에서 **Application Composer에서 편집**을 선택한 다음, **Application Composer에서 템플릿 편집**에서 **Application Composer에서 편집** 버튼을 선택합니다.

1. Application Composer에서 다음을 수행합니다.

   1. 템플릿 JSON에서 `SecretRotationScheduleHostedRotationLambda`의 경우 `Properties` 아래의 `Parameters`에서 **"runtime": "python3.9"**을 추가합니다.

   1. **템플릿 업데이트**를 선택합니다.

   1. ** CloudFormation계속하기** 대화 상자에서 **확인 후 CloudFormation계속 진행**을 선택하여 계속합니다.

1.  CloudFormation 스택 워크플로를 계속 진행한 다음 **제출**을 선택합니다.

### 옵션 3: AWS CDK 사용자의 경우 CDK 라이브러리 업그레이드
<a name="update-python-opt-3"></a>

버전 v2.94.0 AWS CDK 이전를 사용하여 보안 암호에 대한 교체를 설정한 경우 v2.94.0 이상으로 업그레이드하여 Lambda 함수를 업데이트할 수 있습니다. 자세한 내용은 [AWS Cloud Development Kit (AWS CDK) v2 개발자 가이드](https://docs.aws.amazon.com/cdk/v2/guide/home.html)를 참조하세요.

## 기존 교체 함수를 Python 3.9에서 3.10으로 업그레이드
<a name="troubleshoot_rotation_python_310"></a>

Secrets Manager는 Lambda 교체 함수에서 Python 3.9에서 3.10으로 전환하고 있습니다. Python 3.10을 사용하는 새 교체 함수로 전환하려면, 배포 방법에 따라 업그레이드 경로를 따라야 합니다. 아래 절차를 통해 Python 버전과 기본 종속성을 모두 업그레이드할 수 있습니다.

**Python 3.9를 사용하는 Lambda 교체 함수를 찾으려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. **함수** 목록에서 **SecretsManager** 를 필터링합니다.

1. 필터링된 함수 목록에서 **런타임**이 **Python 3.9**로 설정된 함수를 확인합니다.

### 배포 방법별 경로 업데이트
<a name="update-python-3.9-paths"></a>

이 목록에 식별된 Lambda 교체 함수는 Secrets Manager 콘솔, AWS Serverless Application Repository 앱 또는 CloudFormation 변환을 통해 배포할 수 있습니다. 각 배포 방식에 따라 업그레이드 경로가 다릅니다.

함수가 배포된 방식을 기준으로, 다음 절차 중 하나를 사용하여 Lambda 교체 함수를 업데이트합니다.

------
#### [ AWS Secrets Manager console-deployed functions ]

기존 Lambda 함수에 대한 종속성을 수동으로 업데이트할 수 없으므로 AWS Secrets Manager 콘솔을 통해 새 Lambda 함수를 배포해야 합니다.

 AWS Secrets Manager 콘솔에서 배포한 함수를 업그레이드하려면 다음 절차를 따르십시오.

1. [https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)에서 Secrets Manager 콘솔을 엽니다.

1. **AWS Secrets Manager**에서 **보안 암호**를 선택합니다. 업데이트하려는 Lambda 함수를 사용하는 보안 암호를 선택합니다.

1. **교체** 탭으로 이동하여 **교체 구성 업데이트** 옵션을 선택합니다.

1. **교체 함수**에서 **새 함수 생성**을 선택하고 새 Lambda 교체 함수 이름을 입력합니다.

   1. (선택 사항) 업데이트가 완료되면, 업데이트된 Lambda 함수가 정상 작동하는지 테스트할 수 있습니다. **교체** 탭에서 **즉시 보안 암호 교체**를 선택하여 즉시 교체를 실행합니다.

   1. (선택 사항) Amazon CloudWatch에서 함수 로그와 런타임에서 사용된 Python 버전을 확인할 수 있습니다. 자세한 내용은 *AWS Lambda 개발자 가이드*의 [Lambada 함수에 대한 CloudWatch Logs 보기](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs-view.html#monitoring-cloudwatchlogs-console)를 참조하세요.

1. 새 교체 함수 설정이 완료되면 이전 교체 함수를 삭제할 수 있습니다.

------
#### [ AWS Serverless Application Repository deployments ]

다음 절차에서는 AWS Serverless Application Repository 배포를 업그레이드하는 방법을 보여줍니다. AWS Serverless Application Repository 를 통해 배포된 Lambda 함수에는 함수가 속한 Lambda 애플리케이션에 대한 링크가 `This function belongs to an application. Click here to manage it.` 포함된 배너가 있습니다.

**중요**  
AWS Serverless Application Repository 가용성은 AWS 리전 종속적입니다.

 AWS Serverless Application Repository 배포된 함수를 업데이트하려면 다음 절차를 따르십시오.

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1. 업데이트가 필요한 Lambda 함수의 **구성** 탭으로 이동합니다.

   1. 배포된 AWS Serverless Application Repository 애플리케이션을 업데이트할 때 함수에 대한 다음 정보가 필요합니다. 이 정보는 Lambda 콘솔에서 확인할 수 있습니다.
     + **Lambda 애플리케이션 이름**
       + Lambda 애플리케이션 이름은 배너에 있는 링크를 통해 확인할 수 있습니다. 예를 들어, 배너에 `serverlessrepo-SecretsManagerRedshiftRotationSingleUser`라고 표시된 경우, 애플리케이션 이름은 `SecretsManagerRedshiftRotationSingleUser`입니다.
     + **Lambda 교체 함수 이름**
     + **Secrets Manager 엔드포인트**
       + 이 엔드포인트는 **구성** 탭과 **환경 변수** 탭에서 **SECRETS\$1MANAGER\$1ENDPOINT** 변수에 할당된 값을 통해 확인할 수 있습니다.

1. Python 버전을 업그레이드하려면, 서버리스 애플리케이션의 시맨틱 버전을 업데이트해야 합니다. 자세한 내용은 *AWS Serverless Application Repository 개발자 가이드*의 [애플리케이션 업데이트](https://docs.aws.amazon.com/serverlessrepo/latest/devguide/serverlessrepo-how-to-consume-new-version.html#update-applications)를 참조하세요.

------
#### [ Custom Lambda rotation functions ]

사용자 지정 Lambda 교체 함수를 생성한 경우, 각 함수의 패키지 종속성과 런타임을 업그레이드해야 합니다. 자세한 내용은 [Lambda 함수 런타임을 최신 버전으로 업그레이드](https://repost.aws/knowledge-center/lambda-upgrade-function-runtime)를 참조하세요.

------
#### [ AWS::SecretsManager-2024-09-16 transform macro ]

Lambda 함수가 이 변환을 통해 배포된 경우, [기존 템플릿을 사용하여 스택을 업데이트](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-updating-stacks-direct.html)하면 업데이트된 Lambda 런타임을 사용할 수 있습니다.

기존 템플릿을 사용하여 CloudFormation 스택을 업데이트하려면 다음 절차를 따르십시오.

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1. **스택** 페이지에서 업데이트하려는 스택을 선택합니다.

1. 스택 세부 정보 창에서 **업데이트**를 선택합니다.

1. **템플릿 업데이트 방법 선택** 화면에서 **직접 업데이트**를 선택합니다.

1. **템플릿 지정** 페이지에서 **기존 템플릿 사용**을 선택합니다.

1. 나머지 옵션은 기본값으로 유지한 후 **스택 업데이트**를 선택합니다.

스택 업데이트 중 문제가 발생하면 *CloudFormation 사용 설명서*의 [스택 실패 원인 파악](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/determine-root-cause-for-stack-failures.html)을 참조하세요.

------
#### [ AWS::SecretsManager-2020-07-23 transform macro ]

`AWS::SecretsManager-2020-07-23`를 사용 중이라면 최신 변환 버전으로 마이그레이션하는 것을 권장합니다. 자세한 내용은 *AWS 보안 블로그*[의 AWS Secrets Manager 변환의 향상된 버전 소개: AWS::SecretsManager-2024-09-16](https://aws.amazon.com/blogs/security/introducing-an-enhanced-version-of-the-aws-secrets-manager-transform-awssecretsmanager-2024-09-16/)를 참조하세요. 만약 `AWS::SecretsManager-2020-07-23`를 계속 사용하면 런타임 버전과 Lambda 함수 코드 아티팩트 간 불일치 오류가 발생할 수 있습니다. 자세한 내용은 *CloudFormation 템플릿 참조*의 [AWS::SecretsManager::RotationSchedule HostedRotationLambda](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-secretsmanager-rotationschedule-hostedrotationlambda.html#cfn-secretsmanager-rotationschedule-hostedrotationlambda-runtime) 섹션을 확인하세요.

스택 업데이트 중 문제가 발생하면 *CloudFormation 사용 설명서*의 [스택 실패 원인 파악](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/determine-root-cause-for-stack-failures.html)을 참조하세요.

------

**Python 업그레이드 확인**  
Python 업그레이드를 확인하려면 Lambda 콘솔([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/))을 열고 **함수** 페이지에 액세스합니다. 업데이트한 함수를 선택합니다. **코드 소스** 섹션에서 디렉터리에 포함된 파일을 검토하고 Python .so 파일이 버전 `3.10`인지 확인합니다.

## AWS Lambda 를 사용한 보안 암호 교체 `PutSecretValue` 실패
<a name="troubleshoot_rotation_putsecretvalue"></a>

Secrets Manager에서 수임된 역할 또는 교차 계정 교체를 사용하는 경우, CloudTrail에서 다음과 같은 메시지와 함께 **RotationFailed** 이벤트가 나타날 수 있습니다. Pending secret version *VERSION\$1ID *for Secret *SECRET\$1ARN * was not created by *Lambda LAMBDA\$1ARN.* 이 경우 `AWSPENDING` 스테이징 레이블을 제거하고 교체를 다시 시작한 다음, Lambda 함수를 업데이트하여 `RotationToken` 파라미터를 사용정해야 합니다.<a name="troubleshoot_rotation_procedure"></a>

## `RotationToken`을 포함하도록 Lambda 교체 함수 업데이트
<a name="troubleshoot_rotation_procedure"></a>

1. Lambda 함수 코드 다운로드
   + Lambda 콘솔을 엽니다.
   + 탐색 창에서 **함수**를 선택합니다.
   + **함수 이름**에서 Lambda 보안 암호 교체 함수를 선택합니다.
   + **다운로드**에서 **함수 코드 .zip**, **AWS SAM 파일**, **둘 다** 중 하나를 선택합니다.
   + **확인**을 선택하여 로컬 시스템에 함수를 저장합니다.

1. `Lambda_handler` 편집

   교차 계정 교체를 위해 create\$1secret 단계에 rotation\$1token 파라미터를 포함시킵니다.

   ```
   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")
   ```

1. `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))
   ```

1. 업데이트된 Lambda 함수 코드 업로드

   Lambda 함수 코드를 업데이트한 후 [업로드하여 보안 암호를 교체](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-zip.html#configuration-function-update)합니다.

## 오류: "*<a rotation>* 단계에서 Lambda *<arn>*을 실행할 때 오류"
<a name="concurrency-related-failures"></a>

만약 Lambda 함수가 **CreateSecret**과 **SetSecret** 단계 사이에서 반복적으로 멈추는 등 간헐적인 보안 암호 교체 실패가 발생한다면, 문제는 동시성 설정과 관련이 있을 수 있습니다.

### 동시성 문제 해결 단계
<a name="concurrency-troubleshooting-steps"></a>

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

1. Lambda 동시성 설정 확인 및 조정:
   + `reserved_concurrent_executions` 값이 너무 낮게 설정되어 있지 않은지 확인합니다(예: 1).
   + 예약된 동시성을 사용하는 경우 10 이상으로 설정합니다.
   + 더 유연하게 사용하려면 예약되지 않은 동시성을 고려합니다.

1. 프로비저닝된 동시성 사용 시:
   + 프로비저닝 동시성 파라미터를 명시적으로 설정하지 마세요(예: Terraform에서).
   + 반드시 설정해야 하는 경우 10 이상의 값을 사용합니다.
   + 선택한 값이 실제 사용 사례에 적합한지 충분히 테스트합니다.

1. 동시성 모니터링 및 조정:
   + 다음 공식을 사용하여 동시성을 계산합니다. 동시성 수 = (초당 평균 요청 수) \$1 (요청 평균 처리 시간(초)) 자세한 내용은 [예약된 동시성 예측](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#estimating-reserved-concurrency)을 참조하세요.
   + 교체 중에 값을 관찰하고 기록하여 적절한 동시성 설정을 결정합니다.
   + 낮은 동시성 값을 설정할 경우 주의합니다. 실행 스레드가 충분하지 않으면 스로틀링이 발생할 수 있습니다.

Lambda 동시성 구성에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 [예약된 동시성 구성](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html) 및 [프로비저닝된 동시성 구성을](https://docs.aws.amazon.com/lambda/latest/dg/provisioned-concurrency.html) 참조하세요.