

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

# AWS SDK for C\$1\$1에서 서비스 클라이언트 구성
<a name="configuring"></a>

 프로그래밍 방식으로 AWS 서비스에 액세스하기 위해 AWS SDK for C\$1\$1는 각각의 AWS 서비스에 대해 클라이언트 클래스를 사용합니다. 예를 들어, 애플리케이션이 Amazon EC2에 액세스해야 하는 경우, 애플리케이션은 Amazon EC2 클라이언트 객체를 생성하여 해당 서비스와 인터페이스 합니다. 그런 다음 서비스 클라이언트를 사용하여 요청을 AWS 서비스에 보내면 됩니다.

AWS 서비스를 요청하려면 먼저 서비스 클라이언트를 생성해야 합니다. 코드에 사용된 각 AWS 서비스에는 해당 서비스와 상호 작용하기 위한 자체 라이브러리와 전용 유형이 있습니다. 클라이언트는 서비스가 제공하는 각 API 작업마다 하나의 메서드를 노출합니다.

SDK 동작을 구성하는 방법은 다양하지만, 궁극적으로 모든 것은 서비스 클라이언트의 동작과 관련이 있습니다. 구성에서 생성된 서비스 클라이언트가 사용될 때까지 해당 구성은 적용되지 않습니다.

AWS 서비스로 개발할 때는 코드가 AWS에서 인증되는 방법을 설정해야 합니다. 사용하려는 AWS 리전도 설정해야 합니다.

[AWS SDK 및 도구 참조 안내서](https://docs.aws.amazon.com/sdkref/latest/guide/)에는 많은 AWS SDK에 공통적인 설정, 기능 및 기타 기본 개념도 포함되어 있습니다.

**Topics**
+ [SDK 구성](sdkoptions.md)
+ [외부에서 클라이언트 구성](config-external.md)
+ [코드 내 클라이언트 구성](client-config.md)
+ [AWS 리전](region.md)
+ [보안 인증 공급자](credproviders.md)
+ [CMake 파라미터](cmake-params.md)
+ [로깅](logging.md)
+ [HTTP](overriding-http-client.md)
+ [`HttpClient` 및 `AWSClient`에서 사용하는 입출력 스트림 제어](configuring-iostreams.md)
+ [사용자 지정 libcrypto 사용](libcrypto.md)

# AWS SDK for C\$1\$1에서 `Aws::SDKOptions`를 사용한 일반 구성
<a name="sdkoptions"></a>

[https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/struct_aws_1_1_s_d_k_options.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/struct_aws_1_1_s_d_k_options.html) 구조체에는 SDK 구성 옵션이 포함되어 있습니다. `Aws::SDKOptions`는 일반 SDK 구성에 중점을 두는 반면, [`ClientConfiguration`](client-config.md) 구조체는 AWS 서비스와의 통신 구성에 중점을 둡니다.

[https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/struct_aws_1_1_s_d_k_options.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/struct_aws_1_1_s_d_k_options.html)의 인스턴스는 [`Aws::InitAPI` 및 `Aws::ShutdownAPI` 메서드](basic-use.md)에 전달됩니다. 두 메서드 모두에 동일한 인스턴스를 전송해야 합니다.

다음 샘플은 사용 가능한 몇 가지 옵션을 보여줍니다.
+ 기본 로거를 사용하여 로깅 켜기

  ```
  Aws::SDKOptions options;
  options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;
  Aws::InitAPI(options);
  {
      // make your SDK calls here.
  }
  Aws::ShutdownAPI(options);
  ```
+ 기본 HTTP 클라이언트 팩토리 재정의

  ```
  Aws::SDKOptions options;
  options.httpOptions.httpClientFactory_create_fn = [](){
          return Aws::MakeShared<MyCustomHttpClientFactory>(
              "ALLOC_TAG", arg1);
      };
  Aws::InitAPI(options);
  {
      // make your SDK calls here.
  }
  Aws::ShutdownAPI(options);
  ```
**참고**  
 `httpOptions`는 `std::shared_ptr` 대신 클로저(익명 함수 또는 Lambda 표현식이라고도 함)를 받습니다. 각 SDK 팩토리 함수는 팩토리 메모리 할당이 발생하는 시점에 메모리 관리자가 아직 설치되지 않았기 때문에 이러한 방식으로 작동합니다. 메서드에 클로저를 전달하면 메모리 할당이 안전하게 수행될 수 있을 때 메모리 관리자가 호출되어 메모리 할당을 수행합니다. 이 절차를 수행하는 간단한 기법은 Lambda 표현식을 사용하는 것입니다.
+ 글로벌 `SIGPIPE` 핸들러 사용

  curl 및 OpenSSL을 사용하여 SDK for C\$1\$1를 빌드하는 경우 신호 핸들러를 지정해야 합니다. 자체 사용자 지정 신호 핸들러를 사용하지 않는 경우 `installSigPipeHandler`를 `true`로 설정합니다.

  ```
  Aws::SDKOptions options;
  options.httpOptions.installSigPipeHandler = true; 
  Aws::InitAPI(options);
  {
      // make your SDK calls here.
  }
  Aws::ShutdownAPI(options);
  ```

  `installSigPipeHandler`가 `true`인 경우 SDK for C\$1\$1에서는 `SIGPIPE` 신호를 무시하는 핸들러를 사용합니다. `SIGPIPE`에 대한 자세한 내용은 GNU 운영 체제 웹 사이트에서 [Operation Error Signals](https://www.gnu.org/software/libc/manual/html_node/Operation-Error-Signals.html)를 참조하세요. curl 핸들러에 대한 자세한 내용은 curl 웹 사이트에 설명된 [CURLOPT\$1NOSIGNAL](https://curl.se/libcurl/c/CURLOPT_NOSIGNAL.html)을 참조하세요.

  curl 및 OpenSSL의 기본 라이브러리는 원격 측이 연결을 종료할 때 `SIGPIPE` 신호를 전송하여 알릴 수 있습니다. 이러한 신호는 애플리케이션에서 처리해야 합니다. 이 curl 기능에 대한 자세한 내용은 curl 웹 사이트에서 [libcurl thread safety](https://curl.se/libcurl/c/threadsafe.html)를 참조하세요. 신호 핸들러는 각 애플리케이션에 전역적으로 적용되며 라이브러리는 SDK의 종속성이므로 이 동작은 SDK에 자동으로 내장되지 않습니다.

# 외부에서 SDK for C\$1\$1 서비스 클라이언트 구성
<a name="config-external"></a>

코드 외부에서 많은 구성 설정을 처리할 수 있습니다. 구성이 외부에서 처리되면 모든 애플리케이션에 구성이 적용됩니다. 대부분의 구성 설정은 환경 변수로 설정하거나 별도의 공유 AWS `config` 파일로 설정할 수 있습니다. 공유 `config` 파일은 프로필이라는 별도의 설정 세트를 유지하여 다양한 환경 또는 테스트에 대해 다양한 구성을 제공할 수 있습니다.

환경 변수와 공유 `config` 파일 설정은 표준화되어 있으며 다양한 프로그래밍 언어와 애플리케이션에서 일관된 기능을 지원하기 위해 AWS SDK 및 도구 전반에 걸쳐 공유됩니다.

이러한 방법을 통해 애플리케이션을 구성하는 방법과 교차 SDK 설정에 대한 자세한 정보를 알아보려면 **AWS SDK 및 도구 참조 안내서를 참조하세요. 환경 변수 또는 구성 파일에서 SDK가 확인할 수 있는 모든 설정을 보려면 **AWS SDK 및 도구 참조 안내서에 나와 있는 [설정 참조](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html)를 참조하세요.

AWS 서비스에 요청하려면 먼저 해당 서비스의 클라이언트를 인스턴스화합니다. 제한 시간, HTTP 클라이언트 및 재시도 구성을 비롯하여 서비스 클라이언트에 대한 공통 설정을 구성할 수 있습니다.

각 서비스 클라이언트에는 AWS 리전 및 자격 증명 공급자가 필요합니다. SDK는 이러한 값을 사용하여 리소스의 올바른 리전으로 요청을 보내고 올바른 자격 증명으로 요청에 서명합니다. 이러한 값은 코드에서 프로그래밍 방식으로 지정하거나 환경에서 자동으로 로드할 수 있습니다.

SDK에는 구성 설정 값을 찾기 위해 확인하는 일련의 위치(또는 소스)가 있습니다.

1. 코드나 서비스 클라이언트 자체에 설정된 모든 명시적 설정은 다른 모든 설정보다 우선합니다.

1. 환경 변수
   + 환경 변수를 설정하는 방법에 대한 자세한 내용은 **AWS SDK 및 도구 참조 안내서에서 [환경 변수 지원](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html)을 참조하세요.
   + 쉘 환경 변수는 시스템 전체, 사용자 전체, 특정 터미널 세션 등 다양한 수준에서 구성할 수 있습니다.

1. 공유 `config` 및 `credentials` 파일
   + 이 파일 설정에 관한 자세한 정보를 알아보려면 *AWS SDK 및 도구 참조 안내서*에 나와 있는 [공유 `config` 및 `credentials` 파일](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)을 참조하세요.

1. SDK 소스 코드 자체에서 제공하는 모든 기본값이 마지막에 사용됩니다.
   + 리전과 같은 일부 속성에는 기본값이 없습니다. 코드, 환경 설정 또는 공유 `config` 파일에서 이를 명시적으로 지정해야 합니다. SDK가 필요한 구성을 확인할 수 없는 경우 API 요청이 런타임에 실패할 수 있습니다.

**참고**  
 환경 변수 또는 구성 파일에서 SDK가 확인할 수 있는 모든 설정을 보려면 **AWS SDK 및 도구 참조 안내서에 나와 있는 [설정 참조](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html)를 참조하세요.

# 코드에서 AWS SDK for C\$1\$1 서비스 클라이언트 구성
<a name="client-config"></a>

구성을 코드 내에서 직접 처리할 경우 구성 범위는 해당 코드를 사용하는 애플리케이션으로 제한됩니다. 해당 애플리케이션 내에는 모든 서비스 클라이언트의 글로벌 구성, 특정 AWS 서비스 유형의 모든 클라이언트에 대한 구성 또는 특정 서비스 클라이언트 인스턴스에 대한 구성에 대한 옵션이 있습니다.

AWS SDK for C\$1\$1에는 애플리케이션에서 사용하는 AWS 서비스와 상호 작용하는 기능을 제공하는 AWS 서비스 클라이언트 클래스가 포함되어 있습니다. SDK for C\$1\$1에서는 기본 클라이언트 구성을 변경할 수 있으며, 이는 다음과 같은 작업을 수행할 때 유용합니다.
+ 프록시를 통해 인터넷에 연결
+ 연결 제한 시간 및 요청 재시도 등 HTTP 전송 설정 변경
+ TCP 소켓 버퍼 크기 힌트 지정

`ClientConfiguration`는 코드에서 인스턴스화하고 활용할 수 있는 SDK for C\$1\$1의 구조입니다. 다음 스니펫은 이 클래스를 사용하여 프록시를 통해 Amazon S3에 액세스하는 방법을 보여줍니다.

```
Aws::Client::ClientConfiguration clientConfig;
clientConfig.proxyHost = "localhost";
clientConfig.proxyPort = 1234;
clientConfig.proxyScheme = Aws::Http::Scheme::HTTPS;
Aws::S3::S3Client(clientConfig);
```

## 구성 변수 선언
<a name="config-vars-declarations"></a>

 `ClientConfiguration` 구조체는 다음과 같이 멤버 변수를 선언합니다.

```
Aws::String accountId;
Aws::String accountIdEndpointMode = "preferred";
bool allowSystemProxy = false;
Aws::String appId;
Aws::String caPath;
Aws::String caFile;

struct {
  RequestChecksumCalculation requestChecksumCalculation = RequestChecksumCalculation::WHEN_SUPPORTED;
  ResponseChecksumValidation responseChecksumValidation = ResponseChecksumValidation::WHEN_SUPPORTED;
} checksumConfig;

ProviderFactories configFactories = ProviderFactories::defaultFactories;
long connectTimeoutMs = 1000;

struct CredentialProviderConfiguration {
    Aws::String profile;
    Aws::String region;
    struct {
        long metadataServiceNumAttempts = 1;
        long metadataServiceTimeout = 1;
        std::shared_ptr<RetryStrategy> imdsRetryStrategy;
        bool disableImdsV1;
        bool disableImds;
    } imdsConfig;
    struct STSCredentialsCredentialProviderConfiguration {
        Aws::String roleArn;
        Aws::String sessionName;
        Aws::String tokenFilePath;
        std::chrono::milliseconds retrieveCredentialsFutureTimeout = std::chrono::seconds(10);
    } stsCredentialsProviderConfig;
} credentialProviderConfig;

bool disableExpectHeader = false;
bool disableIMDS = false;
bool disableImdsV1 = false;
bool enableClockSkewAdjustment = true;
Aws::Crt::Optional<bool> enableEndpointDiscovery;
bool enableHostPrefixInjection = true;
bool enableHttpClientTrace = false;
bool enableTcpKeepAlive = true;
Aws::String endpointOverride;
std::shared_ptr<Aws::Utils::Threading::Executor> executor = nullptr;
FollowRedirectsPolicy followRedirects;
Aws::Http::TransferLibType httpLibOverride;
Aws::Http::TransferLibPerformanceMode httpLibPerfMode = Http::TransferLibPerformanceMode::LOW_LATENCY;
long httpRequestTimeoutMs = 0;
unsigned long lowSpeedLimit = 1;
unsigned maxConnections = 25;
Aws::Utils::Array<Aws::String> nonProxyHosts;
Aws::String profileName;
Aws::String proxyCaFile;
Aws::String proxyCaPath;
Aws::Http::Scheme proxyScheme;
Aws::String proxyHost;
unsigned proxyPort = 0;
Aws::String proxyUserName;
Aws::String proxyPassword;
Aws::String proxySSLCertPath;
Aws::String proxySSLCertType;
Aws::String proxySSLKeyPath;
Aws::String proxySSLKeyType;
Aws::String proxySSLKeyPassword;
std::shared_ptr<Aws::Utils::RateLimits::RateLimiterInterface> readRateLimiter = nullptr;
Aws::String region;
Aws::Client::RequestCompressionConfig requestCompressionConfig;
long requestTimeoutMs = 0;
std::shared_ptr<RetryStrategy> retryStrategy = nullptr;
Aws::Http::Scheme scheme;
unsigned long tcpKeepAliveIntervalMs = 30000;
std::shared_ptr<smithy::components::tracing::TelemetryProvider> telemetryProvider;
Aws::String userAgent;
bool useDualStack = false;
bool useFIPS = false;
bool verifySSL = true;
Aws::Http::Version version = Http::Version::HTTP_VERSION_2TLS;

struct WinHTTPOptions {
  bool useAnonymousAuth = false;
} winHTTPOptions;

std::shared_ptr<Aws::Utils::RateLimits::RateLimiterInterface> writeRateLimiter = nullptr;

static Aws::String LoadConfigFromEnvOrProfile(const Aws::String& envKey, const Aws::String& profile,
                                              const Aws::String& profileProperty, const Aws::Vector<Aws::String>& allowedValues,
                                              const Aws::String& defaultValue);
```

## 구성 변수 설명
<a name="configuration-variables"></a>

다음 목록은 클라이언트 동작을 사용자 지정하는 데 사용할 수 있는 `ClientConfiguration` 멤버 변수를 설명합니다.

**accountId**  
계정 기반 엔드포인트 라우팅의 AWS 계정 ID를 지정합니다. 111122223333 형식을 사용합니다. 계정 기반 엔드포인트 라우팅을 사용하면 일부 서비스의 요청 성능이 향상됩니다.

**accountIdEndpointMode**  
계정 기반 엔드포인트 라우팅 동작을 제어합니다. 유효한 값은 "required", "disabled", "preferred" 중 하나입니다. 기본값은 "preferred"입니다. 필요한 경우 계정 기반 엔드포인트 라우팅을 끄려면 "disabled"로 설정합니다.

**allowSystemProxy**  
HTTP 클라이언트에서 시스템 프록시 설정을 검색할지 여부를 제어합니다. 기본 설정은 false입니다. 자동 프록시 검색을 활성화하려면 true로 설정합니다.

**appId**  
애플리케이션별 식별자(선택 사항)를 지정합니다. 설정할 경우 이 값이`User-Agent` 헤더에 `App/{appId}` 형식으로 추가됩니다. 이 값은 `AWS_SDK_UA_APP_ID` 환경 변수 또는 `sdk_ua_app_id` 공유 구성 프로필 속성을 사용하여 설정할 수 있습니다.

**caPath, caFile**  
HTTP 클라이언트에 SSL 인증서 트러스트 스토어를 찾을 위치를 지시합니다. 예제 트러스트 스토어는 OpenSSL `c_rehash` 유틸리티로 준비된 디렉터리일 수 있습니다. 환경에서 symlink를 사용하지 않는 한 이러한 변수를 설정할 필요가 없습니다. Windows 및 macOS 시스템에서는 이 변수들이 아무런 영향을 미치지 않습니다.

**checksumConfig**  
체크섬 계산 및 검증 설정을 포함합니다. `requestChecksumCalculation` 및 `responseChecksumValidation`으로 구성되며 기본값은 WHEN\$1SUPPORTED입니다.

**configFactories**  
클라이언트 유틸리티 클래스(`Executor` 및 `RetryStrategy`)를 초기화하기 위한 팩토리 메서드를 지정합니다. 재정의하지 않는 한 기본 팩토리가 사용됩니다.

**requestTimeoutMs 및 connectTimeoutMs**  
HTTP 요청의 제한 시간까지 대기할 시간(밀리초)을 지정합니다. 예를 들어, 대용량 파일을 전송할 경우에는 이 시간을 늘리는 것이 좋습니다.

**credentialProviderConfig**  
자격 증명 공급자에 대한 구성 설정을 포함합니다. 이 구조를 사용하여 SDK에서 AWS 자격 증명을 얻는 방법을 사용자 지정합니다.

**disableExpectHeader**  
CURL HTTP 클라이언트에만 적용됩니다. 기본적으로 CURL은 HTTP 헤더 수신 직후 서버가 오류로 응답하는 상황에서 HTTP 페이로드 전송을 방지하기 위해 HTTP 요청에 “Expect: 100-Continue” 헤더를 추가합니다. 이 동작으로 왕복 통신을 절약할 수 있으며 페이로드가 작고 네트워크 지연 시간이 우려되는 상황에서 유용합니다. 이 변수의 기본 설정은 false입니다. true로 설정하면 CURL에 HTTP 요청 헤더와 본문 페이로드를 모두 함께 전송하도록 지시합니다.

**disableIMDS**  
인스턴스 메타데이터 서비스(IMDS) 호출을 비활성화할지 여부를 제어합니다. 기본 설정은 false입니다. EC2 인스턴스 외부에서 실행될 때 IMDS 호출을 비활성화하려면 true로 설정합니다.

**disableImdsV1**  
IMDSv2 호출은 허용하면서 IMDSv1 호출을 비활성화할지 여부를 제어합니다. 기본 설정은 false입니다. 보안 강화를 위해 IMDSv1 호출만 비활성화하려면 true로 설정합니다.

**enableClockSkewAdjustment**  
매 HTTP 시도 후 클록 스큐를 조정할지 여부를 제어합니다. 기본 설정은 false입니다.

**enableEndpointDiscovery**  
엔드포인트 검색 사용 여부를 제어합니다. 기본적으로 리전 엔드포인트 또는 재정의된 엔드포인트가 사용됩니다. 엔드포인트 검색을 활성화하려면 이 변수를 true로 설정합니다.

**enableHostPrefixInjection**  
HTTP 호스트가 DiscoverInstances 요청에 "data-" 접두사를 추가할지 여부를 제어합니다. 기본적으로 이 동작은 활성화되어 있습니다. 비활성화하려면 이 변수를 false로 설정합니다.

**enableHttpClientTrace**  
디버깅을 위해 HTTP 클라이언트 추적을 활성화할지 여부를 제어합니다. 기본 설정은 false입니다. 자세한 HTTP 요청 및 응답 로깅을 활성화하려면 true로 설정합니다.

**enableTcpKeepAlive**  
TCP 연결 유지 패킷을 전송할지 여부를 제어합니다. 기본 설정은 true입니다. `tcpKeepAliveIntervalMs` 변수와 함께 사용합니다. WinINet 및 IXMLHTTPRequest2 클라이언트에는 이 변수를 적용할 수 없습니다.

**endpointOverride**  
서비스와 통신할 때 사용할 재정의 HTTP 엔드포인트를 지정합니다.

**executor**  
비동기식 Executor 핸들러의 구현을 참조합니다. 기본 동작은 각 비동기 호출마다 스레드를 생성하고 분리하는 것입니다. 이 동작을 변경하려면 `Executor` 클래스의 하위 클래스를 구현하고 해당 인스턴스를 이 변수에 할당합니다.

**followRedirects**  
HTTP 300 리디렉션 코드 처리 시 동작을 제어합니다.

**httpLibOverride**  
기본 HTTP 팩토리에서 반환하는 HTTP 구현을 지정합니다. Windows의 기본 HTTP 클라이언트는 WinHTTP입니다. 다른 모든 플랫폼의 기본 HTTP 클라이언트는 CURL입니다.

**httpLibPerfMode**  
HTTP 라이브러리 성능 모드를 지정합니다. 기본 설정은 LOW\$1LATENCY입니다. 이 설정을 조정하여 다양한 성능 특성에 맞게 최적화할 수 있습니다.

**httpRequestTimeoutMs**  
HTTP 요청 제한 시간(밀리초)을 지정합니다. 기본값은 0(제한 시간 없음)입니다. 대용량 파일을 전송할 경우에는 이 값을 늘리는 것이 좋습니다.

**lowSpeedLimit**  
허용되는 최소 전송 속도(바이트/초)를 지정합니다. 전송 속도가 지정된 속도 아래로 떨어지면 전송 작업이 중단됩니다. 기본 설정은 1바이트/초입니다. 이 변수는 CURL 클라이언트에만 적용됩니다.

**maxConnections**  
단일 서버에 대한 최대 HTTP 연결 수를 지정합니다. 기본값은 25입니다. 대역폭이 합리적으로 지원하는 범위 외에는 허용되는 최대값이 없습니다.

**nonProxyHosts**  
프록시 설정을 우회해야 하는 호스트 이름 배열을 지정합니다. 프록시 구성에서 특정 호스트를 제외하려면 이 설정을 사용합니다.

**profileName**  
구성에 사용할 AWS 프로필 이름을 지정합니다. SDK는 AWS 구성 파일의 지정된 프로필에서 설정을 로드합니다.

**proxyCaFile**  
기본값과 다른 경우 프록시 연결용 인증 기관 파일의 경로를 지정합니다.

**proxyCaPath**  
기본값과 다른 경우 프록시 연결용 인증 기관 트러스트 스토어의 경로를 지정합니다.

**proxyScheme, proxyHost, proxyPort, proxyUserName 및 proxyPassword**  
AWS와의 모든 통신에 대한 프록시를 설정하고 구성하는 데 사용됩니다. 이 기능이 유용할 수 있는 예시로는 Burp Suite와 함께 디버깅을 수행하거나, 프록시를 사용하여 인터넷에 연결하는 경우가 있습니다.

**proxySSLCertPath**  
클라이언트 인증서가 필요한 프록시 연결용 SSL 인증서 파일의 경로를 지정합니다.

**proxySSLCertType**  
프록시 연결에 사용할 SSL 인증서 유형을 지정합니다. 일반적인 유형으로는 PEM과 DER이 있습니다.

**proxySSLKeyPassword**  
키가 암호로 보호된 경우 프록시 연결에 사용되는 SSL 프라이빗 키의 암호를 지정합니다.

**proxySSLKeyPath**  
클라이언트 인증서가 필요한 프록시 연결용 SSL 프라이빗 키 파일의 경로를 지정합니다.

**proxySSLKeyType**  
프록시 연결에 사용할 SSL 프라이빗 키 유형을 지정합니다. 일반적인 유형으로는 PEM과 DER이 있습니다.

**writeRateLimiter 및 readRateLimiter**  
전송 계층에서 사용하는 대역폭을 스로틀링하는 데 사용되는 읽기 및 쓰기 속도 제한기 구현에 대한 참조입니다. 기본적으로 읽기 및 쓰기 속도는 스로틀링되지 않습니다. 스로틀링을 도입하려면 `RateLimiterInterface`의 하위 클래스를 구현하고 해당 인스턴스를 이 변수에 할당합니다.

**region**  
사용할 AWS 리전을 지정합니다(예: *us-east-1*). 기본적으로 사용되는 리전은 해당 AWS 자격 증명에 구성된 기본 리전입니다.

**requestCompressionConfig**  
요청 압축에 대한 구성 설정을 포함합니다. 이 구조를 사용하여 전송 전에 요청이 압축되는 시기와 방식을 제어합니다.

**retryStrategy**  
재시도 전략의 구현을 참조합니다. 기본 전략은 지수 백오프 정책을 구현합니다. 다른 전략을 수행하려면 `RetryStrategy` 클래스의 하위 클래스를 구현하고 해당 인스턴스를 이 변수에 할당합니다.

**scheme**  
URI 주소 지정 체계를 HTTP 또는 HTTPS로 지정합니다. 기본 체계는 HTTPS입니다.

**tcpKeepAliveIntervalMs**  
TCP 연결을 통해 연결 유지 패킷을 전송할 시간 간격(밀리초)을 지정합니다. 기본 간격은 30초입니다. 최소 설정은 15초입니다. WinINet 및 IXMLHTTPRequest2 클라이언트에는 이 변수를 적용할 수 없습니다.

**telemetryProvider**  
지표 및 추적 데이터를 수집하기 위한 원격 측정 공급자 구현을 참조합니다. 관찰성 특성을 활성화하려면 이 설정을 구성합니다.

**userAgent**  
내부용입니다. 이 변수의 설정은 변경하지 않습니다.

**useDualStack**  
듀얼 스택 IPv4 및 IPv6 엔드포인트를 사용할지 여부를 제어합니다. 모든 AWS 서비스가 모든 리전에서 IPv6를 지원하는 것은 아닙니다.

**useFIPS**  
Federal Information Processing Standards(FIPS) 140-2로 검증된 암호화 모듈을 사용할지 여부를 제어합니다. 기본 설정은 false입니다. FIPS 규정 준수가 필요한 경우 true로 설정합니다.

**verifySSL**  
SSL 인증서 확인 여부를 제어합니다. 기본적으로 SSL 인증서를 확인합니다. 확인을 비활성화하려면 변수를 false로 설정합니다.

**version**  
요청에 사용할 HTTP 버전을 지정합니다. 기본 설정은 HTTP\$1VERSION\$12TLS(TLS를 통한 HTTP/2)입니다.

**winHTTPOptions**  
Windows별 HTTP 구성 옵션을 포함합니다. 기본 설정이 false인 useAnonymousAuth를 포함합니다.

# AWS SDK for C\$1\$1에 AWS 리전 대한 설정
<a name="region"></a>

를 사용하여 특정 지리적 영역에서 AWS 서비스 작동하는에 액세스할 수 있습니다 AWS 리전. 이는 중복성은 물론, 데이터와 애플리케이션을 고객과 고객의 사용자가 액세스할 위치에 가까운 곳에서 실행 상태로 유지하는 데도 유용할 수 있습니다.

**중요**  
대부분의 리소스는 특정에 상주 AWS 리전 하며 SDK를 사용할 때 리소스에 대한 올바른 리전을 제공해야 합니다.

공유 AWS `config` 파일 또는 환경 변수를 통해 기본 리전을 설정하는 방법에 대한 예제는 SDK 및 도구 참조 안내서[AWS 리전](https://docs.aws.amazon.com/sdkref/latest/guide/feature-region.html)의 섹션을 참조하세요. *AWS SDKs *

 AWS SDK for C\$1\$1 AWS 요청에 AWS 리전 사용할의 기본값을 설정해야 합니다. 이 기본값은 리전이 지정되지 않은 모든 SDK 서비스 메서드 직접 호출에 사용됩니다. SDK for C\$1\$1에서는 [코드 내 클라이언트 구성](client-config.md)를 사용하여 기본 리전을 설정할 수도 있습니다.

# AWS SDK for C\$1\$1 자격 증명 공급자 사용
<a name="credproviders"></a>

 에 대한 모든 요청은에서 발급한 자격 증명을 사용하여 암호화 방식으로 서명해야 AWS 합니다 AWS. 런타임에 SDK는 여러 위치를 확인하여 자격 증명의 구성 값을 검색합니다.

를 사용한 인증은 코드베이스 외부에서 처리할 AWS 수 있습니다. SDK는 자격 증명 공급자 체인을 사용하여 많은 인증 방법을 자동으로 감지하고 사용하며 새로 고칠 수 있습니다.

프로젝트의 AWS 인증을 시작하기 위한 안내 옵션은 *AWS SDKs 및 도구 참조 안내서*의 [인증 및 액세스를](https://docs.aws.amazon.com/sdkref/latest/guide/access.html) 참조하세요.

## 자격 증명 공급자 체인
<a name="credproviders-default-credentials-provider-chain"></a>

클라이언트를 구성할 때 자격 증명 공급자를 명시적으로 지정하지 않으면 SDK for C\$1\$1는 자격 증명을 제공할 수 있는 일련의 위치를 확인하는 자격 증명 공급자 체인을 사용합니다. 이러한 위치 중 하나에서 자격 증명을 찾으면 검색이 중지됩니다.

### 자격 증명 가져오기 순서
<a name="credproviders-credential-retrieval-order"></a>

모든 SDK에는 AWS 서비스에 요청하는 데 사용할 유효한 보안 인증을 얻기 위해 확인하는 일련의 장소(또는 소스)가 있습니다. 유효한 보안 인증 정보를 찾은 후에는 검색이 중지됩니다. 이러한 체계적인 검색을 자격 증명 공급자 체인이라고 합니다.

체인의 각 단계마다 값을 설정하는 다양한 방법이 있습니다. 코드에서 직접 값을 설정하는 것이 항상 우선하며, 환경 변수로를 설정한 다음 공유 AWS `config` 파일에서를 설정합니다. 자세한 내용은AWS SDK 및 도구 참조 안내서**의 [Precedence of settings](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html#precedenceOfSettings)를 참조하세요.

SDK는 공유 AWS `config` 및 `credentials` 파일의 `[default]` 프로필에서 자격 증명을 로드하려고 시도합니다. `AWS_PROFILE` 환경 변수를 사용하여 `[default]`를 사용하는 대신 SDK가 로드할 명명된 프로파일을 선택할 수 있습니다. `config` 및 `credentials` 파일은 AWS SDKs 및 도구에서 공유됩니다. *AWS SDKs 및 도구 참조 가이드*에는 모든 AWS SDKs 및에서 사용하는 SDK 구성 설정에 대한 정보가 있습니다 AWS CLI. 공유 AWS `config` 파일을 통해 SDK를 구성하는 방법에 대한 자세한 내용은 [공유 구성 및 자격 증명 파일을](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html) 참조하세요. 환경 변수 설정을 통해 SDK를 구성하는 방법에 관해 자세히 알아보려면 [Environment variables support](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html) 단원을 참조하세요.

를 인증하기 위해 SDK for C\$1\$1 AWS는 자격 증명 공급자를 다음 순서로 확인합니다.

1. **AWS 액세스 키(임시 및 장기 자격 증명)**

   SDK는 `AWS_ACCESS_KEY_ID` 및 `AWS_SECRET_ACCESS_KEY`, `AWS_SESSION_TOKEN` 환경 변수 또는 공유 AWS `credentials` 파일에서 자격 증명을 로드하려고 시도합니다.
   +  이 공급자 구성에 대한 지침은 **AWS SDK 및 도구 참조 안내서에서 [AWS 액세스 키](https://docs.aws.amazon.com/sdkref/latest/guide/access-users.html)를 참조하세요.
   +  이 공급자의 SDK 구성 속성에 대한 자세한 내용은 **AWS SDK 및 도구 참조 안내서에서 [AWS 액세스 키](https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html)를 참조하세요.

1. **AWS STS 웹 자격 증명**

   액세스가 필요한 모바일 애플리케이션 또는 클라이언트 기반 웹 애플리케이션을 생성할 때 AWS AWS Security Token Service (AWS STS)는 퍼블릭 자격 증명 공급자(IdP)를 통해 인증된 페더레이션 사용자를 위한 임시 보안 자격 증명 세트를 반환합니다.
   + 프로필에서 이를 지정하면 SDK 또는 도구가 `AssumeRoleWithWebIdentity` API 메서드를 사용하여 AWS STS 임시 자격 증명을 검색하려고 시도합니다. 이 메서드에 관한 자세한 정보는 *AWS Security Token Service API 참조*의 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)를 참조하세요.
   +  이 공급자 구성에 대한 지침은 *AWS SDK 및 도구 참조 안내서*의 [웹 자격 증명 또는 OpenID Connect로 페더레이션](https://docs.aws.amazon.com/sdkref/latest/guide/access-assume-role.html#webidentity)을 참조하세요.
   +  이 공급자의 SDK 구성 속성에 대한 자세한 내용은 **AWS SDK 및 도구 참조 안내서에서 [역할 자격 증명 공급자 수임](https://docs.aws.amazon.com/sdkref/latest/guide/feature-assume-role-credentials.html)을 참조하세요.

1. **IAM Identity Center**

   IAM Identity Center를 사용하여 인증하는 경우 C\$1\$1용 SDK가 AWS CLI 명령를 실행하여 설정한 Single Sign-On 토큰을 사용하는 경우입니다`aws sso login`. SDK는 IAM Identity Center가 유효한 토큰으로 교환된 임시 자격 증명을 사용합니다. 그러면 AWS 서비스를 직접 호출할 때 이 임시 자격 증명이 사용됩니다. 이 프로세스에 관한 자세한 내용은 *AWS SDK 및 도구 참조 안내서*의 [AWS 서비스에 대한 SDK 자격 증명 해결 이해](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html#idccredres)를 참조하세요.
   +  이 공급자 구성에 대한 지침은 *AWS SDK 및 도구 참조 안내서*의 [IAM Identity Center 인증](https://docs.aws.amazon.com/sdkref/latest/guide/access-sso.html)을 참조하세요.
   +  이 공급자의 SDK 구성 속성에 대한 자세한 내용은 *AWS SDK 및 도구 참조 안내서*의 [IAM Identity Center 자격 증명 공급자](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sso-credentials.html)를 참조하세요.

1. ** AWS 로그인을 사용한 로그인 자격 증명 자격 증명 해석기**

   AWS 로그인 및 콘솔 자격 증명을 사용하여 인증하는 경우, SDK for C\$1\$1가 `aws login` 또는 CLI`aws login --profile`에서를 실행하여 설정한 콘솔 자격 증명을 사용하는 경우입니다. SDK는 AWS 서비스를 호출할 때 이러한 자격 증명을 사용합니다.
   +  이 프로세스에 대한 자세한 내용은 SDK 및 도구 참조 안내서의 [콘솔 자격 증명을 사용하여 AWS 로컬 개발을 위한 로그인](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html)을 참조하세요. *AWS SDKs *

1. **외부 프로세스 공급자**

   이 공급자를 사용하면 온프레미스 자격 증명 저장소에서 자격 증명을 가져오거나, 온프레미스 ID 공급자와 통합하는 등 사용자 지정 구현을 제공할 수 있습니다.
   +  이 공급자를 구성하는 한 가지 방법에 대한 지침은 **AWS SDK 및 도구 참조 안내서에서 [IAM Roles Anywhere](https://docs.aws.amazon.com/sdkref/latest/guide/access-rolesanywhere.html)를 참조하세요.
   +  이 공급자의 SDK 구성 속성에 대한 자세한 내용은 **AWS SDK 및 도구 참조 안내서에서 [프로세스 자격 증명 공급자](https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html)를 참조하세요.

1. **Amazon ECS 및 Amazon EKS 컨테이너 자격 증명**

   Amazon Elastic Container Service 작업과 Kubernetes 서비스 계정에는 이와 연결된 IAM 역할이 있을 수 있습니다. IAM 역할에서 부여된 권한은 작업에서 실행 중인 컨테이너 또는 포드의 컨테이너에 위임됩니다. 이 역할을 통해 컨테이너 내 SDK for C\$1\$1 애플리케이션 코드에 다른 AWS 서비스서비스를 사용할 수 있습니다.

   SDK는 Amazon ECS 및 Amazon EKS에서 자동으로 설정할 수 있는 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI` 또는 `AWS_CONTAINER_CREDENTIALS_FULL_URI` 환경 변수에서 자격 증명을 검색하려고 시도합니다.
   + Amazon ECS에서 이 역할을 설정하는 방법에 관한 자세한 내용은 *Amazon Elastic Container Service 개발자 안내서*의 [Amazon ECS 작업 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)을 참조하세요.
   + Amazon EKS 설정 정보는 **Amazon EKS 사용 설명서**의 [Amazon EKS Pod Identity Agent 설정](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html)을 참조하세요.
   +  이 공급자의 SDK 구성 속성에 대한 자세한 내용은 *AWS SDK 및 도구 참조 안내서*의 [컨테이너 자격 증명 공급자](https://docs.aws.amazon.com/sdkref/latest/guide/feature-container-credentials.html)를 참조하세요.

1. **Amazon EC2 인스턴스 메타데이터 서비스 **

   IAM 역할을 생성하여 인스턴스에 연결합니다. 인스턴스의 SDK for C\$1\$1 애플리케이션은 역할이 제공하는 자격 증명을 인스턴스 메타데이터에서 검색하려고 시도합니다.
   + 이 역할 설정과 메타데이터 사용에 대한 자세한 내용은 **Amazon EC2 사용 설명서에서 [Amazon EC2의 IAM 역할](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) 및 [인스턴스 메타데이터 작업](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)을 참조하세요.
   +  이 공급자의 SDK 구성 속성에 대한 자세한 내용은 *AWS SDK 및 도구 참조 안내서*의 [IMDS 자격 증명 공급자](https://docs.aws.amazon.com/sdkref/latest/guide/feature-imds-credentials.html)를 참조하세요.

자격 증명 공급자 체인은 GitHub의 AWS SDK for C\$1\$1 소스 코드[https://github.com/aws/aws-sdk-cpp/blob/main/src/aws-cpp-sdk-core/source/auth/AWSCredentialsProviderChain.cpp#L43-L86](https://github.com/aws/aws-sdk-cpp/blob/main/src/aws-cpp-sdk-core/source/auth/AWSCredentialsProviderChain.cpp#L43-L86)에 있는에서 검토할 수 있습니다.

새 사용자가 시작할 수 있도록 권장 접근 방식을 따른 경우 시작하기 주제 [AWS SDK for C\$1\$1를 AWS 사용하여 로 인증](credentials.md) 중에 AWS 로그인 자격 증명 인증을 설정합니다. 상황에 따라 다른 인증 방법이 유용할 수 있습니다. 보안 위험을 방지하려면 항상 단기 보안 인증을 사용하는 것이 좋습니다. 다른 인증 방법 절차에 대해서는AWS SDK 및 도구 참조 안내서**의 [Authentication and access](https://docs.aws.amazon.com/sdkref/latest/guide/access.html)를 참조하세요.

## 명시적 자격 증명 공급자
<a name="credproviders-explicit-credentials-provider"></a>

자격 증명 공급자 체인을 사용하여 인증 방법을 감지하는 대신 SDK에서 사용해야 하는 특정 자격 증명 공급자를 지정할 수 있습니다. 이 작업은 서비스 클라이언트의 생성자에 자격 증명을 제공하여 수행할 수 있습니다.

다음 예제에서는 체인을 사용하는 대신 임시 액세스 자격 증명을 직접 제공하여 Amazon Simple Storage Service 클라이언트를 생성합니다.

```
    SDKOptions options;
    Aws::InitAPI(options);
    {
        const auto cred_provider = Aws::MakeShared<Auth::SimpleAWSCredentialsProvider>("TestAllocationTag",
            "awsAccessKeyId",
            "awsSecretKey",
            "sessionToken");
        S3Client client{cred_provider};
    }
    Aws::ShutdownAPI(options);
```

## ID 캐싱
<a name="credproviders-identity-caching"></a>

SDK는 자격 증명 및 SSO 토큰과 같은 기타 자격 증명 유형을 캐싱합니다. 기본적으로 SDK는 지연 캐시 구현을 사용합니다. 이 구현은 첫 번째 요청 시 자격 증명을 로드하고 캐시한 후 만료 시점이 가까워지면 다른 요청 중에 이를 새로 고치려고 시도합니다. 동일한 [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/struct_aws_1_1_client_1_1_client_configuration.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-core/html/struct_aws_1_1_client_1_1_client_configuration.html)에서 생성된 클라이언트는 캐시를 공유합니다.

# 빌드를 위한 CMake 파라미터 AWS SDK for C\$1\$1
<a name="cmake-params"></a>

이 섹션에 나열된 [CMake](https://cmake.org/) 파라미터를 사용하여 SDK 빌드 방식을 사용자 지정합니다.

이러한 옵션은 CMake GUI 도구를 사용하거나 명령줄에서 *-D*를 사용하여 설정할 수 있습니다. 예를 들면 다음과 같습니다.

```
cmake -DENABLE_UNITY_BUILD=ON -DREGENERATE_CLIENTS=1
```

## 일반 CMake 변수 및 옵션
<a name="cmake-general-options"></a>

다음은 SDK 소스 코드의 빌드 프로세스에 영향을 미치는 일반 **`cmake`** 변수 및 옵션입니다.

**참고**  
이러한 파라미터는 SDK for C\$1\$1 자체의 소스 코드를 빌드할 때 사용합니다.

**Topics**
+ [ADD\$1CUSTOM\$1CLIENTS](#cmake-add-custom-clients)
+ [AUTORUN\$1UNIT\$1TESTS](#cmake-AUTORUN_UNIT_TESTS)
+ [AWS\$1AUTORUN\$1LD\$1LIBRARY\$1PATH](#cmake-AWS_AUTORUN_LD_LIBRARY_PATH)
+ [AWS\$1SDK\$1WARNINGS\$1ARE\$1ERRORS](#cmake-AWS_SDK_WARNINGS_ARE_ERRORS)
+ [AWS\$1USE\$1CRYPTO\$1SHARED\$1LIBS](#cmake-use-crypto)
+ [AWS\$1TEST\$1REGION](#cmake-AWS_TEST_REGION)
+ [BUILD\$1BENCHMARKS](#cmake-BUILD_BENCHMARKS)
+ [BUILD\$1DEPS](#cmake-BUILD_DEPS)
+ [BUILD\$1ONLY](#cmake-build-only)
+ [BUILD\$1OPTEL](#cmake-BUILD_OPTEL)
+ [BUILD\$1SHARED\$1LIBS](#cmake-build-shared-libs)
+ [BYPASS\$1DEFAULT\$1PROXY](#cmake-BYPASS_DEFAULT_PROXY)
+ [CPP\$1STANDARD](#cmake-cpp-standard)
+ [CURL\$1INCLUDE\$1DIR](#cmake-curl-include-dir)
+ [CURL\$1LIBRARY](#cmake-curl-library)
+ [CUSTOM\$1MEMORY\$1MANAGEMENT](#cmake-custom-memory-management)
+ [DISABLE\$1INTERNAL\$1IMDSV1\$1CALLS](#cmake-DISABLE_INTERNAL_IMDSV1_CALLS)
+ [ENABLE\$1ADDRESS\$1SANITIZER](#cmake-ENABLE_ADDRESS_SANITIZER)
+ [ENABLE\$1CURL\$1LOGGING](#cmake-enable-curl-logging)
+ [ENABLE\$1HTTP\$1CLIENT\$1TESTING](#cmake-ENABLE_HTTP_CLIENT_TESTING)
+ [ENABLE\$1RTTI](#cmake-enable-rtti)
+ [ENABLE\$1TESTING](#cmake-enable-testing)
+ [ENABLE\$1UNITY\$1BUILD](#cmake-enable-unity-build)
+ [ENABLE\$1VIRTUAL\$1OPERATIONS](#cmake-virtual-op)
+ [ENABLE\$1ZLIB\$1REQUEST\$1COMPRESSION](#cmake-ENABLE_ZLIB_REQUEST_COMPRESSION)
+ [FORCE\$1CURL](#cmake-force-curl)
+ [FORCE\$1SHARED\$1CRT](#cmake-force-shared-crt)
+ [G](#cmake-g)
+ [MINIMIZE\$1SIZE](#cmake-minimize-size)
+ [NO\$1ENCRYPTION](#cmake-no-encryption)
+ [NO\$1HTTP\$1CLIENT](#cmake-no-http-client)
+ [REGENERATE\$1CLIENTS](#cmake-regenerate-clients)
+ [REGENERATE\$1DEFAULTS](#cmake-regenerate-defaults)
+ [SIMPLE\$1INSTALL](#cmake-simple-install)
+ [TARGET\$1ARCH](#cmake-target-arch)
+ [USE\$1CRT\$1HTTP\$1CLIENT](#cmake-USE_CRT_HTTP_CLIENT)
+ [USE\$1IXML\$1HTTP\$1REQUEST\$12](#cmake-USE_IXML_HTTP_REQUEST_2)
+ [USE\$1OPENSSL](#cmake-use-openssl)
+ [USE\$1TLS\$1V1\$12](#cmake-USE_TLS_V1_2)
+ [USE\$1TLS\$1V1\$13](#cmake-USE_TLS_V1_3)

### ADD\$1CUSTOM\$1CLIENTS
<a name="cmake-add-custom-clients"></a>

API 정의를 기반으로 임의의 클라이언트를 빌드합니다. 정의를 `code-generation/api-definitions` 폴더에 배치한 후 이 인수를 **`cmake`**에 전달하세요. **`cmake`** 성 단계에서 클라이언트를 생성하여 빌드에 하위 디렉터리로 포함시킵니다. 이는 특히 [API Gateway](https://aws.amazon.com/api-gateway) 서비스 중 하나를 사용하기 위해 C\$1\$1 클라이언트를 생성할 때 유용합니다. 예제:

```
-DADD_CUSTOM_CLIENTS="serviceName=myCustomService,version=2015-12-21;serviceName=someOtherService,version=2015-08-15"
```

**참고**  
`ADD_CUSTOM_CLIENTS` 파라미터를 사용하려면 [Python 2.7](https://www.python.org/downloads/), Java([JDK 1.8 이상](http://openjdk.java.net/install/)) 및 [Maven](https://maven.apache.org/)이 설치되어 있고 `PATH`에 포함되어 있어야 합니다.

### AUTORUN\$1UNIT\$1TESTS
<a name="cmake-AUTORUN_UNIT_TESTS"></a>

`ON`인 경우 빌드 후 단위 테스트를 자동으로 실행합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### AWS\$1AUTORUN\$1LD\$1LIBRARY\$1PATH
<a name="cmake-AWS_AUTORUN_LD_LIBRARY_PATH"></a>

CMake로 자동 실행되는 유닛 테스트를 위해 LD\$1LIBRARY\$1PATH에 추가할 경로입니다. 재정의된 종속성에 사용자 지정 런타임 라이브러리가 필요한 경우에 이 경로를 설정합니다.

값  
 *문자열입니다.*

기본값  
 *해당 사항 없음* 

### AWS\$1SDK\$1WARNINGS\$1ARE\$1ERRORS
<a name="cmake-AWS_SDK_WARNINGS_ARE_ERRORS"></a>

`ON`인 경우 컴파일러 경고를 오류로 처리합니다. 새 컴파일러나 흔하지 않은 컴파일러에서 오류가 관찰되는 경우 이를 `OFF`로 설정해 보세요.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### AWS\$1USE\$1CRYPTO\$1SHARED\$1LIBS
<a name="cmake-use-crypto"></a>

FindCrypto가 공유 암호화 라이브러리를 사용하도록 강제합니다(해당 라이브러리가 발견된 경우). 대신 [BUILD\$1SHARED\$1LIBS](#cmake-build-shared-libs) 설정을 사용하려면 이 옵션을 `OFF`로 설정합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### AWS\$1TEST\$1REGION
<a name="cmake-AWS_TEST_REGION"></a>

통합 테스트 AWS 리전 에 사용할 입니다.

값  
 *문자열입니다.*

기본값  
 *해당 사항 없음* 

### BUILD\$1BENCHMARKS
<a name="cmake-BUILD_BENCHMARKS"></a>

`ON`인 경우 벤치마크 실행 파일을 빌드합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### BUILD\$1DEPS
<a name="cmake-BUILD_DEPS"></a>

`ON`인 경우 타사 종속성을 빌드합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### BUILD\$1ONLY
<a name="cmake-build-only"></a>

사용할 클라이언트만 빌드합니다. `aws-cpp-sdk-transfer`와 같은 상위 수준 SDK로 설정된 경우 *BUILD\$1ONLY*는 하위 수준 클라이언트 종속성을 모두 확인합니다. 또한 선택한 프로젝트와 관련된 통합 및 유닛 테스트가 있는 경우, 이들도 빌드합니다. 이는 세미콜론(`;`) 문자로 값이 구분된 목록 인수입니다. 예제:

```
-DBUILD_ONLY="s3;cognito-identity"
```

**참고**  
핵심 SDK 모듈인 `aws-sdk-cpp-core`는 *BUILD\$1ONLY* 매개변수의 값과 상관없이 *항상* 빌드됩니다.

### BUILD\$1OPTEL
<a name="cmake-BUILD_OPTEL"></a>

`ON`인 경우 추적을 위한 오픈 텔레메트리 구현을 빌드합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### BUILD\$1SHARED\$1LIBS
<a name="cmake-build-shared-libs"></a>

기본 제공 CMake 옵션으로, 가시성을 위해 여기에 재표시됩니다. `ON`인 경우 공유 라이브러리를 빌드하며, 그렇지 않은 경우 정적 라이브러리만 빌드합니다.

**참고**  
SDK에 동적으로 연결하려면 SDK를 사용하여 모든 빌드 대상에 대해 `USE_IMPORT_EXPORT` 기호를 정의해야 합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### BYPASS\$1DEFAULT\$1PROXY
<a name="cmake-BYPASS_DEFAULT_PROXY"></a>

`ON`인 경우 IXmlHttpRequest2를 사용할 때 시스템의 기본 프록시 설정을 우회합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### CPP\$1STANDARD
<a name="cmake-cpp-standard"></a>

C\$1\$1 14 및 17 코드 베이스와 함께 사용할 사용자 지정 C\$1\$1 표준을 지정합니다.

값  
 *11* \$1 *14* \$1 *17* 

기본값  
 *11* 

### CURL\$1INCLUDE\$1DIR
<a name="cmake-curl-include-dir"></a>

`libcurl` 헤더가 포함된 curl include 디렉터리의 경로입니다.

값  
 *선택한 `include` 디렉터리의 문자열 경로입니다. *예:`D:/path/to/dir/with/curl/include` 

기본값  
 *해당 사항 없음* 

### CURL\$1LIBRARY
<a name="cmake-curl-library"></a>

연결할 curl 라이브러리 파일의 경로입니다. 이 라이브러리는 애플리케이션의 요구 사항에 따라 정적 라이브러리 또는 가져오기 라이브러리일 수 있습니다.

값  
 *curl 라이브러리 파일의 문자열 경로. 예: `D:/path/to/static/libcur/file/ie/libcurl.lib.a`.*

기본값  
 *해당 사항 없음* 

### CUSTOM\$1MEMORY\$1MANAGEMENT
<a name="cmake-custom-memory-management"></a>

사용자 지정 메모리 관리자를 사용하려면 값을 `1`로 설정합니다. 모든 STL 유형에 사용자 지정 할당 인터페이스를 사용하도록 사용자 지정 할당기를 설치할 수 있습니다. 값을 `0`으로 설정하더라도 Windows에서 DLL 안전성을 위해 STL 템플릿 유형을 계속 사용할 수 있습니다.

정적 연결이 `ON`인 경우 사용자 지정 메모리 관리는 기본적으로 **off(`0`)로 설정됩니다. 동적 연결이 `ON`인 경우 사용자 지정 메모리 관리는 기본적으로 **on(`1`)으로 설정되며 교차 DLL 할당 및 할당 해제가 방지됩니다.

**참고**  
링커 불일치 오류를 방지하려면 빌드 시스템 전체에서 동일한 값(`0` 또는 `1`)을 사용해야 합니다.

SDK에서 수행한 할당을 처리할 자체 메모리 관리자를 설치하려면 SDK에 의존하는 모든 빌드 대상에 대해 `-DCUSTOM_MEMORY_MANAGEMENT`를 설정하고 `USE_AWS_MEMORY_MANAGEMENT`를 정의해야 합니다.

### DISABLE\$1INTERNAL\$1IMDSV1\$1CALLS
<a name="cmake-DISABLE_INTERNAL_IMDSV1_CALLS"></a>

`ON`인 경우 [인스턴스 메타데이터 서비스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)의 V1 API에 대한 내부 직접 호출이 수행되지 않습니다. `OFF`인 경우 IMDSv2 호출이 실패하면 IMDSv2 직접 호출이 IMDSv1 사용으로 대체됩니다. IMDSv1 및 IMDSv2에 대한 자세한 내용은 *Amazon EC2 사용 설명서*에서 [인스턴스 메타데이터 서비스를 사용하여 인스턴스 메타데이터에 액세스](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)를 참조하세요.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### ENABLE\$1ADDRESS\$1SANITIZER
<a name="cmake-ENABLE_ADDRESS_SANITIZER"></a>

`ON`인 경우 gcc 또는 clang에 대해 Address Sanitizer를 켭니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### ENABLE\$1CURL\$1LOGGING
<a name="cmake-enable-curl-logging"></a>

`ON`인 경우 curl의 내부 로그를 SDK 로거로 파이프 처리합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### ENABLE\$1HTTP\$1CLIENT\$1TESTING
<a name="cmake-ENABLE_HTTP_CLIENT_TESTING"></a>

`ON`인 경우 해당 HTTP 클라이언트 테스트 제품군을 빌드하고 실행합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### ENABLE\$1RTTI
<a name="cmake-enable-rtti"></a>

런타임 유형 정보(RTTI)를 활성화하도록 SDK를 빌드할지 여부를 제어합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### ENABLE\$1TESTING
<a name="cmake-enable-testing"></a>

SDK 빌드 중 유닛 테스트 및 통합 테스트 프로젝트를 빌드할지 여부를 제어합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### ENABLE\$1UNITY\$1BUILD
<a name="cmake-enable-unity-build"></a>

`ON`인 경우 대부분의 SDK 라이브러리는 하나의 생성된 `.cpp` 파일로 빌드됩니다. 이렇게 하면 정적 라이브러리 크기가 상당히 줄어들고 컴파일 시간이 단축될 수 있습니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### ENABLE\$1VIRTUAL\$1OPERATIONS
<a name="cmake-virtual-op"></a>

이 파라미터는 일반적으로 코드 생성을 위해 `REGENERATE_CLIENTS`와 함께 작동합니다.

`ENABLE_VIRTUAL_OPERATIONS`가 `ON`이고 `REGENERATE_CLIENTS`가 `ON`인 경우 서비스 클라이언트의 작업 관련 함수는 `virtual`로 표시됩니다.

`ENABLE_VIRTUAL_OPERATIONS`가 `OFF`이고 `REGENERATE_CLIENTS`가 인 `ON`경우 `virtual`는 작업 함수에 추가되지 않으며 서비스 클라이언트 클래스는 `final`로 표시됩니다.

`ENABLE_VIRTUAL_OPERATIONS`가 `OFF`인 경우 SDK는 컴파일 시 gcc 및 clang에 대해 `-ffunction-sections` 및 `-fdata-sections` 컴파일러 플래그도 추가합니다.

자세한 내용은 GitHub의 [CMake 파라미터](https://github.com/aws/aws-sdk-cpp/blob/main/docs/CMake_Parameters.md#enable_virtual_operations)를 참조하세요.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### ENABLE\$1ZLIB\$1REQUEST\$1COMPRESSION
<a name="cmake-ENABLE_ZLIB_REQUEST_COMPRESSION"></a>

해당 기능을 지원하는 서비스의 경우 요청된 콘텐츠가 압축됩니다. 종속성이 사용 가능한 경우 기본적으로 활성화됩니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### FORCE\$1CURL
<a name="cmake-force-curl"></a>

Windows에만 해당됩니다. `ON`인 경우 기본 [WinHTTP](https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925%28v=vs.85%29.aspx) 데이터 전송 공급자 대신 curl 클라이언트를 강제로 사용합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### FORCE\$1SHARED\$1CRT
<a name="cmake-force-shared-crt"></a>

`ON`인 경우 SDK는 C 런타임에 *동적으로* 연결되며, 그렇지 않은 경우 *BUILD\$1SHARED\$1LIBS* 설정(이전 SDK 버전과의 이전 버전 호환성을 위해 필요한 경우가 있음)을 사용합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### G
<a name="cmake-g"></a>

Visual Studio 솔루션 및 Xcode 프로젝트 등의 빌드 아티팩트를 생성합니다.

Windows 예:

```
-G "Visual Studio 12 Win64"
```

자세한 내용은 해당 플랫폼의 CMake 설명서를 참조하세요.

### MINIMIZE\$1SIZE
<a name="cmake-minimize-size"></a>

[ENABLE\$1UNITY\$1BUILD](#cmake-enable-unity-build)의 상위 집합입니다. `ON`인 경우 이 옵션은 *ENABLE\$1UNITY\$1BUILD* 및 추가 바이너리 크기 축소 설정을 활성화합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### NO\$1ENCRYPTION
<a name="cmake-no-encryption"></a>

`ON`인 경우 기본 플랫폼별 암호화 구현이 라이브러리에 내장되지 않도록 합니다. 이 기능을 *ON*으로 설정하면 자체 암호화 구현을 주입할 수 있습니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### NO\$1HTTP\$1CLIENT
<a name="cmake-no-http-client"></a>

`ON`인 경우 기본 플랫폼별 HTTP 클라이언트가 라이브러리에 내장되지 않도록 합니다. *ON*인 경우 자체 플랫폼별 HTTP 클라이언트 구현을 제공해야 합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### REGENERATE\$1CLIENTS
<a name="cmake-regenerate-clients"></a>

`ON`인 경우 이 파라미터는 생성된 코드를 모두 삭제하고 `code-generation/api-definitions` 폴더에서 클라이언트 디렉터리를 생성합니다. 예제:

```
-DREGENERATE_CLIENTS=1
```

**참고**  
`REGENERATE_CLIENTS` 파라미터를 사용하려면 [Python 2.7](https://www.python.org/downloads/), Java([JDK 1.8 이상](http://openjdk.java.net/install/)) 및 [Maven](https://maven.apache.org/)이 설치되어 있고 `PATH`에 포함되어 있어야 합니다.

### REGENERATE\$1DEFAULTS
<a name="cmake-regenerate-defaults"></a>

`ON`인 경우 이 파라미터는 생성된 기본 코드를 모두 삭제하고 `code-generation/defaults` 폴더에서 다시 생성합니다. 예제:

```
-DREGENERATE_DEFAULTS=1
```

**참고**  
`REGENERATE_DEFAULTS` 파라미터를 사용하려면 [Python 2.7](https://www.python.org/downloads/), Java([JDK 1.8 이상](http://openjdk.java.net/install/)) 및 [Maven](https://maven.apache.org/)이 설치되어 있고 `PATH`에 포함되어 있어야 합니다.

### SIMPLE\$1INSTALL
<a name="cmake-simple-install"></a>

`ON`인 경우 설치 프로세스 중 `bin/` 및 `lib/` 아래에 플랫폼별 중간 디렉터리가 생성되지 않습니다. 단일 설치 디렉터리에서 다중 플랫폼 릴리스를 수행해야 하는 경우 `OFF`로 설정합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### TARGET\$1ARCH
<a name="cmake-target-arch"></a>

모바일 플랫폼용으로 교차 컴파일하거나 빌드하려면 대상 플랫폼을 지정해야 합니다. 기본적으로 빌드는 호스트 운영 체제를 감지하여 감지된 운영 체제용으로 빌드합니다.

**참고**  
*TARGET\$1ARCH*가 *ANDROID*인 경우 추가 옵션을 사용할 수 있습니다. [Android CMake 변수 및 옵션](#cmake-android-variables)을 참조하세요.

값  
 *WINDOWS* \$1 *LINUX* \$1 *APPLE* \$1 *ANDROID* 

### USE\$1CRT\$1HTTP\$1CLIENT
<a name="cmake-USE_CRT_HTTP_CLIENT"></a>

`ON`인 경우 공통 런타임 HTTP 클라이언트가 사용되며, WinHttp 및 libcurl과 같은 레거시 시스템은 빌드되거나 포함되지 않습니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### USE\$1IXML\$1HTTP\$1REQUEST\$12
<a name="cmake-USE_IXML_HTTP_REQUEST_2"></a>

Windows에만 해당됩니다. `ON`인 경우 HTTP 스택에 com 객체 IXmlHttpRequest2를 사용합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### USE\$1OPENSSL
<a name="cmake-use-openssl"></a>

`ON`인 경우 SDK는 OpenSSL을 사용하여 빌드합니다. 그렇지 않으면를 사용합니다[https://github.com/awslabs/aws-lc](https://github.com/awslabs/aws-lc). `AWS-LC`는 AWS 및 고객을 위해 AWS 암호화 팀이 유지 관리하는 범용 암호화 라이브러리입니다. 이 파라미터를 `OFF`로 설정하면 시스템 기본 디렉터리에 OpenSSL 대신 `AWS-LC`가 설치됩니다. 시스템에 이미 OpenSSL이 설치되어 있는 경우에는 사용하지 마세요.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### USE\$1TLS\$1V1\$12
<a name="cmake-USE_TLS_V1_2"></a>

`ON`인 경우 HTTP 클라이언트에서 TLS 1.2를 적용합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### USE\$1TLS\$1V1\$13
<a name="cmake-USE_TLS_V1_3"></a>

`ON`인 경우 HTTP 클라이언트에서 TLS 1.3을 적용합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

## Android CMake 변수 및 옵션
<a name="cmake-android-variables"></a>

SDK의 Android 빌드를 생성하는 경우([TARGET\$1ARCH](#cmake-target-arch)가 *ANDROID*로 설정된 경우) 다음 변수를 사용합니다.

**Topics**
+ [ANDROID\$1ABI](#cmake-android-abi)
+ [ANDROID\$1BUILD\$1CURL](#cmake-ANDROID_BUILD_CURL)
+ [ANDROID\$1BUILD\$1OPENSSL](#cmake-ANDROID_BUILD_OPENSSL)
+ [ANDROID\$1BUILD\$1ZLIB](#cmake-ANDROID_BUILD_ZLIB)
+ [ANDROID\$1NATIVE\$1API\$1LEVEL](#cmake-android-native-api-level)
+ [ANDROID\$1STL](#cmake-android-stl)
+ [ANDROID\$1TOOLCHAIN\$1NAME](#cmake-android-toolchain-name)
+ [DISABLE\$1ANDROID\$1STANDALONE\$1BUILD](#cmake-disable-android-standalone-build)
+ [NDK\$1DIR](#cmake-ndk-dir)

### ANDROID\$1ABI
<a name="cmake-android-abi"></a>

Android에만 해당됩니다. 코드를 출력할 Application Binary Interface(ABI)를 제어합니다.

**참고**  
모든 유효한 Android ABI 값이 현재 지원되는 것은 아닙니다.

값  
 *arm64* \$1 *armeabi-v7a* \$1 *x86\$164* \$1 *x86* \$1 *mips64* \$1 *mips* 

기본값  
 *armeabi-v7a* 

### ANDROID\$1BUILD\$1CURL
<a name="cmake-ANDROID_BUILD_CURL"></a>

Android에만 해당됩니다. `ON`인 경우 curl도 빌드합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### ANDROID\$1BUILD\$1OPENSSL
<a name="cmake-ANDROID_BUILD_OPENSSL"></a>

Android에만 해당됩니다. `ON`인 경우 Openssl도 빌드합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### ANDROID\$1BUILD\$1ZLIB
<a name="cmake-ANDROID_BUILD_ZLIB"></a>

Android에만 해당됩니다. `ON`인 경우 Zlib도 빌드합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *ON* 

### ANDROID\$1NATIVE\$1API\$1LEVEL
<a name="cmake-android-native-api-level"></a>

Android에만 해당됩니다. SDK가 빌드될 때 사용될 API 수준을 제어합니다. [ANDROID\$1STL](#cmake-android-stl)을 *gnustl*로 설정한 경우 모든 API 수준을 선택할 수 있습니다. *libc\$1\$1*를 사용하는 경우 최소 *21* 이상의 API 수준을 사용해야 합니다.

기본값  
선택한 STL에 따라 다릅니다.

### ANDROID\$1STL
<a name="cmake-android-stl"></a>

Android에만 해당됩니다. SDK에서 사용하는 C\$1\$1 표준 라이브러리의 종류를 제어합니다.

**중요**  
`gnustl` 옵션을 사용하는 경우 SDK 내에서 성능 문제가 발생할 수 있습니다. *libc\$1\$1\$1shared* 또는 *libc\$1\$1\$1static*을 사용하는 것이 좋습니다.

값  
 *libc\$1\$1\$1shared* \$1 *libc\$1\$1\$1static* \$1 *gnustl\$1shared* \$1 *gnustl\$1static* 

기본값  
 *libc\$1\$1\$1shared* 

### ANDROID\$1TOOLCHAIN\$1NAME
<a name="cmake-android-toolchain-name"></a>

Android에만 해당됩니다. SDK 빌드에 사용되는 컴파일러를 제어합니다.

**참고**  
Android NDK에서 GCC가 더 이상 권장되지 않으므로 기본값을 사용하는 것이 좋습니다.

기본값  
 *standalone-clang* 

### DISABLE\$1ANDROID\$1STANDALONE\$1BUILD
<a name="cmake-disable-android-standalone-build"></a>

Android에만 해당됩니다. 기본적으로 Android 빌드는 NDK 스크립트를 통해 구성된 독립형 clang 기반 도구 체인을 사용합니다. 자체 도구 체인을 사용하려면 이 옵션을 *ON*으로 설정합니다.

값  
 *ON* \$1 *OFF* 

기본값  
 *끄기* 

### NDK\$1DIR
<a name="cmake-ndk-dir"></a>

Android에만 해당됩니다. 빌드 시스템이 Android NDK를 찾을 때 사용할 재정의 경로를 지정합니다. 기본적으로 빌드 시스템은 이 변수가 설정되지 않은 경우 환경 변수(`ANDROID_NDK`)를 확인합니다.

# AWS SDK for C\$1\$1에서 로깅 구성 및 사용
<a name="logging"></a>

AWS SDK for C\$1\$1에는 실행 중에 SDK가 수행한 작업의 레코드를 생성하는 구성 가능한 로깅이 포함되어 있습니다. 로깅을 활성화하려면 `SDKOptions`의 `LogLevel`을 애플리케이션에 적합한 상세 수준으로 설정합니다.

```
    Aws::SDKOptions options;
    options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;
```

선택할 수 있는 상세 수준은 7가지입니다. 기본값은 `Off`이며 이 경우 로그가 생성되지 않습니다. `Trace`는 가장 상세한 정보를 생성하며, `Fatal`은 치명적인 오류 상태만 보고하는 최소한의 메시지만 생성합니다.

애플리케이션에서 로깅이 활성화되면 SDK는 `aws_sdk_<date>.log`의 기본 이름 지정 패턴에 따라 실행 파일 디렉터리에 로그 파일을 생성합니다. 접두사 이름 지정 옵션으로 생성된 로그 파일은 로그 파일 보관 또는 삭제를 위해 매시간마다 롤오버됩니다.

SDK의 최신 버전은 기본 AWS 공통 런타임(CRT) 라이브러리에 점점 더 의존하고 있습니다. 이러한 라이브러리는 SDK 간 공통 기능과 기본 작업을 제공합니다. CRT 라이브러리에서 발생하는 모든 로그 메시지는 기본적으로 SDK for C\$1\$1로 리디렉션됩니다. SDK for C\$1\$1에 대해 지정하는 로그 수준 및 로깅 시스템이 CRT에도 적용됩니다.

위 예제에서 CRT는 `LogLevel::Info`를 상속하며 동일한 파일에 `Info` 수준으로 메시지를 로깅합니다.

출력을 별도의 로그 파일로 리디렉션하거나 CRT의 메시지에 대해 서로 다른 로그 수준을 설정하여 CRT 라이브러리에 대한 로깅을 개별적으로 제어할 수 있습니다. 로그를 과도하게 채우지 않도록 CRT 라이브러리의 상세 수준을 줄이는 것이 종종 유용합니다. 예를 들어, CRT 출력에 *대해서만* 로그 수준을 다음과 같이 `Warn`으로 설정할 수 있습니다.

```
options.loggingOptions.crt_logger_create_fn =
    [](){ return Aws::MakeShared<Aws::Utils::Logging::DefaultCRTLogSystem>("CRTLogSystem", Aws::Utils::Logging::LogLevel::Warn); };
```

선택적으로 `InitializeAWSLogging` 메서드를 사용하면 `DefaultLogSystem`의 상세 수준과 로그 출력을 제어할 수 있습니다. 로그 파일 이름 접두사를 구성하거나 출력을 파일 대신 스트림으로 리디렉션할 수 있습니다.

```
Aws::Utils::Logging::InitializeAWSLogging(
    Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>(
        "RunUnitTests", Aws::Utils::Logging::LogLevel::Trace, "aws_sdk_"));
```

또는 `DefaultLogSystem`을 사용하는 대신 이 메서드를 사용하여 자체 로깅 구현을 제공할 수도 있습니다.

```
InitializeAWSLogging(Aws::MakeShared<CustomLoggingSystem>());
```

`InitializeAWSLogging` 메서드를 호출한 경우 `ShutdownAWSLogging`를 호출하여 프로그램 종료 시 리소스를 해제할 수 있습니다.

```
Aws::Utils::Logging::ShutdownAWSLogging();
```

 **로깅을 사용한 통합 테스트 예제** 

```
#include <aws/external/gtest.h>

#include <aws/core/utils/memory/stl/AWSString.h>
#include <aws/core/utils/logging/DefaultLogSystem.h>
#include <aws/core/utils/logging/AWSLogging.h>

#include <iostream>

int main(int argc, char** argv)
{
    Aws::Utils::Logging::InitializeAWSLogging(
        Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>(
            "RunUnitTests", Aws::Utils::Logging::LogLevel::Trace, "aws_sdk_"));
    ::testing::InitGoogleTest(&argc, argv);
    int exitCode = RUN_ALL_TESTS();
    Aws::Utils::Logging::ShutdownAWSLogging();
    return exitCode;
}
```

 **사용자 지정 로깅을 위한 `Aws::Utils::Logging::DefaultLogSystem`의 하위 클래스 예제** 

 다음 코드는 AWS SDK for C\$1\$1의 일부인 `Aws::Utils::Logging::DefaultLogSystem` 클래스를 하위 클래스로 분류하는 방법을 보여줍니다. 이 예제에서는 `ProcessFormattedStatement` 가상 함수를 재정의하여 로깅을 사용자 지정합니다.

 `Aws::Utils::Logging::DefaultLogSystem`은 AWS SDK for C\$1\$1의 여러 클래스 중 하나로, 사용자 지정 로깅을 위해 `Aws::Utils::Logging::LogSystemInterface`을 하위 클래스로 분류합니다.

```
class LogSystemOverride : public Aws::Utils::Logging::DefaultLogSystem {
public:
    explicit LogSystemOverride(Aws::Utils::Logging::LogLevel logLevel,
                               const Aws::String &logPrefix)
            : DefaultLogSystem(logLevel, logPrefix), mLogToStreamBuf(false) {}

    const Aws::Utils::Stream::SimpleStreamBuf &GetStreamBuf() const {
        return mStreamBuf;
    }

    void setLogToStreamBuf(bool logToStreamBuf) {
        mLogToStreamBuf = logToStreamBuf;
    }

protected:

    void ProcessFormattedStatement(Aws::String &&statement) override {
        if (mLogToStreamBuf) {
            std::lock_guard<std::mutex> lock(mStreamMutex);
            mStreamBuf.sputn(statement.c_str(), statement.length());
        }

        DefaultLogSystem::ProcessFormattedStatement(std::move(statement));
    }

private:
    Aws::Utils::Stream::SimpleStreamBuf mStreamBuf;
    // Use a mutex when writing to the buffer because
    // ProcessFormattedStatement can be called from multiple threads.
    std::mutex mStreamMutex;
    std::atomic<bool> mLogToStreamBuf;
};
```

```
int main(int argc, char **argv) {
    Aws::SDKOptions options;
    options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Trace;
    auto logSystemOverride = Aws::MakeShared<LogSystemOverride>("AllocationTag",
                                                                options.loggingOptions.logLevel,
                                                                options.loggingOptions.defaultLogPrefix);
    options.loggingOptions.logger_create_fn = [logSystemOverride]() {
        return logSystemOverride;
    };

    Aws::InitAPI(options);  // Call Aws::InitAPI only once in an application.
    {
        Aws::Client::ClientConfiguration clientConfig;
        // Optional: Set to the AWS Region (overrides config file).
        // clientConfig.region = "us-east-1";

        Aws::S3::S3Client s3Client(clientConfig);

        logSystemOverride->setLogToStreamBuf(true);
        auto outcome = s3Client.ListBuckets();
        if (!outcome.IsSuccess()) {
            std::cerr << "ListBuckets error: " <<
                      outcome.GetError().GetExceptionName() << " " <<
                      outcome.GetError().GetMessage() << std::endl;
        }

        logSystemOverride->setLogToStreamBuf(false);

        std::cout << "Log for ListBuckets" << std::endl;
        std::cout << logSystemOverride->GetStreamBuf().str() << std::endl;
    }

    Aws::ShutdownAPI(options);

    return 0;
}
```

[전체 예제](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sdk-customization/override_default_logger.cpp)는 GitHub에서 확인하세요.

# 에서 HTTP 클라이언트 재정의 AWS SDK for C\$1\$1
<a name="overriding-http-client"></a>

Windows의 기본 HTTP 클라이언트는 [WinHTTP](https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925%28v=vs.85%29.aspx)입니다. 다른 모든 플랫폼의 기본 HTTP 클라이언트는 [curl](https://curl.haxx.se/)입니다.

선택적으로 서비스 클라이언트의 생성자에 전달할 사용자 지정 `HttpClientFactory`를 생성하여 HTTP 클라이언트 기본값을 재정의할 수 있습니다. HTTP 클라이언트를 재정의하려면 curl 지원을 추가하여 SDK를 빌드해야 합니다. Curl 지원은 Linux와 macOS에서 기본적으로 빌드되지만, Windows에서는 추가 단계가 필요합니다. curl 지원을 추가하여 Windows에서 SDK를 빌드하는 방법에 대한 자세한 내용은 [Windows AWS SDK for C\$1\$1 에서 빌드](setup-windows.md) 섹션을 참조하세요.

# 의 `HttpClient` 및 `AWSClient`에서 사용하는 iostream 제어 AWS SDK for C\$1\$1
<a name="configuring-iostreams"></a>

기본적으로 모든 응답은 `stringbuf`에서 지원하는 입력 스트림을 사용합니다. 필요한 경우 기본 동작을 재정의할 수 있습니다. 예를 들어 Amazon S3 `GetObject`를 사용 중인데 로드하고 싶지 않은 경우 `AmazonWebServiceRequest`의 `IOStreamFactory`를 통해 lambda를 전달하여 파일 스트림을 생성할 수 있습니다.

 **파일 스트림 요청 예** 

```
 //! Use a custom response stream when downloading an object from an Amazon Simple
//! Storage Service (Amazon S3) bucket.
/*!
  \param bucketName: The Amazon S3 bucket name.
  \param objectKey: The object key.
  \param filePath: File path for custom response stream.
  \param clientConfiguration: AWS client configuration.
  \return bool: Function succeeded.
 */

bool AwsDoc::SdkCustomization::customResponseStream(const Aws::String &bucketName,
                                                    const Aws::String &objectKey,
                                                    const Aws::String &filePath,
                                                    const Aws::Client::ClientConfiguration &clientConfiguration) {

    Aws::S3::S3Client s3_client(clientConfiguration);

    Aws::S3::Model::GetObjectRequest getObjectRequest;
    getObjectRequest.WithBucket(bucketName).WithKey(objectKey);

    getObjectRequest.SetResponseStreamFactory([filePath]() {
            return Aws::New<Aws::FStream>(
                    "FStreamAllocationTag", filePath, std::ios_base::out);
    });

    Aws::S3::Model::GetObjectOutcome getObjectOutcome = s3_client.GetObject(
            getObjectRequest);

    if (getObjectOutcome.IsSuccess()) {
        std::cout << "Successfully retrieved object to file " << filePath << std::endl;
    }
    else {
        std::cerr << "Error getting object. "
                  << getObjectOutcome.GetError().GetMessage() << std::endl;
    }

    return getObjectOutcome.IsSuccess();
}
```

**참고**  
 GitHub에 더 많은 내용이 있습니다. 전체 예제는 [AWS 코드 예제 리포지토리](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sdk-customization#code-examples)에서 확인하세요.

# 에서 사용자 지정 libcrypto 라이브러리 사용 AWS SDK for C\$1\$1
<a name="libcrypto"></a>

 기본적으로는 전송 계층 보안을 위해 기본 시스템 암호화 라이브러리를 AWS SDK for C\$1\$1 사용합니다. 그러나 소스에서 SDK를 빌드할 때 다른 libcrypto 라이브러리를 사용하도록 선택적으로 SDK for C\$1\$1를 구성할 수 있습니다. 즉, 모든 암호화 작업이 OpenSSL의 사용자 지정 구현으로 전환됩니다. 예를 들어 애플리케이션에서 FIPS 표준을 달성하기 위해 [https://github.com/aws/aws-lc](https://github.com/aws/aws-lc) 라이브러리를 [FIPS 모드](https://aws.amazon.com/blogs/security/aws-lc-is-now-fips-140-3-certified/)로 사용할 수 있습니다.

## SDK for C\$1\$1에 사용자 지정 libcrypto를 빌드하는 방법
<a name="howToBuildLibcrypto"></a>

### 1단계: libcrypto 라이브러리 빌드 또는 가져오기
<a name="buildObtainLibCrypto"></a>

[https://github.com/aws/aws-lc](https://github.com/aws/aws-lc)는 libcrypto 라이브러리를 대체할 수 있는 한 가지 예이지만, OpenSSL 또는 OpenSSL과 동등한 배포판이라면 무엇이든 사용할 수 있습니다.

SDK for C\$1\$1와 그 종속성인 CRT는 모두 암호화 기능에 libcrypto를 사용하며, 둘 다 동일한 방식으로 종속성을 처리해야 합니다. SDK for C\$1\$1는 요청이 SDK의 `CRT S3` 기능을 사용하는지 여부에 따라 두 가지 다른 HTTP 클라이언트에 의존합니다. 특히 CRT는 시작 시점에 초기화되는 TLS 구현인 [s2n](https://github.com/aws/s2n-tls)에 의존합니다. SDK와 s2n 팀 모두 [BUILD\$1SHARED\$1LIBS](cmake-params.md#cmake-build-shared-libs) 값에 관계없이 공유 libcrypto 라이브러리 사용을 강제하는 cmake 파라미터를 제공합니다. 일반적으로 CRT HTTP 클라이언트와 일반 HTTP 클라이언트가 동일한 libcrypto를 사용하도록 설정하는 것이 바람직합니다. 이 경우 양쪽 모두 종속성 트리에서 OpenSSL을 참조해야 함을 의미합니다. SDK는 [AWS\$1USE\$1CRYPTO\$1SHARED\$1LIBS](cmake-params.md#cmake-use-crypto)를 통해, s2n(CRT 기반 직접 호출용)은 [https://github.com/aws/s2n-tls/blob/20010e6b75a09ab5a0fc69a86265d3cc4c103b91/CMakeLists.txt#L39](https://github.com/aws/s2n-tls/blob/20010e6b75a09ab5a0fc69a86265d3cc4c103b91/CMakeLists.txt#L39)를 통해 이를 제공합니다. 두 라이브러리 간의 의존성 해결 방식은 동일하며 일반적으로 일치하도록 설정되지만, 명시적으로 다르게 설정할 수도 있습니다.

예를 들어 `AWS-LC`를 libcrypto 라이브러리로 사용하려면 다음과 같이 빌드합니다.

```
git clone --depth 1 -b fips-2022-11-02 https://github.com/aws/aws-lc && \
    cd aws-lc && \
    mkdir build && \
    cd build && \
    cmake -G Ninja \
        -DCMAKE_INSTALL_LIBDIR=lib \
        -DCMAKE_INSTALL_PREFIX=/lc-install .. && \
    cmake --build . && \
    cmake --install . && \
    rm -rf ./* && \
    cmake -G Ninja \
        -DBUILD_SHARED_LIBS=ON \
        -DCMAKE_INSTALL_LIBDIR=lib \
        -DCMAKE_INSTALL_PREFIX=/lc-install .. && \
    cmake --build . && \
    cmake --install .
```

### 2단계: 소스에서 curl 빌드하거나 libcrypto 라이브러리가 포함된 curl 배포 사용
<a name="BuildCurlWithLibCrypto"></a>

SDK for C\$1\$1를 사용하려면 HTTP 요청을 수행할 시스템에 HTTP 클라이언트가 설치되어 있어야 합니다. HTTP 클라이언트는 사용하려는 libcrypto로 빌드해야 합니다. HTTP 클라이언트는 TLS 작업을 담당하므로 libcrypto 라이브러리가 사용됩니다.

 다음 예에서는 설치된 `AWS-LC` 버전을 사용하여 curl 라이브러리를 다시 빌드합니다.

```
git clone --depth 1 -b curl-8_5_0 https://github.com/curl/curl && \
    cd curl && \
    autoreconf -fi && \
    mkdir build && \
    cd build && \
    ../configure \
        --enable-warnings \
        --enable-werror \
        --with-openssl=/lc-install \
        --prefix=/curl-install && \
    make && \
    make install
```

### 3단계: libcrypto 및 curl 라이브러리를 사용하여 SDK 빌드
<a name="BuildUsingLibcryptoCurl"></a>

이제 이전에 생성한 libcrypto 및 curl 아티팩트를 사용하여 SDK for C\$1\$1를 빌드할 수 있습니다. 이 SDK 빌드는 모든 암호화 기능에 사용자 지정 libcrypto 라이브러리를 사용합니다.

```
git clone --depth 1 --recurse-submodules https://github.com/aws/aws-sdk-cpp \
    cd aws-sdk-cpp && \
    mkdir build && \
    cd build && \
    cmake -G Ninja \
        -DCMAKE_PREFIX_PATH="/curl-install;/lc-install;" \
        -DBUILD_ONLY="s3" \
        -DCMAKE_INSTALL_PREFIX=/sdk-install \
        -DAUTORUN_UNIT_TESTS=OFF .. && \
    cmake --build . && \
    cmake --install .
```

## Docker 이미지에 모두 통합
<a name="dockerImageForLibcrypto"></a>

다음 샘플 Docker 파일은 Amazon Linux 2023 환경에서 이러한 단계를 구현하는 방법을 보여줍니다.

```
        
# User AL2023 Base image
FROM public.ecr.aws/amazonlinux/amazonlinux:2023

# Install Dev Tools
RUN yum groupinstall -y "Development Tools"
RUN yum install -y cmake3 ninja-build

# Build and install AWS-LC on the fips branch both statically and dynamically.
RUN git clone --depth 1 -b fips-2022-11-02 https://github.com/aws/aws-lc && \\
    cd aws-lc && \\
    mkdir build && \\
    cd build && \\
    cmake -G Ninja \\
        -DCMAKE_INSTALL_LIBDIR=lib \\
        -DCMAKE_INSTALL_PREFIX=/lc-install .. && \\
    cmake --build . && \\
    cmake --install . && \\
    rm -rf ./* && \\
    cmake -G Ninja \\
        -DBUILD_SHARED_LIBS=ON \\
        -DCMAKE_INSTALL_LIBDIR=lib \\
        -DCMAKE_INSTALL_PREFIX=/lc-install .. && \\
    cmake --build . && \\
    cmake --install .

# Build and install curl targeting AWS-LC as openssl
RUN git clone --depth 1 -b curl-8_5_0 https://github.com/curl/curl && \\
    cd curl && \\
    autoreconf -fi && \\
    mkdir build && \\
    cd build && \\
    ../configure \\
        --enable-warnings \\
        --enable-werror \\
        --with-openssl=/lc-install \\
        --prefix=/curl-install && \\
    make && \\
    make install

# Build and install SDK using the Curl and AWS-LC targets previously built
RUN git clone --depth 1 --recurse-submodules https://github.com/aws/aws-sdk-cpp \\
    cd aws-sdk-cpp && \\
    mkdir build && \\
    cd build && \\
    cmake -G Ninja \\
        -DCMAKE_PREFIX_PATH="/curl-install;/lc-install;" \\
        -DBUILD_ONLY="s3" \\
        -DCMAKE_INSTALL_PREFIX=/sdk-install \\
        -DAUTORUN_UNIT_TESTS=OFF .. && \\
    cmake --build . && \\
    cmake --install .
```