

# チュートリアル: タグを使用して、停止する DB インスタンスを指定する
<a name="Tagging.RDS.Autostop"></a>

このチュートリアルでは、開発環境またはテスト環境に複数の DB インスタンスがあることを前提としています。これらの DB インスタンスを数日間保持する必要があります。一部の DB インスタンスは夜間にテストを実行し、その他は夜間に停止し、翌日に再び開始します。

次のチュートリアルでは、夜間に停止するのに適した DB インスタンスにタグを割り当てる方法を示しています。このチュートリアルは、スクリプトがそのタグを持つ DB インスタンスを検出して、タグの付いた DB インスタンスを停止する方法を示しています。この例では、キーと値のペアでの値の部分は重要ではありません。`stoppable` タグが存在するということは、DB インスタンスにこのユーザー定義プロパティがあることを示します。

次のチュートリアルでは、タグ付け用のコマンドと API が ARN と機能し、RDS は同じ短縮名を持つ可能性のある AWS リージョン、AWS アカウント、およびさまざまなタイプのリソース間でシームレスに動作できます。DB インスタンスで動作する CLI コマンドで、DB インスタンス ID の代わりに ARN を指定できます。

**停止する DB インスタンスを指定する**

1. 停止可能として指定する DB インスタンスの ARN を決めます。

   次の例では、*dev-test-db-instance* を独自の DB インスタンスの名前に置き換えます。ARN パラメータを使用する後続のコマンドでは、独自の DB インスタンスの ARN を置き換えます。ARN には、お客様自身の AWS アカウント ID と、DB インスタンスが配置されている 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. この DB インスタンスに `stoppable` タグを追加します。

   このタグの名前を選択します。この例では、タグが存在するか存在しないかの属性として扱うため、`Value=` パラメータの `--tags` 部分を省略します。このアプローチにより、すべての関連情報を名前にエンコードする命名規則を考案する必要がなくなります。このような規則では、DB インスタンス名または他のリソースの名前に情報をエンコードすることができます。

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

1. タグが DB インスタンスに存在することを確認します。

   これらのコマンドは、JSON 形式およびタブ区切りのプレーンテキストで DB インスタンスのタグ情報を取得します。

   ```
   $ 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` として指定されているすべての DB インスタンスを停止します。

   次の例では、すべての DB インスタンスを一覧表示するテキストファイルを作成します。シェルコマンドはリストをループし、各 DB インスタンスに関連属性がタグ付けされているかどうかを確認し、各 DB インスタンスに対してコマンド `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",
           ...
   ```

このようなスクリプトを 1 日の終わりに実行して、必要ではない DB インスタンスが停止されていることを確認できます。`cron` などのユーティリティを使用してジョブのスケジュールを組み、毎晩そのような確認を実行することもできます。例えば、DB インスタンスが誤って実行されたままになった場合に利用できます。ここでは、確認する DB インスタンスのリストを準備するコマンドを微調整できます。

次のコマンドは、DB インスタンスのリストを生成しますが、`available` 状態の場合にのみ生成します。スクリプトでは、`stopped` または `stopping` などのステータス値が異なるため、すでに停止している DB インスタンスを無視できます。

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

**ヒント**  
タグを割り当てて、それらのタグを持つ DB インスタンスを検索して、他の方法でコストを削減することができます。例えば、開発とテストに使用される DB インスタンスのシナリオを考えてみましょう。この場合、一日の終わりにいくつかの DB インスタンスを削除するように指定できます。または、使用率が低いと予想される時間帯に DB インスタンスを小さな DB インスタンスクラスに変更するように指定することもできます。