見出し画像

RDSバージョンごとのデフォルトパラメタグループと差分の取得方法

はじめに

こんにちは、SHIFTでインフラコンサルタントをしている大竹です。

AWSを利用してシステムを構築する場合において、データベースサービスであるRDSを利用することは多いと思います。RDSのDBエンジンは商用ないしOSSのDBプロダクトを利用しているので、しばしば利用バージョンのEOS/EOLが発生します。例えば2023年の初頭には、RDS for PostgreSQLのバージョン10のサポートが終わりを迎え、利用できなくなります。

RDSで設定するパラメタを事前定義するパラメタグループ。アップグレードの際にどういうパラメタが増えるのか、あるいは廃止されるのか。増える場合、どういう値を取るのか。この辺の情報を知りたかったのですが公式には資料がありません。

AWSコンソールで作成してみて比較する、という手もありそうですが、なかなか面倒です。

こんなときに考えるのが、AWS CLIで情報を取得できないかな?です。結果としてaws rdsコマンドでJSON情報を取得し、JSONをCSV変換することで一覧化できたので、方法とパラメタの差分例について紹介します。

この方法はPostgreSQLのバージョン10だけでなく、汎用的に利用できます。

作業の流れ

パラメタの差分を取得するまでの流れは以下のようになります。

  1. AWS CLIでRDSのDBエンジンファミリーの一覧を取得する

  2. AWS CLIでRDSデフォルトパラメタグループの情報をJSONで取得する

  3. jqコマンドでJSONをCSVに変換する

  4. バージョンごとのCSVを作成して比較する

jqをインストールする

まずjqコマンドを入れておきましょう。jqコマンドは、JSONデータを整形して、人間が見て扱いやすくしてくれるツールです。

Windowsでjqコマンドをインストールするには、パッケージマネージャーであるChocolateyを利用するのが便利です。PowerShellを管理者モードで起動し、下記を実行するとインストールが始まります。

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

しばらくしてインストールが完了したら、Chocolateyでjqをインストールします。

chocolatey install jq

これでインストール完了です。

AWS CLIでRDSのデフォルトパラメタグループ情報を取得する

AWSを扱っている方であれば、AWS CLIはインストール済みのことがほとんどだと思うので、AWS CLIのインストールと設定方法は割愛します。インストールが必要な場合は、下記のリンクを参考にしてインストールと「次のステップ」を実施して下さい。

RDSのパラメタにはDBパラメタとクラスターパラメタがあり、デフォルトパラメタグループの取得コマンドが異なります。

DBパラメタはaws rds describe-db-parametersコマンド、クラスターパラメタはaws rds describe-db-cluster-parametersコマンドを使用します。これらのコマンドの--db-parameter-group-nameオプションで、DBエンジンのファミリーを指定します。

RDSで利用できるDBエンジンのファミリーは、aws rds describe-db-engine-versionsコマンドで取得できます。今回は欲しい情報だけを得るために、--queryオプションを指定します。

aws rds describe-db-engine-versions --query "DBEngineVersions[].DBParameterGroupFamily" --output yaml

- aurora-mysql5.7
- aurora-mysql5.7
- aurora-mysql5.7
(略)

パッチバージョンの分も含まれるため重複している行がありますが、重複を取り除いてPostgreSQLに絞ると、以下の結果になります。ちなみに私は、テキストエディタの重複除去機能を用いて一意なデータを抽出しました。

- postgres10
- postgres11
- postgres12
- postgres13
- postgres14
- aurora-postgresql10
- aurora-postgresql11
- aurora-postgresql12
- aurora-postgresql13
- aurora-postgresql14

RDSかAuroraかによって指定するエンジンが異なるので、注意しましょう。

さて、DBエンジンのファミリーを取得できたので、先のコマンドにこれを指定し、"default."を付与してdescribeコマンドを実行します。例としてmysql5.7を取得してみましょう。

aws rds describe-db-parameters --db-parameter-group-name default.mysql5.7

{
    "Parameters": [
        {
            "ParameterName": "allow-suspicious-udfs",
            "Description": "Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded",
            "Source": "engine-default",
            "ApplyType": "static",
            "DataType": "boolean",
(略)

結果がJSON形式で、大量のデータとして返ってきます。一応これでも頑張れば知りたい情報は得られますが、さすがに大変です。そこでjqコマンドの出番です。

上記の結果をjqコマンドにパイプしてみましょう。-rオプションでJSONから取得したい項目名を列挙すると、その値のみを取得することができます。

aws rds describe-db-parameters --db-parameter-group-name default.mysql5.7  | jq -r '(.Parameters[] | [.ParameterName,.Description,.Source,.ApplyType,.DataType]) '
[
  "allow-suspicious-udfs",
  "Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded",
  "engine-default",
  "static",
  "boolean"
]
[
  "autocommit",
  "Sets the autocommit mode",
  "engine-default",
  "dynamic",
  "boolean"
]
[
  "auto_generate_certs",
(略)

さらにこれをCSVに変換します。-rオプションの中で結果を@csvにパイプしましょう。

aws rds describe-db-parameters --db-parameter-group-name default.mysql5.7  | jq -r '(.Parameters[] | [.ParameterName,.Description,.Source,.ApplyType,.DataType]) | @csv'

"allow-suspicious-udfs","Controls whether user-defined functions that have only an xxx symbol for the main function can be loaded","engine-default","static","boolean"
"autocommit","Sets the autocommit mode","engine-default","dynamic","boolean"
"auto_generate_certs","Controls whether the server autogenerates SSL key and certificate files in the data directory, if they do not already exist.","engine-default","static","boolean"
"auto_increment_increment","Intended for use with master-to-master replication, and can be used to control the operation of AUTO_INCREMENT columns","engine-default","dynamic","integer"
"auto_increment_offset","Determines the starting point for the AUTO_INCREMENT column value","engine-default","dynamic","integer"
"automatic_sp_privileges","When this variable has a value of 1 (the default), the server automatically grants the EXECUTE and ALTER ROUTINE privileges to the creator of a stored routine, if the user cannot already execute and alter or drop the routine.","engine-default","dynamic","boolean"
"avoid_temporal_upgrade","This variable controls whether ALTER TABLE implicitly upgrades temporal columns found to be in pre-5.6.4 format.","engine-default","dynamic","boolean"
(略)

CSVとして出力されましたね!あとはこれをファイルにリダイレクトすれば、CSVファイルとして扱うことができます。

上記はMySQLの例なので、RDS for PostgreSQL 10のデフォルトパラメタグループを得たい場合は、以下のようになります。この例では、取りうる値や既定値(ある場合)なども取得しています。

# DBパラメタグループの場合
aws rds describe-db-parameters --db-parameter-group-name default.aurora-postgresql10 | jq -r '(.Parameters[] | [.ParameterName,.ParameterValue,.Description,.Source,.ApplyType,.DataType,.AllowedValues,.IsModifiable,.ApplyMethod]) | @csv' > defaultDbParameterGroup.csv

# クラスターパラメタグループの場合
aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-postgresql10 | jq -r '(.Parameters[] | [.ParameterName,.ParameterValue,.Description,.Source,.ApplyType,.DataType,.AllowedValues,.IsModifiable,.ApplyMethod]) | @csv' > defaultClusterParameterGroup.csv

設計フェーズでパラメタシートとして一覧化して設計する場合にも便利だと思います。

差分の確認

それでは以上を踏まえて、RDS for PostgreSQLのバージョン間のデフォルトパラメタグループ差異を調べてみます。例としてバージョン10と14のクラスターパラメタグループを取得して、比較してみましょう。

まずはAWS CLIで情報を取得し、CSVに変換してファイルにリダイレクトします。

aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-postgresql10 | jq -r '(.Parameters[] | [.ParameterName])' > psql10params.csv
aws rds describe-db-cluster-parameters --db-cluster-parameter-group-name default.aurora-postgresql14 | jq -r '(.Parameters[] | [.ParameterName])' > psql14params.csv

あとは出力したCSVファイルで差分を比較すれば、パラメタの差異がわかります。

最後に実際の差分を紹介しておきます。Windowsのdiffコマンド結果のため少し見づらいですが、GUIベースの比較ツールを用いれば、より確認しやすいと思います。

diff (cat .\psql10params.csv) (cat .\psql14params.csv)

# バージョン10と14を比較し、"=>" が14のみにあるパラメタ、"<="が10のみにあるパラメタ
InputObject                                     SideIndicator
-----------                                     -------------
"ansi_constraint_trigger_ordering"              =>
"ansi_force_foreign_key_checks"                 =>
"ansi_qualified_update_set_target"              =>
"apg_enable_semijoin_push_down"                 =>
"autovacuum_vacuum_insert_scale_factor"         =>
"autovacuum_vacuum_insert_threshold"            =>
"babelfishpg_tds.default_server_name"           =>
"babelfishpg_tds.listen_addresses"              =>
"babelfishpg_tds.port"                          =>
"babelfishpg_tds.tds_debug_log_level"           =>
"babelfishpg_tds.tds_default_numeric_precision" =>
"babelfishpg_tds.tds_default_numeric_scale"     =>
"babelfishpg_tds.tds_default_packet_size"       =>
"babelfishpg_tds.tds_default_protocol_version"  =>
"babelfishpg_tds.tds_ssl_encrypt"               =>
"babelfishpg_tds.tds_ssl_max_protocol_version"  =>
"babelfishpg_tds.tds_ssl_min_protocol_version"  =>
"babelfishpg_tsql.default_locale"               =>
"babelfishpg_tsql.migration_mode"               =>
"babelfishpg_tsql.server_collation_name"        =>
"babelfishpg_tsql.version"                      =>
"backtrace_functions"                           =>
"client_connection_check_interval"              =>
"compute_query_id"                              =>
"cron.database_name"                            =>
"cron.log_run"                                  =>
"cron.log_statement"                            =>
"cron.max_running_jobs"                         =>
"cron.use_background_workers"                   =>
"default_toast_compression"                     =>
"enable_async_append"                           =>
"enable_incremental_sort"                       =>
"enable_memoize"                                =>
"enable_parallel_append"                        =>
"enable_parallel_hash"                          =>
"enable_partition_pruning"                      =>
"enable_partitionwise_aggregate"                =>
"enable_partitionwise_join"                     =>
"hash_mem_multiplier"                           =>
"idle_session_timeout"                          =>
"log_min_duration_sample"                       =>
"log_parameter_max_length"                      =>
"log_parameter_max_length_on_error"             =>
"log_statement_sample_rate"                     =>
"log_transaction_sample_rate"                   =>
"maintenance_io_concurrency"                    =>
"max_parallel_maintenance_workers"              =>
"max_slot_wal_keep_size"                        =>
"min_dynamic_shared_memory"                     =>
"parallel_leader_participation"                 =>
"pg_bigm.enable_recheck"                        =>
"pg_bigm.gin_key_limit"                         =>
"pg_bigm.last_update"                           =>
"pg_bigm.similarity_limit"                      =>
"pg_prewarm.autoprewarm"                        =>
"pg_prewarm.autoprewarm_interval"               =>
"pg_stat_statements.track_planning"             =>
"plan_cache_mode"                               =>
"rds.accepted_password_auth_method"             =>
"rds.babelfish_status"                          =>
"recovery_init_sync_method"                     =>
"remove_temp_files_after_crash"                 =>
"ssl_crl_dir"                                   =>
"ssl_max_protocol_version"                      =>
"ssl_min_protocol_version"                      =>
"track_wal_io_timing"                           =>
"vacuum_cost_page_dirty"                        =>
"vacuum_failsafe_age"                           =>
"vacuum_multixact_failsafe_age"                 =>
"wal_receiver_create_temp_slot"                 =>
"apg_plan_mgmt.pgss_min_calls"                  <=
"apg_plan_mgmt.pgss_min_mean_time_ms"           <=
"apg_plan_mgmt.pgss_min_stddev_time_ms"         <=
"apg_plan_mgmt.pgss_min_total_time_ms"          <=
"archive_command"                               <=
"archive_timeout"                               <=
"bgwriter_flush_after"                          <=
"checkpoint_flush_after"                        <=
"checkpoint_timeout"                            <=
"default_with_oids"                             <=
"max_standby_archive_delay"                     <=
"operator_precedence_warning"                   <=
"rds.custom_dns_resolution"                     <=
"replacement_sort_tuples"                       <=
"server_encoding"                               <=
"ssl_dh_params_file"                            <=
"syslog_facility"                               <=
"transaction_deferrable"                        <=
"transaction_read_only"                         <=
"unix_socket_directories"                       <=
"unix_socket_group"                             <=
"unix_socket_permissions"                       <=
"wal_consistency_checking"                      <=

同じ方法で、任意のバージョン間のデフォルトパラメタグループ差異をすぐに把握できますし、いざバージョンが決まったら、データ型や取りうる値などを網羅した一覧を作成することもできますね。

あとは差分のあったパラメタについて、作成した一覧からDescription(説明)の項目等を参照することで、影響の度合いや新規パラメタの設定値を検討します。Descriptionだけで判断できない場合は、PostgreSQL本体のドキュメントに説明がある場合もあるので、そちらも確認してみましょう。

快適なAWSライフを!


執筆者プロフィール:大竹 一毅
国内大手システムインテグレーターにて技術支援部門に所属し、アプリケーション領域やクラウドインフラ領域のアーキテクトとして従事した後、SHIFTにジョイン。クラウドインフラの保守業務をしたり設計に口を挟んだりしている。

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/