

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

# 設定 AWS Secrets Manager
<a name="configure-asm"></a>

AWS Secrets Manager 可協助您保護存取應用程式、服務和 IT 資源所需的秘密。此服務可安全地存放、管理、加密和輪換資料庫憑證、API 金鑰和其他秘密，包括 OAuth 權杖，並提供與 Amazon Relational Database Service (Amazon RDS)、Amazon Redshift 和 Amazon DocumentDB 的原生整合。使用者和應用程式透過呼叫 Secrets Manager APIs 來擷取秘密，無需以純文字硬式編碼敏感資訊。Secrets Manager 包含精細存取控制許可，並提供集中位置來稽核秘密在 AWS 雲端內部部署和第三方環境中的輪換。

## 搭配 .NET Framework 應用程式使用 Secrets Manager 的先決條件
<a name="configure-asm-prereq"></a>
+ 作用中 AWS 帳戶
+ [Microsoft Visual Studio](https://visualstudio.microsoft.com/downloads/)，已安裝
+ AWS Command Line Interface (AWS CLI) 第 2 版，已安裝並設定為存取您的 AWS 帳戶 （請參閱[說明](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html))
+ AWS Toolkit for Visual Studio，已設定 （請參閱[說明](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html))
+ 使用 Secrets Manager 主控台或 建立和擷取的秘密 AWS CLI （請參閱[說明](https://docs.aws.amazon.com/secretsmanager/latest/userguide/managing-secrets.html))

## 範例
<a name="configure-asm-example"></a>

若要從 ASP.NET Core Web API (.NET 6) 中的 Secrets Manager 存取秘密：

1. 將下列 NuGet 套件新增至 ASP.NET Core Web API。

   ```
   AWSSDK.SecretsManager.Caching
   ```

1. 在 `Program.cs` 檔案中，進行下列變更。
   + 新增`Amazon.SecretsManager`命名空間 (1)。

     ```
     using Amazon.SecretsManager;
     ```
   + 註冊服務 (2)。

     ```
     builder.Services.AddScoped<IAmazonSecretsManager>(x =>
           new AmazonSecretsManagerClient(RegionEndpoint.EUWest2)
        );
     ```  
![\[用於存取 Secrets Manager 的 Program.cs 檔案變更\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-net-applications-security/images/asm-program-cs.png)

1. 若要從 Secrets Manager 擷取秘密，請對控制器類別檔案進行下列變更 （例如，`ValuesController.cs`)。
   + 新增建構函數 (1)。

     ```
     private readonly IAmazonSecretsManager _secretsManager;
     
     public SecretsController(IAmazonSecretsManager secretsManager)
     {
         _secretsManager = secretsManager;
     }
     ```
   + 實作 `GetSecret`方法 (2)。

     ```
     string secretName = "arn:aws:secretsmanager:eu-west-2:111122223333:secret:dev/myapp/tenant-gSj6qd";
     GetSecretValueRequest request = new GetSecretValueRequest();
     request.SecretId = secretName;
     request.VersionStage = "AWSCURRENT";
     Task<GetSecretValueResponse> response = _secretsManager.GetSecretValueAsync(request);
     return Ok(new { Secret = response.Result.SecretString });
     ```

     其中 *111122223333* 是指帳戶 ID。  
![\[從 Secrets Manager 擷取秘密的控制器類別檔案變更\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/modernization-net-applications-security/images/asm-controller-class.png)
**注意**  
`secretName` 是指秘密的名稱或 Amazon Resource Name (ARN)。建立秘密後，可以從 Secrets Manager 主控台擷取此值。您應該`secretName`動態呼叫 或從環境變數呼叫 。請勿在生產環境中硬式編碼此值。