

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在適用於 C\$1\$1 的 AWS SDK 中設定服務用戶端
<a name="configuring"></a>

 若要以程式設計方式存取 AWS 服務，適用於 C\$1\$1 的 AWS SDK 會針對每個 使用用戶端類別 AWS 服務。例如，如果您的應用程式需要存取 Amazon EC2，您的應用程式會建立 Amazon EC2 用戶端物件以與該服務連接。然後，您可以使用 服務用戶端向該用戶端提出請求 AWS 服務。

若要向 提出請求 AWS 服務，您必須先建立服務用戶端。對於 AWS 服務 您的程式碼使用的每個 ，它都有自己的程式庫和自己的專用類型來與其互動。用戶端會針對服務公開的每個 API 操作公開一個方法。

設定 SDK 行為有許多替代方法，但最終一切都與服務用戶端的行為有關。使用從中建立的服務用戶端之前，任何組態都不會生效。

當您使用 開發 AWS 時，您必須建立程式碼向 進行身分驗證的方式 AWS 服務。您也必須設定 AWS 區域 要使用的 。

[AWS SDKs和工具參考指南](https://docs.aws.amazon.com/sdkref/latest/guide/)也包含許多 AWS SDKs 中常見的設定、功能和其他基本概念。

**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`和 使用的 iostream `AWSClient`](configuring-iostreams.md)
+ [使用自訂 libcrypto](libcrypto.md)

# 在 `Aws::SDKOptions` 中使用 的一般組態 適用於 C\$1\$1 的 AWS SDK
<a name="sdkoptions"></a>

結構包含 SDK [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::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` 需要關閉 （也稱為匿名函數或 Lambda 表達式），而不是 `std::shared_ptr`。每個 SDK 原廠函數都以這種方式運作，因為在發生原廠記憶體配置時，尚未安裝記憶體管理員。透過將關閉傳遞至 方法，將呼叫記憶體管理員，以便在安全的情況下執行記憶體配置。完成此程序的簡單技巧是使用 Lambda 表達式。
+ 使用全域`SIGPIPE`處理常式

  如果您使用 curl 和 OpenSSL 建置適用於 C\$1\$1 的 SDK，則必須指定訊號處理常式。如果您不使用自己的自訂訊號處理常式，請將 `installSigPipeHandler`設定為 `true`。

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

  當 `installSigPipeHandler`為 時`true`，適用於 C\$1\$1 的 SDK 會使用忽略`SIGPIPE`訊號的處理常式。如需 的詳細資訊`SIGPIPE`，請參閱 GNU 作業系統網站上的[操作錯誤訊號](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 執行緒安全](https://curl.se/libcurl/c/threadsafe.html)。此行為不會自動內建於 SDK，因為訊號處理常式對於每個應用程式都是全域的，程式庫是 SDK 的相依性。

# 在外部設定適用於 C\$1\$1 服務用戶端的 AWS SDK
<a name="config-external"></a>

許多組態設定可以在程式碼之外處理。在外部處理組態時，組態會套用至所有應用程式。大多數組態設定可以設定為環境變數或單獨的共用 AWS `config`檔案中。共用`config`檔案可以維護個別的設定集，稱為設定檔，為不同的環境或測試提供不同的組態。

環境變數和共用`config`檔案設定會在 SDKs 和工具之間 AWS 標準化和共用，以支援不同程式設計語言和應用程式的一致功能。

請參閱 *AWS SDKs和工具參考指南*，了解如何透過這些方法設定您的應用程式，以及每個跨 sdk 設定的詳細資訊。若要查看開發套件可從環境變數或組態檔案解析的所有設定，請參閱開發套件和工具參考指南中的[設定](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html)參考。 *AWS SDKs *

若要向 提出請求 AWS 服務，您必須先執行個體化該服務的用戶端。您可以設定服務用戶端的常見設定，例如逾時、HTTP 用戶端和重試組態。

每個服務用戶端都需要 AWS 區域 和登入資料提供者。SDK 使用這些值將請求傳送到 資源的正確區域，並使用正確的登入資料簽署請求。您可以在程式碼中以程式設計方式指定這些值，或從環境中自動載入這些值。

開發套件有一系列位置 （或來源） 可供其檢查，以尋找組態設定的值。

1. 程式碼中或服務用戶端本身上設定的任何明確設定，都優先於任何其他設定。

1. 環境變數
   + 如需設定環境變數的詳細資訊，請參閱 *AWS SDKs和工具參考指南*中的[環境變數](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html)。
   + 請注意，您可以為殼層設定不同範圍的環境變數：全系統、全使用者和特定終端機工作階段。

1. 共用 `config`和 `credentials` 檔案
   + 如需設定這些檔案的詳細資訊，請參閱 SDK [`config`和工具參考指南中的共用 和 `credentials` 檔案](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。 *AWS SDKs *

1. 開發套件原始碼本身提供的任何預設值都會最後使用。
   + 有些屬性，例如區域，沒有預設值。您必須在程式碼、環境設定或共用`config`檔案中明確指定它們。如果 SDK 無法解析必要的組態，API 請求可能會在執行時間失敗。

**注意**  
 若要查看開發套件可從環境變數或組態檔案解析的所有設定，請參閱開發套件和工具參考指南中的[設定](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html)參考。 *AWS SDKs *

# 在程式碼中設定適用於 C\$1\$1 服務用戶端的 AWS SDK
<a name="client-config"></a>

直接在程式碼中處理組態時，組態範圍僅限於使用該程式碼的應用程式。在該應用程式中，有所有服務用戶端的全域組態、特定 AWS 服務 類型之所有用戶端的組態，或特定服務用戶端執行個體的組態等選項。

 適用於 C\$1\$1 的 AWS SDK 包含 AWS 服務 用戶端類別，可提供與 AWS 服務 您在應用程式中使用的 互動的功能。在適用於 C\$1\$1 的 開發套件中，您可以變更預設用戶端組態，這在您想要執行下列動作時很有幫助：
+ 透過代理連線到網際網路
+ 變更 HTTP 傳輸設定，例如連線逾時和請求重試
+ 指定 TCP 通訊端緩衝區大小提示

`ClientConfiguration` 是適用於 C\$1\$1 的 SDK 中的結構，您可以在程式碼中執行個體化和利用。下列程式碼片段說明使用此類別透過代理存取 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**  
控制以帳戶為基礎的端點路由行為。有效值為「必要」、「停用」或「偏好」。預設值為「偏好」。設為「停用」以在必要時關閉以帳戶為基礎的端點路由。

**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`公用程式準備的目錄。除非您的環境使用符號連結，否則不應設定這些變數。這些變數不會影響 Windows 和 macOS 系統。

**checksumConfig**  
包含檢查總和計算和驗證設定。包含`responseChecksumValidation`預設值為 WHEN\$1SUPPORTED 的 `requestChecksumCalculation`和 。

**configFactories**  
指定初始化用戶端公用程式類別的原廠方法，例如 `Executor`和 `RetryStrategy`。除非覆寫，否則使用預設工廠。

**requestTimeoutMs 和 connectTimeoutMs**  
指定 HTTP 請求逾時前的等待時間，以毫秒為單位。例如，在傳輸大型檔案時，請考慮增加這些時間。

**credentialProviderConfig**  
包含登入資料提供者的組態設定。使用此結構來自訂 SDK 取得 AWS 登入資料的方式。

**disableExpectHeader**  
僅適用於 CURL HTTP 用戶端。根據預設，CURL 會在 HTTP 請求中新增「Expect： 100-Continue」標頭，以避免在伺服器收到標頭後立即回應錯誤的情況下傳送 HTTP 承載。此行為可以儲存往返，在承載很小且網路延遲相關的情況下很有用。變數的預設設定為 false。如果設為 true，會指示 CURL 同時傳送 HTTP 請求標頭和內文承載。

**disableIMDS**  
控制是否停用執行個體中繼資料服務 (IMDS) 呼叫。預設設定為 false。設為 true 以在 EC2 執行個體外部執行時停用 IMDS 呼叫。

**disableImdsV1**  
控制在允許 IMDSv1 時是否停用 IMDSv2 呼叫。預設設定為 false。設為 true 可僅停用 IMDSv1 呼叫以增強安全性。

**enableClockSkewAdjustment**  
控制是否在每次 HTTP 嘗試後調整時鐘扭曲。預設設定為 false。

**enableEndpointDiscovery**  
控制是否使用端點探索。根據預設，會使用區域或覆寫端點。若要啟用端點探索，請將 變數設定為 true。

**enableHostPrefixInjection**  
控制 HTTP 主機是否將「資料」字首新增至 DiscoverInstances 請求。預設會啟用此行為。若要停用它，請將 變數設定為 false。

**enableHttpClientTrace**  
控制是否啟用 HTTP 用戶端追蹤進行偵錯。預設設定為 false。設定為 true 以啟用詳細的 HTTP 請求和回應記錄。

**enableTcpKeepAlive**  
控制是否要傳送 TCP 保持連線封包。預設設定為 true。搭配 `tcpKeepAliveIntervalMs`變數使用 。此變數不適用於 WinINet 和 IXMLHTTPRequest2 用戶端。

**endpointOverride**  
指定要與服務通訊的覆寫 HTTP 端點。

**執行器**  
參考非同步執行器處理常式的實作。預設行為是為每個非同步呼叫建立和分離執行緒。若要變更此行為，請實作 `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 套件進行偵錯，或使用代理連線到網際網路。

**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` 類別的子類別，並將執行個體指派給此變數。

**結構描述**  
指定 HTTP 或 HTTPS 的 URI 定址機制。預設方案為 HTTPS。

**tcpKeepAliveIntervalMs**  
指定透過 TCP 連線傳送持續連線封包的時間間隔，以毫秒為單位。預設間隔為 30 秒。最低設定為 15 秒。此變數不適用於 WinINet 和 IXMLHTTPRequest2 用戶端。

**telemetryProvider**  
參考遙測供應商實作，以收集指標和追蹤資料。設定此設定以啟用可觀測性功能。

**userAgent**  
僅供內部使用。請勿變更此變數的設定。

**useDualStack**  
控制是否使用雙堆疊 IPv4 和 IPv6 端點。請注意，並非所有 AWS 服務在所有區域中都支援 IPv6。

**useFIPS**  
控制是否使用聯邦資訊處理標準 (FIPS) 140-2 驗證的密碼編譯模組。預設設定為 false。需要 FIPS 合規時，設為 true。

**verifySSL**  
控制是否要驗證 SSL 憑證。預設會驗證 SSL 憑證。若要停用驗證，請將 變數設定為 false。

**version**  
指定用於請求的 HTTP 版本。預設設定為 HTTP\$1VERSION\$12TLS (HTTP/2 over TLS)。

**winHTTPOptions**  
包含 Windows 特定的 HTTP 組態選項。包含具有預設設定 false 的 useAnonymousAuth。

# AWS 區域 為適用於 C\$1\$1 的 AWS SDK 設定
<a name="region"></a>

您可以使用 存取在特定地理區域中操作 AWS 服務 的 AWS 區域。這對於備援和讓資料和應用程式靠近您和您的使用者存取它們的位置，都很有用。

**重要**  
大多數資源都位於特定 中， AWS 區域 您必須在使用 SDK 時為資源提供正確的區域。

如需如何透過共用 AWS `config`檔案或環境變數設定預設區域的範例，請參閱《 *AWS SDKs與工具參考指南*[AWS 區域](https://docs.aws.amazon.com/sdkref/latest/guide/feature-region.html)》中的 。

您必須設定預設值 適用於 C\$1\$1 的 AWS SDK ，讓 AWS 區域 用於 AWS 請求。此預設值用於非以 區域指定的任何 SDK 服務方法呼叫。在適用於 C\$1\$1 的 開發套件中，您也可以使用 設定預設區域[程式碼中的用戶端組態](client-config.md)。

# 使用適用於 C\$1\$1 憑證提供者的 AWS SDK
<a name="credproviders"></a>

 對 的所有請求 AWS 都必須使用 發行的登入資料以密碼編譯方式簽署 AWS。在執行時間，軟體開發套件會檢查多個位置來擷取登入資料的組態值。

使用 進行身分驗證 AWS 可以在您的程式碼庫之外處理。開發套件可以使用登入資料提供者鏈自動偵測、使用和重新整理許多身分驗證方法。

如需專案身分 AWS 驗證入門的引導選項，請參閱*AWS SDKs和工具參考指南》中的*[身分驗證和存取](https://docs.aws.amazon.com/sdkref/latest/guide/access.html)。

## 登入資料提供者鏈結
<a name="credproviders-default-credentials-provider-chain"></a>

如果您在建構用戶端時未明確指定登入資料提供者，適用於 C\$1\$1 的 SDK 會使用登入資料提供者鏈結來檢查您可以提供登入資料的一系列位置。一旦 SDK 在其中一個位置找到登入資料，搜尋就會停止。

### 登入資料擷取順序
<a name="credproviders-credential-retrieval-order"></a>

所有 SDKs 都有一系列位置 （或來源） 進行檢查，以取得可用於向 提出請求的有效登入資料 AWS 服務。找到有效的憑證後，系統就會停止搜尋。此系統搜尋稱為登入資料提供者鏈結。

對於鏈結中的每個步驟，有不同的方法來設定值。直接在程式碼中設定值一律優先，接著設定為環境變數，然後在共用 AWS `config`檔案中設定。如需詳細資訊，請參閱 *AWS SDKs 和工具參考指南*中的[設定優先順序](https://docs.aws.amazon.com/sdkref/latest/guide/settings-reference.html#precedenceOfSettings)。

SDK 會嘗試從共用 AWS `config` 和 `credentials` 檔案中的 `[default]`設定檔載入登入資料。您可以使用 `AWS_PROFILE`環境變數來選擇您要 SDK 載入的具名設定檔，而不是使用 `[default]`。`config` 和 `credentials` 檔案由 AWS SDKs和工具共用。*AWS SDKs和工具參考指南*提供 AWS SDKs和 所使用的開發套件組態設定資訊 AWS CLI。若要進一步了解如何透過共用 AWS `config`檔案設定 SDK，請參閱[共用組態和登入資料檔案](https://docs.aws.amazon.com/sdkref/latest/guide/file-format.html)。若要進一步了解如何透過設定環境變數來設定 SDK，請參閱[環境變數支援](https://docs.aws.amazon.com/sdkref/latest/guide/environment-variables.html)。

若要使用 驗證 AWS，適用於 C\$1\$1 的 SDK 會依下列順序檢查登入資料提供者。

1. **AWS 存取金鑰 （暫時和長期登入資料）**

   SDK 會嘗試從 `AWS_ACCESS_KEY_ID`和 `AWS_SECRET_ACCESS_KEY`以及`AWS_SESSION_TOKEN`環境變數，或從共用 AWS `credentials`檔案載入登入資料。
   +  如需設定此提供者的指引，請參閱 *AWS SDKs和工具參考指南*中的[AWS 存取金鑰](https://docs.aws.amazon.com/sdkref/latest/guide/access-users.html)。
   +  如需此供應商 SDK 組態屬性的詳細資訊，請參閱 SDK *AWS SDKs 和工具參考指南*中的[AWS 存取金鑰](https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html)。

1. **AWS STS Web 身分**

   建立需要存取的行動應用程式或用戶端型 Web 應用程式時 AWS， AWS Security Token Service (AWS STS) 會為透過公有身分提供者 (IdP) 驗證的聯合身分使用者傳回一組臨時安全登入資料。
   + 當您在設定檔中指定此項目時，軟體開發套件或工具會嘗試使用 AWS STS `AssumeRoleWithWebIdentity` API 方法擷取臨時登入資料。如需此方法的詳細資訊，請參閱 *AWS Security Token Service API 參考*中的 [AssumeRoleWithWebIdentity](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html)。
   +  如需設定此提供者的指引，請參閱 *AWS SDKs和工具參考指南*中的[聯合 Web 身分或 OpenID Connect](https://docs.aws.amazon.com/sdkref/latest/guide/access-assume-role.html#webidentity)。
   +  如需此供應商 SDK 組態屬性的詳細資訊，請參閱《 *AWS SDKs和工具參考指南*》中的[擔任角色登入資料供應商](https://docs.aws.amazon.com/sdkref/latest/guide/feature-assume-role-credentials.html)。

1. **IAM Identity Center**

   如果您使用 IAM Identity Center 進行身分驗證，這是指適用於 C\$1\$1 的 SDK 使用透過執行 CLI AWS 命令 設定的單一登入字符`aws sso login`。SDK 使用 IAM Identity Center 交換為有效字符的臨時登入資料。開發套件接著會在呼叫時使用臨時登入資料 AWS 服務。如需此程序的詳細資訊，請參閱《 [SDK 和工具參考指南》中的了解 的 SDK 登入資料解析 AWS 服務](https://docs.aws.amazon.com/sdkref/latest/guide/understanding-sso.html#idccredres)。 *AWS SDKs *
   +  如需設定此提供者的指引，請參閱 *AWS SDKs和工具參考指南中的 *[IAM Identity Center 身分驗證](https://docs.aws.amazon.com/sdkref/latest/guide/access-sso.html)。
   +  如需此提供者 SDK 組態屬性的詳細資訊，請參閱 SDK *AWS 和工具參考指南中的 SDKs*[IAM Identity Center 憑證提供者](https://docs.aws.amazon.com/sdkref/latest/guide/feature-sso-credentials.html)。

1. **使用 AWS Signin 登入登入憑證身分解析程式**

   如果您使用 AWS 登入和主控台登入資料進行驗證，這是指適用於 C\$1\$1 的 SDK 使用執行 `aws login`或在 CLI `aws login --profile`中設定的主控台登入資料。軟體開發套件會在呼叫 AWS 服務時使用這些登入資料。
   +  如需此程序的詳細資訊，請參閱 *AWS SDKs和工具參考指南*中的[使用主控台登入進行 AWS 本機開發](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sign-in.html)。

1. **外部程序提供者**

   此提供者可用來提供自訂實作，例如從內部部署登入資料存放區擷取登入資料，或與您的內部部署識別提供者整合。
   +  如需設定此提供者之其中一種方式的指引，請參閱 *AWS SDKs 和工具參考指南*中的 [IAM Roles Anywhere](https://docs.aws.amazon.com/sdkref/latest/guide/access-rolesanywhere.html)。
   +  如需此供應商 SDK 組態屬性的詳細資訊，請參閱 SDK *AWS SDKs 和工具參考指南*中的[程序登入資料供應商](https://docs.aws.amazon.com/sdkref/latest/guide/feature-process-credentials.html)。

1. **Amazon ECS 和 Amazon EKS 容器憑證 **

   您的 Amazon Elastic Container Service 任務和 Kubernetes 服務帳戶可以具有與其相關聯的 IAM 角色。IAM 角色中授予的許可由在任務或 Pod 容器中執行的容器擔任。此角色可讓您的 SDK for C\$1\$1 應用程式碼 （在容器上） 使用其他 AWS 服務。

   SDK 會嘗試從 `AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`或 `AWS_CONTAINER_CREDENTIALS_FULL_URI`環境變數擷取登入資料，這些變數可由 Amazon ECS 和 Amazon EKS 自動設定。
   + 如需為 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 組態屬性的詳細資訊，請參閱 SDK *AWS SDKs 和工具參考指南*中的[容器憑證提供者](https://docs.aws.amazon.com/sdkref/latest/guide/feature-container-credentials.html)。

1. **Amazon EC2 執行個體中繼資料服務 **

   建立 IAM 角色並將其連接至您的執行個體。執行個體上的適用於 C\$1\$1 的 SDK 應用程式會嘗試從執行個體中繼資料擷取角色提供的登入資料。
   + 如需設定此角色和使用中繼資料的詳細資訊，請參閱《[Amazon EC2 使用者指南》中的適用於 Amazon EC2 ](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)的 IAM 角色。 *Amazon EC2 *
   +  如需此提供者 SDK 組態屬性的詳細資訊，請參閱《 *AWS SDKs和工具參考指南*》中的 [IMDS 登入資料提供者](https://docs.aws.amazon.com/sdkref/latest/guide/feature-imds-credentials.html)。

您可以在 GitHub 的 適用於 C\$1\$1 的 AWS SDK 原始程式碼[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 使用適用於 C\$1\$1 的 AWS SDK 透過 驗證](credentials.md)入門主題中設定 AWS 登入登入資料身分驗證。其他身分驗證方法適用於不同的情況。為了避免安全風險，我們建議您一律使用短期登入資料。如需其他身分驗證方法程序，請參閱《 *AWS SDKs和工具參考指南》中的身分*[驗證和存取](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);
```

## 身分快取
<a name="credproviders-identity-caching"></a>

SDK 會快取登入資料和其他身分類型，例如 SSO 字符。根據預設，開發套件會使用延遲快取實作，在第一次請求時載入登入資料、快取登入資料，然後在另一個請求接近過期時嘗試重新整理登入資料。從相同 建立的用戶端[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 參數 適用於 C\$1\$1 的 AWS SDK
<a name="cmake-params"></a>

使用本節列出的 [CMake](https://cmake.org/) 參數來自訂開發套件的建置方式。

您可以使用 CMake GUI 工具設定這些選項，或使用 *-D* 設定命令列。 例如：

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

## 一般 CMake 變數和選項
<a name="cmake-general-options"></a>

以下是會影響 SDK 原始程式碼建置程序的一般**`cmake`**變數和選項。

**注意**  
建置適用於 C\$1\$1 的 SDK 原始程式碼時，請使用這些參數。

**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` ** 設定步驟會產生您的用戶端，並將其做為子目錄包含在建置中。這對於產生 C\$1\$1 用戶端以使用其中一個 [API Gateway](https://aws.amazon.com/api-gateway) 服務特別有用。例如：

```
-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\$1](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>

要附加到 LD\$1LIBRARY\$1PATH 的路徑，以供 CMake 自動執行單元測試。如果覆寫相依性需要自訂執行期程式庫，請設定此路徑。

值  
 *字串。*

預設  
 *無* 

### 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 使用共用加密程式庫。請改為`OFF`使用 [BUILD\$1SHARED\$1LIBS](#cmake-build-shared-libs)的設定。

值  
 *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>

僅建置您要使用的用戶端。如果設定為高階 SDK，例如 `aws-cpp-sdk-transfer`，*BUILD\$1ONLY* 會解析任何低階用戶端相依性。它也會建置與您選取的專案相關的整合和單元測試，如果這些專案存在的話。這是清單引數，值以分號 (`;`) 字元分隔。例如：

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

**注意**  
無論 *BUILD\$1ONLY* 參數的值為何`aws-sdk-cpp-core`，核心 SDK 模組 *一律*會建置。

### 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>

curl 的路徑包含包含`libcurl`標頭的目錄。

值  
 *所選`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`，您可能仍想要使用 STL 範本類型來協助 Windows 上的 DLL 安全。

如果靜態連結為 `ON`，則自訂記憶體管理預設為*關閉* (`0`)。如果動態連結為 `ON`，則自訂記憶體管理預設為 (`1`) *上的* ，並避免跨 DLL 配置和解除配置。

**注意**  
為了防止連結器不相符錯誤，您必須在建置系統中使用相同的值 (`0` 或 `1`)。

若要安裝自己的記憶體管理員來處理 SDK 所做的配置，您必須`USE_AWS_MEMORY_MANAGEMENT`設定`-DCUSTOM_MEMORY_MANAGEMENT`和定義所有依賴 SDK 的建置目標。

### 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。 IMDSv2 如需 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>

控制 SDK 是否建置為啟用執行時間類型資訊 (RTTI)。

值  
 *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`，軟體開發套件也會在`-fdata-sections`編譯時為 gcc `-ffunction-sections`和 clang 新增和編譯器旗標。

如需詳細資訊，請參閱 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`， 會強制使用 curl 用戶端，而不是預設的 [WinHTTP](https://msdn.microsoft.com/en-us/library/windows/desktop/aa382925%28v=vs.85%29.aspx) 資料傳輸提供者。

值  
 *ON* \$1 *OFF* 

預設  
 *關閉* 

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

如果為 `ON`，軟體開發套件*會動態*連結至 C 執行期；否則會使用 *BUILD\$1SHARED\$1LIBS* 設定 （有時需要與舊版軟體開發套件回溯相容）。

值  
 *ON* \$1 *OFF* 

預設  
 *開啟* 

### 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* \$1 *OFF* 

預設  
 *關閉* 

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

如果為 `ON`，則可防止預設平台特定的 HTTP 用戶端內建到程式庫中。如果*開啟*，您將需要提供自己的平台特定 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\$1](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\$1](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`，開發套件會使用 OpenSSL 建置；否則，會使用 [https://github.com/awslabs/aws-lc](https://github.com/awslabs/aws-lc)。 `AWS-LC` 是由 AWS 密碼編譯團隊為 AWS 及其客戶維護的一般用途密碼編譯程式庫。轉動 `OFF` 參數會在系統預設目錄中安裝 `AWS-LC`以取代 OpenSSL。如果您的系統中已有 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>

當您建立開發套件的 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。控制要輸出程式碼的應用程式二進位界面 (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 的編譯器。

**注意**  
隨著 GCC 被 Android NDK 取代，建議使用預設值。

預設  
 *independent-clang* 

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

僅限 Android。根據預設，Android 建置會使用透過 NDK 指令碼建構的獨立 clang 型工具鏈。若要使用您自己的工具鏈，請開啟此選項**。

值  
 *ON* \$1 *OFF* 

預設  
 *關閉* 

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

僅限 Android。指定組建系統應尋找 Android NDK 的覆寫路徑。根據預設，如果未設定此變數，建置系統會檢查環境變數 (`ANDROID_NDK`)。

# 在適用於 C\$1\$1 的 AWS SDK 中設定和使用記錄
<a name="logging"></a>

 適用於 C\$1\$1 的 AWS SDK 包含可設定的記錄，可產生 SDK 在執行期間所執行動作的記錄。若要啟用記錄，請將 `LogLevel`的 設定為應用程式`SDKOptions`的適當詳細資訊。

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

有七個詳細程度可供選擇。預設值為 `Off`，不會產生任何日誌。 `Trace`會產生最詳細的層級，並`Fatal`產生最少的訊息，僅報告嚴重錯誤條件。

在您的應用程式中啟用記錄後，軟體開發套件將遵循 的預設命名模式，在您的可執行檔目錄中產生日誌檔案`aws_sdk_<date>.log`。字首命名選項產生的日誌檔案每小時會輪換一次，以允許 封存或刪除日誌檔案。

開發套件的更新版本越來越依賴基礎的 AWS 通用執行期 (CRT) 程式庫。這些程式庫提供 SDKs之間的常見功能和基本操作。根據預設，來自 CRT 程式庫的所有日誌訊息都會重新導向至適用於 C\$1\$1 的 SDK。您為適用於 C\$1\$1 的 SDK 指定的日誌層級和記錄系統也適用於 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::Utils::Logging::DefaultLogSystem` 類別子分類，這是 的一部分 適用於 C\$1\$1 的 AWS SDK。此範例會覆寫`ProcessFormattedStatement`虛擬函數以自訂記錄。

 `Aws::Utils::Logging::DefaultLogSystem` 是 中`Aws::Utils::Logging::LogSystemInterface`用於自訂記錄 適用於 C\$1\$1 的 AWS SDK 的子類別之一。

```
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;
}
```

請參閱 GitHub 上的[完整範例](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/sdk-customization/override_default_logger.cpp)。

# 在 中覆寫 HTTP 用戶端 適用於 C\$1\$1 的 AWS SDK
<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 上建置時需要額外的步驟。如需在 Windows 上使用 curl 支援建置 SDK 的詳細資訊，請參閱 [在 Windows 適用於 C\$1\$1 的 AWS SDK 上建置](setup-windows.md)。

# 在 `AWSClient`中控制 `HttpClient`和 使用的 iostream 適用於 C\$1\$1 的 AWS SDK
<a name="configuring-iostreams"></a>

根據預設，所有回應都會使用 支援的輸入串流`stringbuf`。如有需要，您可以覆寫預設行為。例如，如果您使用 Amazon S3 `GetObject`且不想將整個檔案載入記憶體，您可以使用 `IOStreamFactory` 中的 `AmazonWebServiceRequest`來傳遞 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 程式庫 適用於 C\$1\$1 的 AWS SDK
<a name="libcrypto"></a>

 根據預設， 適用於 C\$1\$1 的 AWS SDK 會使用預設的系統密碼編譯程式庫來確保傳輸層的安全性。不過，適用於 C\$1\$1 的 SDK 可以選擇性地設定為在從來源建置 SDK 時使用不同的 libcrypto 程式庫。這在功能上表示所有密碼編譯操作都會轉換為 OpenSSL 的自訂實作。例如，您可能想要在 [FIPS 模式下](https://aws.amazon.com/blogs/security/aws-lc-is-now-fips-140-3-certified/)使用程式[https://github.com/aws/aws-lc](https://github.com/aws/aws-lc)庫，以在應用程式中實現 FIPS 標準。

## 如何在適用於 C\$1\$1 的 SDK 中建置自訂 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 的分佈都可以運作。

適用於 C\$1\$1 的 SDK 及其相依性 CRT 都使用 libcrypto 進行密碼編譯函數，而且兩者都需要以相同的方式處理相依性。適用於 C\$1\$1 的 SDK 取決於請求是否使用 SDK `CRT S3`的功能，這取決於兩個不同的 HTTP 用戶端。CRT 具體取決於 [s2n](https://github.com/aws/s2n-tls)，這是在啟動時初始化的 TLS 實作。軟體開發套件和 s2n 團隊都有 cmake 參數，可強制使用共用的 libcrypto 程式庫，無論 的值為何[BUILD\$1SHARED\$1LIBS](cmake-params.md#cmake-build-shared-libs)。一般而言，您希望 CRT HTTP 用戶端和一般 HTTP 用戶端使用相同的 libcrypto。在這種情況下，這表示在相依性樹狀目錄中參考 OpenSSL。開發套件透過 提供此項目[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>

適用於 C\$1\$1 的 SDK 需要在將用於提出 HTTP 請求的系統上安裝 HTTP 用戶端。HTTP 用戶端必須使用您要使用的 libcrypto 建置。HTTP 用戶端負責 TLS 操作，因此使用您的 libcrypto 程式庫。

 在下列範例中，curl 程式庫是使用已安裝的 版本重建`AWS-LC`。

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

適用於 C\$1\$1 的 SDK 現在可使用先前建立的 libcrypto 和 curl 成品來建置。此 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 .
```