

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 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 用户指南*中的[添加和删除 IAM 策略](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 资源名称（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 用户指南》*中的 S [AWS ecrets Manager 的关键术语和概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/terms-concepts.html#term_secret)。

`version-id`  
指定要使用的密钥版本的唯一标识符。如果指定了版本 ID，则无法指定版本暂存标签。如果未指定版本 ID，则默认行为是使用 `AWSCURRENT` 暂存标签检索密钥。  
版本 IDs 用于在密钥的不同版本更新或轮换时对其进行跟踪。密码的每个版本均有一个 ID。有关更多信息，请参阅《*AWS Secrets Manager 用户指南》*中的 S [AWS ecrets 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. 选择**存储新密钥**。

1. 对于**选择密钥类型**，选择**其他密钥类型**。

1. 以 **Key (键)** 和 **Value (值)** 对的形式指定自定义密钥的详细信息。例如，您可以指定键 `UserName`，然后提供适当的用户名作为其值。添加名为 `Password` 的第二个键并将密码文本作为其值。您还可以为数据库名称、服务器地址、TCP 端口等添加条目。您可以添加所需数量的对以存储所需的信息。

   或者，您也可以选择 **Plaintext (明文)** 选项卡，并以所需的任何方式输入密钥值。

1. 选择要用于 AWS KMS 加密密钥中受保护文本的加密密钥。如果您没有选择一个，则 Secrets Manager 会检查账户是否存在原定设置密钥并在存在时使用它。如果不存在原定设置密钥，则 Secrets Manager 将自动为您创建一个。您也可以选择**添加新密钥**以创建专用于该密钥的自定义 KMS 键。要创建您自己的 KMS 键，您必须具有在您的账户中创建 KMS 键的权限。

1. 选择**下一步**。

1. 对于**密钥名称**，请键入可选的路径和名称，如 **production/MyAwesomeAppSecret** 或 **development/TestSecret**，然后选择**下一步**。您可以选择添加描述以帮助记住该密钥以后的用途。

   密钥名称应仅包含 ASCII 字母、数字或以下任意字符：/\$1\$1=.@-

1. (可选) 此时，您可以为密钥配置轮换。对于此程序，请将其保留为**禁用自动轮换**，然后选择**下一步**。

   有关如何配置新密钥或现有密钥的轮换的信息，请参阅[轮换您的 AWS Secrets Manager 密钥](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html)。

1. 检查您的设置，然后选择 **Store secret** (存储密钥) 以将输入的所有内容作为新密钥保存在 Secrets Manager 中。