環境:
Mac
aws-cli 1.7.0
jq 1.4
RDS MySQL(5.6.22)
RDS MySQL の文字コードとタイムゾーンの設定を行ったのでその手順メモ。
操作はすべて aws-cli のコマンドラインで行う。
RDS MySQL の文字コードおよび照合順序はデフォルトの状態でインスタンスを立ち上げると以下のようになる。
mysql> show global variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
+--------------------------+--------+
7 rows in set (0.01 sec)
mysql> show global variables like 'collation%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
登録するデータとして絵文字が含まれるので utf8mb4 を使えるように設定を行う。
DB パラメーターグループ作成
RDS の設定値を変更するにはDB パラメーターグループを通して行う。
まずは、mysql5.6 用の DB パラメーターグループの雛形を元にして新規の DB パラメーターグループをrds create-db-parameter-group
コマンドで作成する。
- db-parameter-group-name は
mydbparamgroup
とする。
$ aws rds create-db-parameter-group --db-parameter-group-name mydbparamgroup --db-parameter-group-family mysql5.6 --description "for myinstance"
{
"DBParameterGroup": {
"DBParameterGroupName": "mydbparamgroup",
"DBParameterGroupFamily": "mysql5.6",
"Description": "for myinstance"
}
}
DB パラメーターグループ更新
続いて作成した DB パラメーターグループのキャラクタセット関連のパラメータの初期値をrds describe-db-parameters
コマンドで確認する。
ParameterValue はすべて未設定となっている。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { Description,DataType,Source,IsModifiable,ParameterName,ParameterValue,ApplyType }'
{
"Description": "Don't ignore character set information sent by the client.",
"DataType": "boolean",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character-set-client-handshake",
"ParameterValue": null,
"ApplyType": "static"
}
{
"Description": "The character set for statements that arrive from the client.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character_set_client",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The character set used for literals that do not have a character set introducer and for number-to-string conversion.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character_set_connection",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The character set used by the default database.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character_set_database",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The file system character set.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character_set_filesystem",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The character set used for returning query results to the client.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character_set_results",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The server's default character set.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character_set_server",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The collation of the connection character set.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "collation_connection",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "The server's default collation.",
"DataType": "string",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "collation_server",
"ParameterValue": null,
"ApplyType": "dynamic"
}
{
"Description": "Ignore character set information sent by the client.",
"DataType": "boolean",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "skip-character-set-client-handshake",
"ParameterValue": null,
"ApplyType": "static"
}
DB パラメーターグループのキャラクタセット関連のパラメータをrds modify-db-parameter-group
コマンドで更新する。
character_set_filesystem
、character_set_system
以外のキャラクタセットはutf8mb4
を設定する。
- collation は
utf8mb4_general_ci
にする。
skip-character-set-client-handshake
は TRUE にするとクライアント側が要求してきたキャラクタセットは無視して強制的にサーバ側のcharacter-set-server
で指定したキャラクタセットで応答するようになるらしい。
今回はアプリのクライアント側でキャラクタセットを指定するのでこの設定はオフにする。
- ApplyMethod は immediate は即時反映で、pending-reboot は再起動後の反映となる。
Apply Type が dynamic のものは immediate で、static のものは pending-reboot となるようだ。
$ aws rds modify-db-parameter-group --db-parameter-group-name mydbparamgroup --parameters \
ParameterName=character_set_client,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_connection,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_database,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_results,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=character_set_server,ParameterValue=utf8mb4,ApplyMethod=immediate \
ParameterName=collation_connection,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate \
ParameterName=collation_server,ParameterValue=utf8mb4_general_ci,ApplyMethod=immediate \
ParameterName=skip-character-set-client-handshake,ParameterValue=0,ApplyMethod=pending-reboot
{
"DBParameterGroupName": "mydbparamgroup"
}
DB パラメータグループに反映されたかrds describe-db-parameters
コマンドで確認してみる。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '[ .Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { key: .ParameterName, value: .ParameterValue } ] | from_entries'
{
"character-set-client-handshake": null,
"character_set_client": "utf8mb4",
"character_set_connection": "utf8mb4",
"character_set_database": "utf8mb4",
"character_set_filesystem": null,
"character_set_results": "utf8mb4",
"character_set_server": "utf8mb4",
"collation_connection": "utf8mb4_general_ci",
"collation_server": "utf8mb4_general_ci",
"skip-character-set-client-handshake": "0"
}
create-db-instance
コマンドで RDS MySQL インスタンスを作成する。
- 上記で作成した DB パラメータグループをオプションで指定する。
- db-instance-identifier は
myinstance
とする。
- RDS MySQL に外部から接続したいので publicly-accessible を追加。
$ aws rds create-db-instance \
--db-instance-identifier myinstance \
--allocated-storage 5 \
--db-instance-class db.t2.micro \
--engine MySQL \
--engine-version 5.6.22 \
--master-username bloguser \
--master-user-password bloguser1234567890 \
--db-name blogdb \
--db-parameter-group-name mydbparamgroup \
--storage-type standard \
--no-multi-az \
--region ap-northeast-1 \
--publicly-accessible \
--no-auto-minor-version-upgrade
コマンドを実行すると RDS インスタンスの作成がはじまる。しばらく時間がかかるので待つ。
- VPC 指定をしていないので RDS インスタンスは
default VPC
内に作成される。
- セキュリティグループは
default VPC security group
が設定される。
- DBサブネットグループは
default
が設定される。
インスタンスの作成が完了したら、rds describe-db-instances
コマンドでエンドポイントを確認する。
$ aws rds describe-db-instances --db-instance-identifier myinstance
...
"Endpoint": {
"Port": 3306,
"Address": "myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com"
},
...
PublicIp、PublicDnsName はec2 describe-network-interfaces
コマンドで確認できる。
GUI 管理コンソールでは、EC2 Dashboard -> Network interfaces から確認できる。
$ aws ec2 describe-network-interfaces --filters "Name=description,Values=RDSNetworkInterface"
...
"Description": "RDSNetworkInterface",
"Association": {
"PublicIp": "54.92.100.249",
"PublicDnsName": "ec2-54-92-100-249.ap-northeast-1.compute.amazonaws.com",
"IpOwnerId": "amazon-rds"
},
...
デフォルトセキュリティグループに Inbound ルール追加
RDS MySQL に外部から接続するためにdefault VPC security group
に Inbound のルールを追加する。
セキュリティグループ ID を確認。
$ aws rds describe-db-instances --db-instance-identifier myinstance
...
"VpcSecurityGroups": [
{
"Status": "active",
"VpcSecurityGroupId": "sg-xxxxxxxx"
}
],
...
ec2 authorize-security-group-ingress
コマンドで追加する。
$ aws ec2 authorize-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3306 --cidr 0.0.0.0/0
上で調べた Endpoint または PublicIp、PublicDnsName のいずれかをホストに指定して MySQL に接続する。
$ mysql -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p -D blogdb
MySQL に接続できたら、キャラクタセットの設定を確認する。
mysql> show create database blogdb\G
*************************** 1. row ***************************
Database: blogdb
Create Database: CREATE DATABASE `blogdb` /*!40100 DEFAULT CHARACTER SET utf8mb4 */
1 row in set (0.01 sec)
mysql> show variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
+--------------------------+---------+
mysql> show global variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
+--------------------------+---------+
mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
mysql> show global variables like 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
global variables は指定通り utf8mb4 になっているが、session の variables は utf8 になっている箇所がある・・・
MySQL クライアント側のキャラクタセットがどうなっているか調べてみる。
今、手元の Mac にインストールした MySQL(Server version: 5.6.19 Homebrew)から接続しているので、そのローカルの MySQL にログインする。
$ mysql -uroot
mysql> show variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+--------+
mysql> show global variables like 'character\_set\_%';
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+--------+
mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
mysql> show global variables like 'collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
character_set_client
など、すべて utf8 になっていたのでこれが原因だろう。クライアント側でキャラクタセットを指定して再度、RDS MySQL に接続してみる。
コマンドラインのオプションで--default-character-set
を指定する。
$ mysql --default-character-set=utf8mb4 -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p
再度、キャラクタセットの設定を確認する。
mysql> show variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
+--------------------------+---------+
mysql> show global variables like 'character\_set\_%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
+--------------------------+---------+
mysql> show variables like 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
mysql> show global variables like 'collation%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
今度はセッションの設定も utf8mb4 となった。
一応、skip-character-set-client-handshake
を TRUE の場合もやってみた。
DB パラメータグループを更新する。
$ aws rds modify-db-parameter-group --db-parameter-group-name mydbparamgroup --parameters \
ParameterName=skip-character-set-client-handshake,ParameterValue=1,ApplyMethod=pending-reboot
変更を反映させるためにrds reboot-db-instance
コマンドで RDS インスタンスの再起動させる。
$ aws rds reboot-db-instance --db-instance-identifier myinstance
同じように RDS MySQL に接続してキャラクタセットを確認したところ、クライアント側で要求したキャラクタセットは無視されて、すべて utf8mb4 となることが確認できた。
※追記:タイムゾーンの設定が可能になり以下で設定できる。init_connectを使ったワークアラウンドは不要になった
$ aws rds modify-db-parameter-group --db-parameter-group-name mydbparamgroup --parameters \
ParameterName=time_zone,ParameterValue=Asia/Tokyo,ApplyMethod=immediate
Amazon Web Services ブログ: Amazon RDS (MySQL, MariaDB)がlocal time zoneをサポートしました
http://aws.typepad.com/aws_japan/2015/12/amazon-rds-local-timezone-support.html
--
以下、タイムゾーンの変更ができなかった頃のワークアラウンド
RDS MySQL のタイムゾーンを JST にしたいが、現時点ではタイムゾーンの変更はできず、デフォルトの UTC となっている。
調べてみるとワークアラウンドとして、init_connect
変数を使って接続毎にタイムゾーンを設定する方法があるようなので、それをやってみる。
以下を参考にさせてもらった。
AWS - RDS(MySQL)でJSTを使う たった1つの冴えたやり方 - Qiita
http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4
MySQL,RDS - RDS(MySQLエンジンにてタイムゾーンを変更する方法を整理) - Qiita
http://qiita.com/mitzi2funk/items/4726986e8288b1599786
» AWS RDSのタイムゾーンについて Tech Fun.cc
http://techfun.cc/aws/aws-rds-timezone.html
init_connect
で単純にSET SESSION time_zone = 'Asia/Tokyo';
とやるのでは問題が発生するとのこと。
RDS 管理用のrdsadmin
というユーザがいて、このユーザが何かする時に Timezone が UTC 以外だと不具合が発生してしまうみたい。
以下のようにrdsadmin
ユーザ以外の接続時のみ Timezone を変更するようにすればよい。
SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;
デフォルトの設定を確認する
RDS MySQL にログインしてタイムゾーンを確認する。
# ローカル Mac の現在時間
$ date
2015年 2月17日 火曜日 01時27分19秒 JST
# RDS MySQL に接続
$ mysql -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p
# 現在時間、タイムゾーン確認
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2015-02-16 16:27:51 |
+---------------------+
mysql> show variables like '%time_zone';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| system_time_zone | UTC |
| time_zone | UTC |
+------------------+-------+
mysql> show global variables like '%time_zone';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| system_time_zone | UTC |
| time_zone | UTC |
+------------------+-------+
UTC となっている。ローカルは JST なので当然ながら時間はズレている。
init_connect
変数を設定
DB パラメータグループのinit_connect
変数を更新する。
SET 文を aws-cli の直接コマンドに埋め込むのではなく、ファイルに書いてそれをアップロードする方法で行う。
まずはテンプレートとなるファイルを--generate-cli-skeleton
オプションで出力させる。
$ aws rds modify-db-parameter-group --generate-cli-skeleton > init_connect.json
出力されたファイルを以下のように編集する。
{
"DBParameterGroupName": "mydbparamgroup",
"Parameters": [
{
"ParameterName": "init_connect",
"ParameterValue": "SET SESSION time_zone = CASE WHEN POSITION('rds' IN CURRENT_USER()) = 1 THEN 'UTC' ELSE 'Asia/Tokyo' END;",
"Description": "",
"Source": "",
"ApplyType": "",
"DataType": "",
"AllowedValues": "",
"IsModifiable": true,
"MinimumEngineVersion": "",
"ApplyMethod": "immediate"
}
]
}
そしてDB パラメータグループを更新する。--cli-input-json
オプションでファイルを指定。
$ aws rds modify-db-parameter-group --cli-input-json file://init_connect.json
# 終わったら不要なので削除
$ rm init_connect.json
設定が反映されるまで待つ。
反映されたら再度 RDS MySQL に接続して確認してみる。
# ローカル Mac の現在時間
$ date
2015年 2月17日 火曜日 01時38分03秒 JST
# RDS MySQL 接続
$ mysql -h myinstance.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u bloguser -p
# 現在時間、タイムゾーン確認
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2015-02-17 01:38:18 |
+---------------------+
mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name | Value |
+------------------+------------+
| system_time_zone | UTC |
| time_zone | Asia/Tokyo |
+------------------+------------+
mysql> show global variables like '%time_zone';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| system_time_zone | UTC |
| time_zone | UTC |
+------------------+-------+
このセッションのtime_zone
がAsia/Tokyo
になっているのが確認できた。
後片付け
default VPC security group
に追加した Inbound ルールをec2 revoke-security-group-ingress
コマンドで取り消す。
$ aws ec2 revoke-security-group-ingress --group-id sg-xxxxxxxx --protocol tcp --port 3306 --cidr 0.0.0.0/0
RDS インスタンスmyinstance
をrds delete-db-instance
コマンドで削除する(データも消えるので注意!)。
# スナップショットは作らず削除
$ aws rds delete-db-instance --db-instance-identifier myinstance --skip-final-snapshot
# スナップショットを作ってから削除
$ aws rds delete-db-instance --db-instance-identifier myinstance \
--no-skip-final-snapshot \
--final-db-snapshot-identifier myinstance-final-snapshot
インスタンス削除が完了するまで待つ。
DB パラメーターグループmydbparamgroup
をrds delete-db-parameter-group
コマンドで削除する。
$ aws rds delete-db-parameter-group --db-parameter-group-name mydbparamgroup
以上。
補足
DB パラメータグループの JSON データから jq コマンドで目的のデータを抽出するためにいろいろ試行錯誤しながら試した。
記録しておかないと次に再現できないのでメモしておく。
元 JSON データ
{
"Parameters": [
{
"Description": "Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded",
"DataType": "boolean",
"AllowedValues": "0,1",
"Source": "engine-default",
"IsModifiable": false,
"ParameterName": "allow-suspicious-udfs",
"ApplyType": "static"
},
{
"Description": "The MySQL installation base directory.",
"DataType": "string",
"IsModifiable": false,
"Source": "system",
"ParameterValue": "/rdsdbbin/mysql",
"ParameterName": "basedir",
"ApplyType": "static"
},
...
]
}
上記の元データから jq コマンドを使って、あるパラメータに特定の文字列を含むものだけを抽出して出力してみる。
jq コマンドはjq '.'
、jq '.Parameters[]'
のようにシングルクォートで囲ったフィルタ式を渡すことで実行する。
例1
ParameterName に"character"を含むものを抽出する。
.Parameters[]
で Parameters の配列の全ての要素を取り出して出力する。.Parameters
とは違う。
contains()
で()内の入力値に部分一致するかどうかの真偽値を返す。
select()
で ()内の条件が真になれば、その要素を出力する、偽であれば何も返さない。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(.ParameterName | contains("character"))'
下は上と同じように動作する、別の書き方。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(contains({ParameterName: "character"}))'
出力結果:
{
"Description": "Don't ignore character set information sent by the client.",
"DataType": "boolean",
"AllowedValues": "0,1",
"Source": "engine-default",
"IsModifiable": true,
"ParameterName": "character-set-client-handshake",
"ApplyType": "static"
}
{
"Description": "The character set for statements that arrive from the client.",
"DataType": "string",
"IsModifiable": true,
"AllowedValues": "big5,dec8,cp850,hp8,koi8r,latin1,latin2,swe7,ascii,ujis,sjis,hebrew,tis620,euckr,koi8u,gb2312,greek,cp1250,gbk,latin5,armscii8,utf8,cp866,keybcs2,macce,macroman,cp852,latin7,utf8mb4,cp1251,cp1256,cp1257,binary,geostd8,cp932,eucjpms",
"Source": "user",
"ParameterValue": "utf8mb4",
"ParameterName": "character_set_client",
"ApplyType": "dynamic"
}
...
例2
{}
を利用することで、JSON の内容を組み替えたオブジェクトを生成して出力してる。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(.ParameterName | contains("character")) | { desc: .Description, name: .ParameterName, value: .ParameterValue }'
出力結果:
{
"desc": "Don't ignore character set information sent by the client.",
"name": "character-set-client-handshake",
"value": null
}
{
"desc": "The character set for statements that arrive from the client.",
"name": "character_set_client",
"value": "utf8mb4"
}
...
例3
- "character"を含むものを抽出
- ParameterName, ParameterValue を key, value という名前のプロパティに変更してオブジェクトを作成
[]
で囲んで配列を作成
from_entries
で key-value のペアからオブジェクトへ変換
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '[ .Parameters[] | select(.ParameterName | contains("character")) | { key: .ParameterName, value: .ParameterValue} ] | from_entries'
出力結果:
{
"character-set-client-handshake": null,
"character_set_client": "utf8mb4",
"character_set_connection": "utf8mb4",
"character_set_database": "utf8mb4",
"character_set_filesystem": null,
"character_set_results": "utf8mb4",
"character_set_server": "utf8mb4",
"skip-character-set-client-handshake": "0"
}
例4
"character"または、"collation"を含むものを抽出。or
を使う。
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(.ParameterName | contains("character") or contains("collation"))'
# 上と同じ
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(contains({ParameterName: "character"}) or contains({ParameterName: "collation"}))'
例5
今までものをすべて組み合わせたもの。
desc, name, value のみ
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '.Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { desc: .Description, name: .ParameterName, value: .ParameterValue }'
{
"desc": "Don't ignore character set information sent by the client.",
"name": "character-set-client-handshake",
"value": null
}
{
"desc": "The character set for statements that arrive from the client.",
"name": "character_set_client",
"value": "utf8mb4"
}
...
key-value 形式
$ aws rds describe-db-parameters --db-parameter-group-name mydbparamgroup \
| jq '[ .Parameters[] | select(.ParameterName | contains("character") or contains("collation")) | { key: .ParameterName, value: .ParameterValue } ] | from_entries'
{
"character-set-client-handshake": null,
"character_set_client": "utf8mb4",
"character_set_connection": "utf8mb4",
"character_set_database": "utf8mb4",
"character_set_filesystem": null,
"character_set_results": "utf8mb4",
"character_set_server": "utf8mb4",
"collation_connection": "utf8mb4_general_ci",
"collation_server": "utf8mb4_general_ci",
"skip-character-set-client-handshake": "0"
}
参考:
jq Manual
http://stedolan.github.io/jq/manual/
軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました | Developers.IO
http://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/
ゼロから始めるjqチュートリアル - JSONを解析/自在に出力する
http://blog.serverfrog.jp/jq-tutorial/
jq コマンドを使う日常のご紹介 - Qiita
http://qiita.com/takeshinoda@github/items/2dec7a72930ec1f658af