AWS CLIのコマンドで調べたことの備忘録

AWS CLIでDB系の操作をした時に、やりたいことを実現するためにいろいろと調べたことのまとめを、99%自分用メモとして、1%は社内向け情報共有として本記事を書きました。


#### DBのパラメータグループの中から特定のパラメータの値を変更する例
``` bash
aws rds modify-db-cluster-parameter-group \
--db-cluster-parameter-group-name <myParameterGroupName> \
--parameters "ParameterName=binlog_format,ParameterValue=MIXED,ApplyMethod=pending-reboot" \
             "ParameterName=read_only,ParameterValue=1,ApplyMethod=immediate" \
             "ParameterName=sql_mode,ParameterValue='STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION',ApplyMethod=immediate" \
--no-cli-pager
```
**memo**
- 変更したいパラメータの`Apply type`の値によって`ApplyMethod`に指定できる値が違う
	- `Apply type`が`Dynamic`のものは`ApplyMethod=immediate`が使える
	- `Apply type`が`Static`のものは`ApplyMethod=pending-reboot`じゃないとダメ  
	→DB再起動しないと値が反映されない
- String型のパラメータの値に`,`(カンマ)を含めたい場合は`'`(シングルクォーテーション)で囲む


#### DBのパラメータグループの中から特定のパラメータ名と値を取得する例
``` bash
aws rds describe-db-cluster-parameters \
--db-cluster-parameter-group-name <myParameterGroupName> \
--query 'Parameters[?ParameterName == `binlog_format` || 
                     ParameterName == `read_only` || 
                     ParameterName == `sql_mode`].{Name:ParameterName,Value:ParameterValue}' \
--output table \
--no-cli-pager
```

**出力結果**
```
-------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                             DescribeDBClusterParameters                                                             |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
|     Name      |                                                                Value                                                                |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
|  binlog_format|  MIXED                                                                                                                              |
|  read_only    |  1                                                                                                                                  |
|  sql_mode     |  STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION   |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------+
```


**memo**
- `--query`オプションでoptput情報の絞り込みをした。
	- 参考：[AWS CLIの出力をフィルタリングする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html#cli-usage-filter-client-side)
- `--output table`で表形式で出力される。指定しないとjson形式。

フィルタリングについての覚書
- `describe-db-cluster-parameters`のoptput情報の親が`Parameters[]`
- ```[?ParameterName == `binlog_format` ```部分は絞り込み条件
    - 文字列は``` ` ```(バッククォート)で」囲む。
    - 今回は`ParameterName`を3つ抽出したいので`||`で結合している。
    - 1つの場合は```[?ParameterName == `binlog_format`]```となる。
- `Parameters[]`の中からParameterNameとParameterValueのみ抽出
	- `{}`内は抽出する項目にラベルを付与するための記述
		- これをやると表形式の場合は列名のように出力される。  
		  json形式の場合は`ラベル:値`というように出力される。
    - 抽出する項目にラベルを付与しない場合は、`{...}` 部分は `[ParameterName,ParameterValue]`のように記載する。この場合は値のみ出力される。


#### DBインスタンスの情報を取得する例
``` bash
aws rds describe-db-instances \
--query 'DBInstances[?contains(DBInstanceIdentifier,`dev`)].{
    DBClusterIdentifier:DBClusterIdentifier
,   DBInstanceIdentifier:DBInstanceIdentifier
,   DBParameterGroupName:DBParameterGroups[0].DBParameterGroupName
,   EngineVersion:EngineVersion
,   Status:DBInstanceStatus
}' \
--output table \
--no-cli-pager
```

**出力結果**
```
-----------------------------------------------------------------------------------------------------------------------
|                                                 DescribeDBInstances                                                 |
+---------------------+----------------------------+------------------------+---------------------------+-------------+
| DBClusterIdentifier |   DBInstanceIdentifier     | DBParameterGroupName   |       EngineVersion       |   Status    |
+---------------------+----------------------------+------------------------+---------------------------+-------------+
|  testrdbdev57       |  testrdbdev57-instance-1   |  testrdbdev-aurora57   |  5.7.mysql_aurora.2.11.2  |  available  |
|  testrdbdev57       |  testrdbdev57-instance-2   |  testrdbdev-aurora57   |  5.7.mysql_aurora.2.11.2  |  available  |
|  testrdbdevsb57     |  testrdbdevsb57-instance-1 |  testrdbdevsb-aurora57 |  5.7.mysql_aurora.2.11.1  |  available  |
|  testrdbdevsb57     |  testrdbdevsb57-instance-2 |  testrdbdevsb-aurora57 |  5.7.mysql_aurora.2.11.1  |  available  |
+---------------------+----------------------------+------------------------+---------------------------+-------------+
```

フィルタリングについての覚書
- ```?contains(DBInstanceIdentifier,`dev`)```で`DBInstanceIdentifier`に指定の文字列を含むものだけ抽出している。
	- 参考：[Built-in Functions - contains](https://jmespath.org/specification.html#contains)
- `DBParameterGroups`は配列型なので`[0]`とすることで1要素のみ抽出している。  
  → パラメータグループを1つしか割当していないと分かっていたので決め打ち


#### DBクラスターからライターインスタンスの情報を取得する例
``` bash
aws rds describe-db-clusters \
--query 'DBClusters[?contains(DBClusterIdentifier,`green`)].{
    DBClusterIdentifier:DBClusterIdentifier
,   InstanceIdentifier:DBClusterMembers[?IsClusterWriter==`true`]|[0].DBInstanceIdentifier
,   WriterInstance:DBClusterMembers[?IsClusterWriter==`true`]|[0].IsClusterWriter
}' \
--output table \
--no-cli-pager
```

**出力結果**
```
----------------------------------------------------------------------------
|                            DescribeDBClusters                            |
+---------------------+---------------------------------+------------------+
| DBClusterIdentifier |       InstanceIdentifier        | WriterInstance   |
+---------------------+---------------------------------+------------------+
| shard1-green-xxxxxx |  shard1-instance-2-green-xxxxxx |  True            |
| shard2-green-xxxxxx |  shard2-instance-1-green-xxxxxx |  True            |
| shard3-green-xxxxxx |  shard3-instance-1-green-xxxxxx |  True            |
| shard4-green-xxxxxx |  shard4-instance-1-green-xxxxxx |  True            |
| shard5-green-xxxxxx |  shard5-instance-1-green-xxxxxx |  True            |
| shard6-green-xxxxxx |  shard6-instance-2-green-xxxxxx |  True            |
+---------------------+---------------------------------+------------------+
```
**memo**
- Blue/Greenデプロイを作成した時に、Green環境のライターインスタンスのIdentifierが取得したかった。

フィルタリングについての覚書
- ```?IsClusterWriter==`true` ```で絞り込みすることによってライターインスタンスのみ取得できた。


#### (A or B or C) and D という条件で絞り込みする例
```
aws rds describe-db-instances \
--query 'DBInstances[?contains(DBInstanceIdentifier,`A`) || 
                      contains(DBInstanceIdentifier,`B`) || 
                      contains(DBInstanceIdentifier,`C`)] | 
                      [?contains(DBInstanceIdentifier,`D`)].{
    DBInstanceIdentifier:DBInstanceIdentifier
,   EngineVersion:EngineVersion
,   Status:DBInstanceStatus
,   ParameterGroupName:DBParameterGroups[0].DBParameterGroupName
,   ParameterStatus:DBParameterGroups[0].ParameterApplyStatus
}' \
--output table \
--no-cli-pager
```

### 参考リンク
- [AWS CLI Command Reference -> rds](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/index.html#rds)
- [AWS CLI フィルター出力](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-filter.html)
- [JMESPath Specification](https://jmespath.org/specification.html)