

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

# 使用 Secrets Manager 指定敏感資料
<a name="specifying-sensitive-data-secrets"></a>

使用 AWS Batch，您可以將敏感資料儲存在 AWS Secrets Manager 秘密中，然後在任務定義中參考它們，藉此將敏感資料注入任務。存放在 Secrets Manager 秘密中的敏感資料可以做為環境變數或日誌組態的一部分公開給任務。

當您將秘密做為環境變數插入時，可以指定 JSON 金鑰或要插入的秘密版本。此程序可協助您控制向任務公開的敏感資料。如需有關秘密版本控制的詳細資訊，請參閱《AWS Secrets Manager 使用者指南》**中的 [AWS Secrets Manager重要術語和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

## 使用 Secrets Manager 指定敏感資料的考量事項
<a name="secrets-considerations"></a>

使用 Secrets Manager 為任務指定敏感資料時，應考慮下列事項。
+ 若要使用特定 JSON 金鑰或版本的秘密注入秘密，您運算環境中的容器執行個體必須安裝 1.37.0 版或更新版本的 Amazon ECS 容器代理程式。不過，我們建議您使用最新版的容器代理。如需有關檢查代理程式版本和更新至最新版本的資訊，請參閱[《Amazon Elastic Container Service 開發人員指南》中的更新 Amazon ECS 容器代理](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html)程式。 **

  若要將秘密的完整內容插入為環境變數，或在日誌組態中插入秘密，您的容器執行個體必須具有 1.23.0 版或更新版本的容器代理程式。
+ 僅支援存放文字資料的秘密，這些秘密是使用 [CreateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html) API 的 `SecretString` 參數建立的。不支援存放二進位資料的秘密，這是使用 [CreateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html) API `SecretBinary` 參數建立的秘密。
+ 使用參考 Secrets Manager 秘密的任務定義來擷取任務的敏感資料時，如果您也使用介面 VPC 端點，則必須為 Secrets Manager 建立介面 VPC 端點。如需詳細資訊，請參閱 *《AWS Secrets Manager 使用者指南》*中的[搭配使用 Secrets Manager 與 VPC 端點](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。
+ 當任務一開始啟動時，會將敏感資料注入您的任務。如果後續更新或輪換秘密，任務不會自動收到更新的值。您必須啟動新任務，以強制服務啟動具有更新秘密值的新任務。

## AWS Batch 秘密所需的 IAM 許可
<a name="secrets-iam"></a>

若要使用此功能，您必須擁有執行角色，並在任務定義中參考它。這可讓容器代理程式提取必要的 Secrets Manager 資源。如需詳細資訊，請參閱[AWS Batch IAM 執行角色](execution-IAM-role.md)。

若要讓您存取您建立的 Secrets Manager 秘密，請手動將下列許可新增為執行角色的內嵌政策。如需詳細資訊，請參閱 *IAM User Guide* 中的 [Adding and Removing IAM Policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。
+ `secretsmanager:GetSecretValue` - 如果您要參考 Secrets Manager 秘密，則需要此項目。
+ `kms:Decrypt` - 只有在您的秘密使用自訂的 KMS 金鑰而非預設金鑰時，才需要此項目。您的自訂金鑰的 ARN 應該新增為資源。

下列內嵌政策範例新增必要許可。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-2:777777777777:secret:<secret_name>",
                "arn:aws:kms:us-east-2:777777777777:key/<key_id>"
            ]
        }
    ]
}
```

------

## 插入敏感資料作為環境變數
<a name="secrets-envvar"></a>

您可以在任務定義中指定下列項目：
+ 包含在任務中設定的環境變數名稱的`secrets`物件
+ Secrets Manager 秘密的 Amazon Resource Name (ARN)
+ 包含要呈現給任務之敏感資料的其他參數

下列範例示範了必須為 Secrets Manager 秘密指定的完整語法。

```
arn:aws:secretsmanager:region:aws_account_id:secret:secret-name:json-key:version-stage:version-id
```

以下部分說明其他參數。這些參數是選用的。不過，如果您不使用它們，則必須包含冒號`:`才能使用預設值。以下提供範例深入說明。

`json-key`  
使用您要設為環境變數值的值，來指定金鑰/值對中的金鑰名稱。僅支援 JSON 格式的值。如果您沒有指定 JSON 金鑰，則會使用秘密的完整內容。

`version-stage`  
指定您要使用之秘密版本的預備標籤。如果指定了版本預備標籤，就無法指定版本 ID。如果未指定版本階段，則預設會擷取具有 `AWSCURRENT` 階段標籤的秘密。  
預備標籤會用來在不同版本的秘密更新或輪換時加以追蹤。每個版本的秘密都有一或多個預備標籤和 ID。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的 [AWS Secrets Manager 的關鍵術語和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

`version-id`  
針對您要使用的秘密版本，指定其唯一識別符。如果指定了版本 ID，就無法指定版本預備標籤。如果未指定版本 ID，則預設會擷取具有 `AWSCURRENT` 階段標籤的秘密。  
版本 ID 會用來在不同版本的秘密更新或輪換時加以追蹤。每個版本的秘密都有 ID。如需詳細資訊，請參閱*AWS Secrets Manager 《 使用者指南*》中的 [AWS Secrets Manager 的關鍵術語和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

### 容器定義範例
<a name="secrets-examples"></a>

下列範例示範您可以在容器定義中參考 Secrets Manager 秘密的方法。

**Example 參考完整秘密**  
以下是任務定義的程式碼片段，顯示參考 Secrets Manager 秘密全文時的格式。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
    }]
  }]
}
```

**Example 參考秘密中的特定金鑰**  
以下顯示來自 [ >get-secret-value](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/get-secret-value.html) 命令的範例輸出，其中顯示秘密的內容，以及與其相關聯的版本預備標籤和版本 ID。  

```
{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "VersionId": "871d9eca-18aa-46a9-8785-981dd39ab30c",
    "SecretString": "{\"username1\":\"password1\",\"username2\":\"password2\",\"username3\":\"password3\"}",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1581968848.921
}
```
在 ARN 結尾指定金鑰名稱，來在容器定義中參考上一個輸出的特定金鑰。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::"
    }]
  }]
}
```

**Example 參考特定秘密版本**  
以下顯示來自 [ >describe-secret](https://docs.aws.amazon.com/cli/latest/reference/secretsmanager/describe-secret.html) 命令的範例輸出，其中顯示秘密的未加密內容，以及秘密所有版本的中繼資料。  

```
{
    "ARN": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf",
    "Name": "appauthexample",
    "Description": "Example of a secret containing application authorization data.",
    "RotationEnabled": false,
    "LastChangedDate": 1581968848.926,
    "LastAccessedDate": 1581897600.0,
    "Tags": [],
    "VersionIdsToStages": {
        "871d9eca-18aa-46a9-8785-981dd39ab30c": [
            "AWSCURRENT"
        ],
        "9d4cb84b-ad69-40c0-a0ab-cead36b967e8": [
            "AWSPREVIOUS"
        ]
    }
}
```
在 ARN 結尾指定金鑰名稱，來在容器定義中參考上一個輸出的特定版本預備標籤。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::AWSPREVIOUS:"
    }]
  }]
}
```
在 ARN 結尾指定金鑰名稱，來在容器定義中參考上一個輸出的特定版本 ID。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf::9d4cb84b-ad69-40c0-a0ab-cead36b967e8"
    }]
  }]
}
```

**Example 參考秘密的特定金鑰和版本預備標籤**  
以下說明如何參考秘密中的特定金鑰和特定版本預備標籤。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1:AWSPREVIOUS:"
    }]
  }]
}
```
若要指定特定的金鑰和版本 ID，請使用下列語法。  

```
{
  "containerProperties": [{
    "secrets": [{
      "name": "environment_variable_name",
      "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:appauthexample-AbCdEf:username1::9d4cb84b-ad69-40c0-a0ab-cead36b967e8"
    }]
  }]
}
```

## 在日誌組態中注入敏感資料
<a name="secrets-logconfig"></a>

當您在任務定義`logConfiguration`中指定 時，您可以使用要在容器中設定的日誌驅動程式選項名稱`secretOptions`，以及包含要呈現給容器之敏感資料之 Secrets Manager 秘密的完整 ARN。

以下是任務定義的程式碼片段，顯示參考 Secrets Manager 秘密時的格式。

```
{
  "containerProperties": [{
    "logConfiguration": [{
      "logDriver": "splunk",
      "options": {
        "splunk-url": "https://cloud.splunk.com:8080"
      },
      "secretOptions": [{
        "name": "splunk-token",
        "valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:secret_name-AbCdEf"
      }]
    }]
  }]
}
```

## 建立 AWS Secrets Manager 秘密
<a name="secrets-create-secret"></a>

您可以使用 Secrets Manager 主控台為您的敏感資料建立秘密。如需詳細資訊，請參閱 *《AWS Secrets Manager 使用者指南》*中的[建立基本秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)。

**建立基本秘密**

使用 Secrets Manager 為您的敏感資料建立秘密。

1. 開啟位於的 Secrets Manager 主控台[https://console.aws.amazon.com/secretsmanager/](https://console.aws.amazon.com/secretsmanager/)。

1. 選擇 **Store a new secret** (存放新機密)。

1. 針對 **Select secret type (選取秘密類型)**，選擇 **Other type of secrets (其他秘密類型)**。

1. 將自訂秘密詳細資訊指定為 **Key (金鑰)** 與 **Value (值)** 對。例如，您可以指定 `UserName` 的金鑰，然後提供適當的使用者名稱作為其值。新增名為 `Password` 的第二個金鑰，再輸入密碼文字作為其值。您也可以新增資料庫名稱、伺服器地址或 TCP 連接埠的項目。您可以新增任意數量的對組用以存放您需要的資訊。

   或者，您可以選擇 **Plaintext (純文字)** 標籤，然後以任何您喜歡的方式輸入秘密值。

1. 選擇您要用來加密秘密中受保護文字的 AWS KMS 加密金鑰。如果您未選擇一個金鑰，則 Secrets Manager 將查看帳戶是否有預設金鑰，若有便會使用該金鑰。如果預設金鑰不存在，Secrets Manager 將自動為您建立一個。您也可以選擇 **Add new key** (新增金鑰) 來建立專供此秘密使用的自訂 KMS 金鑰。若要建立自己的 KMS 金鑰，您必須擁有在帳戶中建立 KMS 金鑰的許可。

1. 選擇**下一步**。

1. 針對 **Secret name (秘密名稱)**，請輸入可選的路徑與名稱，例如 **production/MyAwesomeAppSecret** 或 **development/TestSecret**，然後選擇 **Next (下一步)**。您也可以選擇性新增描述，協助您日後回憶起此秘密的用途。

   秘密名稱必須是 ASCII 字母、數字或下列任一字元：/\$1\$1=.@-

1. (選用) 在此階段，您可以為秘密設定輪換。針對此程序，維持 **Disable automatic rotation (停用自動輪換)**，然後選擇 **Next (下一步)**。

   如需有關如何在新的或現有的秘密上設定輪換的資訊，請參閱[輪換您的 AWS Secrets Manager 秘密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

1. 檢視您的設定，然後選擇 **Store secret** (存放秘密) 以儲存您在 Secrets Manager 中輸入作為新秘密的所有內容。