25卒の安彦と申します。先日AWS Certified DevOps Engineer – Professionalの試験を受験した際に「データベースのエンドポイントをParameter Storeで保存して運用する」という記述が頻繁に見られました。それまでパスワード等の認証情報を保存して運用する方法は聞いたことがありましたが、エンドポイントを保存する運用は初めて知ったので少し戸惑ってしまいました。

なぜそのような実装をする必要があるのでしょうか?気になったので調べてみました!

結論

データベースのエンドポイントをAWS Systems Manager Parameter Storeに保存して運用することで運用効率の向上が期待できます。

仮に、データベースの認証情報のみをParameter Storeに保存していた場合、DBの再構築や変更が生じた際、コードを修正する必要が出てきます。この時、エンドポイントもParameter Storeに保存しておけば、Parameter Storeの値を更新するだけで、アプリケーションコードを変更したり再デプロイしたりすることなく、エンドポイントの変更を反映できます。また、Parameter Storeにはバージョニング機能が備わっています。DB変更時に起こったエラーも、この機能を利用して簡単にトラブルシュートすることができます。

つまり認証情報だけでなくエンドポイントもParameter Storeへ保存することで、セキュリティの確保と運用効率の向上という二つの大きなメリットを得ることができます。

実装例

では、実際にParameter Store内のエンドポイント経由でAmazon Auroraに接続できるかテストします。               ※接続用のAmazon EC2インスタンスを事前に準備してある前提の手順です。

手順1

・Amazon Aurora(MySQL互換)クラスターを作成します。この時、ユーザー名とDBパスワードを設定し、ライターエンドポイントリーダーエンドポイントの二つの値を控えておきます。

ライターエンドポイント  Auroraクラスターに対する書き込みオペレーション (挿入、更新、削除等) で使用します。
リーダーエンドポイント  Aurora クラスターの読み取りに使用します。主にクエリ等で使用します。

手順2

・Parameter StoreへのDB接続情報を保存します。                                   控えておいたAmazon AuroraのエンドポイントとDBの認証情報をParameter Storeに保存します。                   最初に以下のパラメータを作成します。

ライターエンドポイント

  • 名前: /handson/db/writer-endpoint
  • タイプ: 文字列
  • 値: 手順1で控えたライターエンドポイント

リーダーエンドポイント

  • 名前: /handson/db/reader-endpoint
  • タイプ: 文字列
  • 値: 手順1で控えたリーダーエンドポイント

DBユーザー

  • 名前: /handson/db/user
  • タイプ: 文字列
  • 値: 手順1で設定したマスターユーザー名

DBパスワード

  • 名前: /handson/db/password
  • タイプ: 安全な文字列 (SecureString)
  • 値: 手順1で設定したマスターパスワード

手順3

 Amazon EC2インスタンスにMySQLクライアントをインストールします。

[注意!!]環境によっては直接MySQLクライアントをインストールできない可能性があります。                その際はMariaDBクライアントを指定するなどして問題を迂回します。                                        コマンド例  sudo dnf install mariadb105-server  (MariaDBを経由してMySQLを使用)

手順4

・ Amazon EC2からDBへの接続テスト

 Amazon EC2インスタンス上で、AWS CLIを使ってParameter Storeから値を取得できることを確認します。             aws ssm get-parameters --names "/handson/db/writer-endpoint" --query "Parameters[0].Value" --output text         (Parameter Storeからライターエンドポイントを取得 )

取得した情報を使って、MySQLに接続します。

MySQLプロンプト (mysql>) が表示されれば接続成功です!

今回のまとめ

  • 認証情報だけ保存するソリューションだとセキュリティは確保できるものの、運用面で不安が残る
  • 認証情報と同様にデータベースのエンドポイントもParameter Storeで管理することでセキュリティと運用効率を両立した盤石な構成が可能となる
  • 認証情報の保存だけに留めるのか、エンドポイントも保存して利便性を追求するか、はたまたAWS Secrets Managerでより厳密なセキュリティ要件に対応するのか、要件によって適切に判断していくことが重要