

# 教程：使用标签指定要停止的数据库实例
<a name="Tagging.RDS.Autostop"></a>

本教程假设您在开发或测试环境中有多个数据库实例。您需要将这些数据库数据库实例保留几天。一些数据库实例在夜间运行测试，而其他数据库实例可在夜间停止运行，并在第二天重新开始运行。

以下教程说明如何为适合在夜间停止运行的数据库实例分配标签。本教程说明脚本如何检测哪些数据库实例具有该标签及随后停止已标记的数据库实例。在此示例中，键值对的值部分无关紧要。存在`stoppable`标签表示数据库实例具有此用户定义的属性。

在以下教程中，用于标记的命令和 API 使用 ARN，这可让 RDS 跨 AWS 区域、AWS 账户以及不同类型的资源（这些资源可能具有相同的短名称）无缝工作。您可以在数据库实例上运行的 CLI 命令中指定 ARN 代替数据库实例 ID。

**指定要停止的数据库实例**

1. 确定您要指定为“可停止”的数据库实例的 ARN。

   在以下示例中，将自己的数据库实例名称替换为 *dev-test-db-instance*。在使用 ARN 参数的后续命令中，替换自己的数据库实例的 ARN。ARN 包含您自己的 AWS 账户 ID 和数据库实例所在的 AWS 区域的名称。

   ```
   $ aws rds describe-db-instances --db-instance-identifier dev-test-db-instance \
     --query "*[].{DBInstance:DBInstanceArn}" --output text
   arn:aws:rds:us-east-1:123456789102:db:dev-test-db-instance
   ```

1. 将标签 `stoppable` 添加至此数据库实例。

   由您选择此标签的名称。由于此示例将标签视为存在或不存在的属性，因此它忽略了 `Value=` 参数的 `--tags` 部分。这种方法意味着，您可以避免设计一种在名称中对所有相关信息进行编码的命名约定。在此类约定中，您可以在数据库实例名称或其他资源的名称中对信息进行编码。

   ```
   $ aws rds add-tags-to-resource \
     --resource-name arn:aws:rds:us-east-1:123456789102:db:dev-test-db-instance \
     --tags Key=stoppable
   ```

1. 确认数据库实例中存在标签。

   以下命令以 JSON 格式和以制表符分隔的纯文本检索数据库实例中的标签信息。

   ```
   $ aws rds list-tags-for-resource \
     --resource-name arn:aws:rds:us-east-1:123456789102:db:dev-test-db-instance 
   {
       "TagList": [
           {
               "Key": "stoppable",
               "Value": ""
   
           }
       ]
   }
   aws rds list-tags-for-resource \
     --resource-name arn:aws:rds:us-east-1:123456789102:db:dev-test-db-instance --output text
   TAGLIST stoppable
   ```

1. 停止所有被指定为 `stoppable` 的数据库实例。

   以下示例创建一个文本文件，其中列出了所有数据库实例。Shell 命令循环访问该列表，并检查每个数据库实例是否都标记有相关属性，并为每个数据库实例运行命令 `aws rds stop-db-instance`。

   ```
   $ aws rds describe-db-instances --query "*[].[DBInstanceArn]" --output text >/tmp/db_instance_arns.lst
   $ for arn in $(cat /tmp/db_instance_arns.lst)
   do
     match="$(aws rds list-tags-for-resource --resource-name $arn --output text | grep stoppable)"
     if [[ ! -z "$match" ]]
     then
         echo "DB instance $arn is tagged as stoppable. Stopping it now."
   # Note that you need to get the DB instance identifier from the ARN.
         dbid=$(echo $arn | sed -e 's/.*://')
         aws rds stop-db-instance --db-instance-identifier $dbid
     fi
   done
   
   DB instance arn:arn:aws:rds:us-east-1:123456789102:db:dev-test-db-instance is tagged as stoppable. Stopping it now.
   {
       "DBInstance": {
           "DBInstanceIdentifier": "dev-test-db-instance",
           "DBInstanceClass": "db.t3.medium",
           ...
   ```

您可以在每天结束时运行与上一个脚本类似的脚本，以确保停止非必要的数据库实例。还可以使用实用程序（例如 `cron`）安排任务，如每晚执行此类检查。例如，您可以这样做，以防某些数据库实例被误运行。在此，您可以对准备待检查数据库实例列表的命令进行微调。

以下命令生成数据库实例列表，但只生成处于`available`状态的数据库实例的列表。该脚本可以忽略已停止的数据库实例，因为它们将具有不同的状态值，如`stopped`或`stopping`。

```
$ aws rds describe-db-instances \
  --query '*[].{DBInstanceArn:DBInstanceArn,DBInstanceStatus:DBInstanceStatus}|[?DBInstanceStatus == `available`]|[].{DBInstanceArn:DBInstanceArn}' \
  --output text
arn:aws:rds:us-east-1:123456789102:db:db-instance-2447
arn:aws:rds:us-east-1:123456789102:db:db-instance-3395
arn:aws:rds:us-east-1:123456789102:db:dev-test-db-instance
arn:aws:rds:us-east-1:123456789102:db:pg2-db-instance
```

**提示**  
您可以将分配标签的过程与查找带这些标签的数据库实例的过程结合使用，以其他方式降低成本。我们以用于开发和测试的数据库实例为例。在这种情况下，您可以指定在每天结束时删除一些数据库实例。或者，您可以指定它们在预期使用率较低的时期，将其数据库实例更改为小型数据库实例类。