

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

# Python을 사용하여 Secrets Manager 보안 암호 값 가져오기
<a name="retrieving-secrets-python"></a>

애플리케이션에서 `GetSecretValue` 또는 SDK`BatchGetSecretValue`를 호출하여 보안 암호를 검색할 수 있습니다. AWS SDKs 그러나 클라이언트 측 캐싱을 사용하여 보안 암호 값을 캐싱하는 것이 좋습니다. 보안 암호 캐싱은 속도를 향상시키고 비용을 절감합니다.

**Topics**
+ [클라이언트 측 캐싱과 함께 Python을 사용하여 Secrets Manager 보안 암호 값 가져오기](retrieving-secrets_cache-python.md)
+ [Python AWS SDK를 사용하여 Secrets Manager 보안 암호 값 가져오기](retrieving-secrets-python-sdk.md)
+ [Python AWS SDK를 사용하여 Secrets Manager 보안 암호 값 배치 가져오기](retrieving-secrets-python-batch.md)

# 클라이언트 측 캐싱과 함께 Python을 사용하여 Secrets Manager 보안 암호 값 가져오기
<a name="retrieving-secrets_cache-python"></a>

보안 암호를 검색할 때 Secret Manager Python 기반 캐싱 구성 요소를 사용하여 나중에 사용할 수 있도록 캐싱할 수 있습니다. 캐싱된 보안 암호를 검색하는 것이 Secret Manager에서 검색하는 것보다 빠릅니다. Secrets Manager API를 호출하는 데는 비용이 발생하므로 캐시를 사용하면 비용을 줄일 수 있습니다. 암호를 검색할 수 있는 모든 방법은 [보안 암호 가져오기](retrieving-secrets.md)을(를) 참조하세요.

캐시 정책은 LRU(가장 오랫동안 사용되지 않음)이므로, 캐시에서 보안 암호를 폐기해야 하는 경우 가장 오랫동안 사용되지 않은 보안 암호가 삭제됩니다. 기본적으로 캐시는 보안 암호를 매시간 새로 고칩니다. 캐시에서 [보안 암호를 새로 고치는 주기](retrieving-secrets_cache-ref-secretcacheconfig.md)를 구성하고 [보안 암호 검색에 연결](retrieving-secrets_cache-ref-secretcachehook.md)하여 더 많은 기능을 추가할 수 있습니다.

캐시 참조가 해제되면 캐시는 가비지 수집을 강제로 적용하지 않습니다. 캐시 구현에는 캐시 무효화가 포함되지 않습니다. 캐시 구현은 캐시 자체에 중점을 두며, 보안을 강화하거나 보안에 초점을 맞추지 않습니다. 캐시에서 항목 암호화와 같은 추가 보안이 필요한 경우 제공된 인터페이스 및 추상 메서드를 사용하세요.

이 구성 요소를 사용하려면 다음이 필요합니다.
+ Python 3.6 이상
+ botocore 1.12 이상. [AWS SDK for Python](https://aws.amazon.com/sdk-for-python/) 및 [Botocore](https://botocore.amazonaws.com/v1/documentation/api/latest/index.html)를 참조하세요.
+ setuptools\$1scm 3.2 이상. [https://pypi.org/project/setuptools-scm/](https://pypi.org/project/setuptools-scm/)을 참조하세요.

소스 코드를 다운로드하려면 GitHub의 [Secrets Manager Python 기반 캐싱 클라이언트 구성 요소](https://github.com/aws/aws-secretsmanager-caching-python )를 참조하세요.

구성 요소를 설치하려면 다음 명령을 사용합니다.

```
$ pip install aws-secretsmanager-caching
```

**필요한 권한:**
+ `secretsmanager:DescribeSecret`
+ `secretsmanager:GetSecretValue`

자세한 내용은 [권한 참조](auth-and-access.md#reference_iam-permissions) 단원을 참조하십시오.

**Topics**
+ [SecretCache](retrieving-secrets_cache-ref-secretcache.md)
+ [SecretCacheConfig](retrieving-secrets_cache-ref-secretcacheconfig.md)
+ [SecretCacheHook](retrieving-secrets_cache-ref-secretcachehook.md)
+ [@InjectSecretString](retrieving-secrets_cache-decor-string.md)
+ [@InjectKeywordedSecretString](retrieving-secrets_cache-decor-keyword.md)

**Example 보안 암호 검색**  
다음 예에서는 *mysecret*이라는 보안 암호에 대한 보안 암호 값을 가져오는 방법을 보여 줍니다.  

```
import botocore 
import botocore.session 
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig 

client = botocore.session.get_session().create_client('secretsmanager')
cache_config = SecretCacheConfig()
cache = SecretCache( config = cache_config, client = client)

secret = cache.get_secret_string('mysecret')
```

# SecretCache
<a name="retrieving-secrets_cache-ref-secretcache"></a>

Secret Manager에서 검색된 암호에 대한 인 메모리 캐시. [get\$1secret\$1string](#retrieving-secrets_cache-ref-secretcache_get_secret_string) 또는 [get\$1secret\$1binary](#retrieving-secrets_cache-ref-secretcache_get_secret_binary)를 사용하여 캐시에서 보안 암호를 검색합니다. 생성자의 [SecretCacheConfig](retrieving-secrets_cache-ref-secretcacheconfig.md) 객체에 전달하여 캐시 설정을 구성할 수 있습니다.

예제를 포함한 자세한 내용은 [클라이언트 측 캐싱과 함께 Python을 사용하여 Secrets Manager 보안 암호 값 가져오기](retrieving-secrets_cache-python.md)을 참조하세요.

```
cache = SecretCache(
    config = SecretCacheConfig,
    client = [client](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager.html)
)
```

**Topics**
+ [get\$1secret\$1string](#retrieving-secrets_cache-ref-secretcache_get_secret_string)
+ [get\$1secret\$1binary](#retrieving-secrets_cache-ref-secretcache_get_secret_binary)

## get\$1secret\$1string
<a name="retrieving-secrets_cache-ref-secretcache_get_secret_string"></a>

보안 암호 문자열 값을 검색합니다.

요청 구문  

```
response = cache.get_secret_string(
    secret_id='string',
    version_stage='string' )
```

Parameters  
+ `secret_id`(*문자열*) [필수] 보안 암호의 ARN 이름.
+ `version_stage`(*문자열*) 검색하려는 보안 암호의 버전. 자세한 내용은 [보안 암호 버전](whats-in-a-secret.md)을 참조하세요. 기본값은 'AWSCURRENT'입니다.

반환 타입  
문자열

## get\$1secret\$1binary
<a name="retrieving-secrets_cache-ref-secretcache_get_secret_binary"></a>

보안 암호 이진 값을 검색합니다.

요청 구문  

```
response = cache.get_secret_binary(
    secret_id='string',
    version_stage='string'
)
```

Parameters  
+ `secret_id`(*문자열*) [필수] 보안 암호의 ARN 이름.
+ `version_stage`(*문자열*) 검색하려는 보안 암호의 버전. 자세한 내용은 [보안 암호 버전](whats-in-a-secret.md)을 참조하세요. 기본값은 'AWSCURRENT'입니다.

반환 타입  
[Base64로 인코딩](https://tools.ietf.org/html/rfc4648#section-4)된 문자열

# SecretCacheConfig
<a name="retrieving-secrets_cache-ref-secretcacheconfig"></a>

캐싱된 보안 암호에 대한 최대 캐시 크기 및 유지 시간(TTL)과 같은 [SecretCache](retrieving-secrets_cache-ref-secretcache.md)에 대한 캐시 구성 옵션.Parameters

`max_cache_size` (*int*)  
최대 캐시 크기. 기본값은 보안 암호 `1024`개입니다.

`exception_retry_delay_base` (*int*)  
예외가 발생한 후 요청을 재시도하기 전에 대기할 시간(초). 기본값은 `1`입니다.

`exception_retry_growth_factor` (*int*)pur  
실패한 요청 재시도 간의 대기 시간을 계산하는 데 사용할 성장 계수. 기본값은 `2`입니다.

`exception_retry_delay_max` (*int*)  
실패한 요청 사이에 대기할 최대 시간(초). 기본값은 `3600`입니다.

`default_version_stage` (*str*)  
캐싱할 보안 암호의 버전. 자세한 내용은 [보안 암호 버전](whats-in-a-secret.md#term_version)을 참조하세요. 기본값은 `'AWSCURRENT'`입니다.

`secret_refresh_interval` (*int*)  
캐싱된 보안 암호 정보를 새로 고치는 동안 대기할 시간(초). 기본값은 `3600`입니다.

`secret_cache_hook` (*SecretCacheHook*)  
`SecretCacheHook` 추상 클래스의 구현. 기본값은 `None`입니다.

# SecretCacheHook
<a name="retrieving-secrets_cache-ref-secretcachehook"></a>

캐시에 저장 중인 보안 암호에 대한 작업을 수행하기 위해 [SecretCache](retrieving-secrets_cache-ref-secretcache.md)에 연결되는 인터페이스.

**Topics**
+ [put](#retrieving-secrets_cache-ref-secretcachehook_put)
+ [시작](#retrieving-secrets_cache-ref-secretcachehook_get)

## put
<a name="retrieving-secrets_cache-ref-secretcachehook_put"></a>

캐시에 저장할 객체를 준비합니다.

요청 구문  

```
response = hook.put(
    obj='secret_object'
)
```

Parameters  
+ `obj` (*객체*) -- [필수] 보안 암호 또는 보안 암호를 포함하는 객체.

반환 타입  
객체

## 시작
<a name="retrieving-secrets_cache-ref-secretcachehook_get"></a>

캐싱된 객체에서 객체를 추출합니다.

요청 구문  

```
response = hook.get(
    obj='secret_object'
)
```

Parameters  
+ `obj`(*객체*) [필수] 보안 암호 또는 보안 암호를 포함하는 객체.

반환 타입  
객체

# @InjectSecretString
<a name="retrieving-secrets_cache-decor-string"></a>

이 데코레이터는 첫 번째와 두 번째 인수로 보안 암호 ID 문자열과 [SecretCache](retrieving-secrets_cache-ref-secretcache.md)을(를) 기대합니다. 데코레이터는 보안 암호 문자열 값을 반환합니다. 보안 암호는 문자열을 포함해야 합니다.

```
from aws_secretsmanager_caching import SecretCache 
from aws_secretsmanager_caching import InjectKeywordedSecretString,  InjectSecretString 

cache = SecretCache()

@InjectSecretString ( 'mysecret' ,  cache ) 
def function_to_be_decorated( arg1,  arg2,  arg3):
```

# @InjectKeywordedSecretString
<a name="retrieving-secrets_cache-decor-keyword"></a>

이 데코레이터는 첫 번째와 두 번째 인수로 보안 암호 ID 문자열과 [SecretCache](retrieving-secrets_cache-ref-secretcache.md)을(를) 기대합니다. 나머지 인수는 래핑된 함수의 파라미터를 보안 암호의 JSON 키로 매핑합니다. 보안 암호에는 JSON 구조의 문자열이 포함되어야 합니다.

이 JSON이 포함된 보안 암호의 경우:

```
{
  "username": "saanvi",
  "password": "EXAMPLE-PASSWORD"
}
```

다음 예에서는 보안 암호에서 `username`과 `password`에 대한 JSON 값을 추출하는 방법을 보여줍니다.

```
from aws_secretsmanager_caching import SecretCache 
  from aws_secretsmanager_caching import InjectKeywordedSecretString,  InjectSecretString 
  
  cache = SecretCache()
  
  @InjectKeywordedSecretString ( secret_id = 'mysecret' ,  cache = cache ,  func_username = 'username' ,  func_password = 'password' ) 
  def function_to_be_decorated( func_username,  func_password):
       print( 'Do something with the func_username and func_password parameters')
```

# Python AWS SDK를 사용하여 Secrets Manager 보안 암호 값 가져오기
<a name="retrieving-secrets-python-sdk"></a>

애플리케이션에서 `GetSecretValue` 또는 SDK`BatchGetSecretValue`를 호출하여 보안 암호를 검색할 수 있습니다. AWS SDKs 그러나 클라이언트 측 캐싱을 사용하여 보안 암호 값을 캐싱하는 것이 좋습니다. 보안 암호 캐싱은 속도를 향상시키고 비용을 절감합니다.

Python 애플리케이션의 경우 [Secrets Manager Python 기반 캐싱 구성 요소](retrieving-secrets_cache-python.md)를 사용하거나 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager/client/get_secret_value.html](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager/client/get_secret_value.html) 또는 [https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager/client/batch_get_secret_value.html](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/secretsmanager/client/batch_get_secret_value.html)를 사용하여 SDK를 직접 호출합니다.

다음 코드 예시는 `GetSecretValue`의 사용 방법을 보여 줍니다.

**필요한 권한:**`secretsmanager:GetSecretValue`

```
"""
Purpose

Shows how to use the AWS SDK for Python (Boto3) with AWS
Secrets Manager to get a specific of secrets that match a
specified name
"""
import boto3
import logging

from get_secret_value import GetSecretWrapper

# Configure logging
logging.basicConfig(level=logging.INFO)


def run_scenario(secret_name):
    """
    Retrieve a secret from AWS Secrets Manager.

    :param secret_name: Name of the secret to retrieve.
    :type secret_name: str
    """
    try:
        # Validate secret_name
        if not secret_name:
            raise ValueError("Secret name must be provided.")
        # Retrieve the secret by name
        client = boto3.client("secretsmanager")
        wrapper = GetSecretWrapper(client)
        secret = wrapper.get_secret(secret_name)
        # Note: Secrets should not be logged.
        return secret
    except Exception as e:
        logging.error(f"Error retrieving secret: {e}")
        raise

class GetSecretWrapper:
    def __init__(self, secretsmanager_client):
        self.client = secretsmanager_client


    def get_secret(self, secret_name):
        """
        Retrieve individual secrets from AWS Secrets Manager using the get_secret_value API.
        This function assumes the stack mentioned in the source code README has been successfully deployed.
        This stack includes 7 secrets, all of which have names beginning with "mySecret".

        :param secret_name: The name of the secret fetched.
        :type secret_name: str
        """
        try:
            get_secret_value_response = self.client.get_secret_value(
                SecretId=secret_name
            )
            logging.info("Secret retrieved successfully.")
            return get_secret_value_response["SecretString"]
        except self.client.exceptions.ResourceNotFoundException:
            msg = f"The requested secret {secret_name} was not found."
            logger.info(msg)
            return msg
        except Exception as e:
            logger.error(f"An unknown error occurred: {str(e)}.")
            raise
```

# Python AWS SDK를 사용하여 Secrets Manager 보안 암호 값 배치 가져오기
<a name="retrieving-secrets-python-batch"></a>

다음 코드 예시에서는 Secrets Manager 보안 암호 값의 배치를 가져오는 방법을 보여줍니다.

**필요한 권한:**
+ `secretsmanager:BatchGetSecretValue` 
+ 검색할 각 보안 암호에 대한 `secretsmanager:GetSecretValue` 권한이 있어야 합니다.
+ 필터를 사용하는 경우 `secretsmanager:ListSecrets`도 있어야 합니다.

권한 정책 예시는 [예: 보안 암호 값 그룹을 일괄적으로 검색할 수 있는 권한](auth-and-access_iam-policies.md#auth-and-access_examples_batch) 섹션을 참조하세요.

**중요**  
검색 중인 그룹에서 개별 보안 암호를 검색할 수 있는 권한을 거부하는 VPCE 정책이 있는 경우 `BatchGetSecretValue`는 보안 암호 값을 반환하지 않고 오류를 반환합니다.

```
class BatchGetSecretsWrapper:
    def __init__(self, secretsmanager_client):
        self.client = secretsmanager_client


    def batch_get_secrets(self, filter_name):
        """
        Retrieve multiple secrets from AWS Secrets Manager using the batch_get_secret_value API.
        This function assumes the stack mentioned in the source code README has been successfully deployed.
        This stack includes 7 secrets, all of which have names beginning with "mySecret".

        :param filter_name: The full or partial name of secrets to be fetched.
        :type filter_name: str
        """
        try:
            secrets = []
            response = self.client.batch_get_secret_value(
                Filters=[{"Key": "name", "Values": [f"{filter_name}"]}]
            )
            for secret in response["SecretValues"]:
                secrets.append(json.loads(secret["SecretString"]))
            if secrets:
                logger.info("Secrets retrieved successfully.")
            else:
                logger.info("Zero secrets returned without error.")
            return secrets
        except self.client.exceptions.ResourceNotFoundException:
            msg = f"One or more requested secrets were not found with filter: {filter_name}"
            logger.info(msg)
            return msg
        except Exception as e:
            logger.error(f"An unknown error occurred:\n{str(e)}.")
            raise
```