AWS Secrets Managerに保存された認証情報を使ってEC2からRDSにログインしてみた

記事タイトルとURLをコピーする

はじめに

こんにちは。11月から晴れてSA1課に配属された阿部です。
今回は今まで触れたことがなかったAWS Secrets Managerを触る機会がありましたので、その検証内容を共有させて頂きます。

作業概要

EC2からSecrets Managerにあるシークレット(RDSの認証情報)を取得して、
RDSに接続するまでを行います。
本記事での作業手順は以下のとおりです。

  1. 事前準備
  2. シークレットの作成
  3. EC2からシークレットの取得
  4. 取得したシークレットを使ってRDSへログイン

以上の流れで行います。

構成図

構成図

事前準備

EC2の作成

Secrets Managerからシークレットを取得するために、適当なEC2を作成します。

RDSの作成

EC2から接続するために、適当なRDSを作成します。今回はAurora MySQLで作成してみました。

EC2に対するシークレットへのアクセス許可設定

EC2からSecrets Manager内のシークレットにアクセスするためのロールをEC2に付与します。

ロール名 RoleToRetrieveSecretAtRuntime
ポリシー名 SecretsManagerReadWrite

やったこと

シークレットの作成

  • Secrets Managerのコンソール画面から新しいシークレットを作成します。

  • シークレットの名前を設定します。

  • 今回は検証のため、シークレットの自動ローテーション設定は行いません。

  • シークレットが作成されました。

EC2からシークレットの取得

  • 以下のコマンドを実行して、指定したシークレット名の情報を取得します。
$ aws secretsmanager get-secret-value --secret-id test_secret
  • コマンドが成功すると、以下のように取得内容が表示されます。
{
     "ARN": "arn:aws:secretsmanager:ap-northeast-1:[アカウントID]:secret:test_secre XXXXXXX",
     "Name": "test_secret",
     "VersionId": "537308f9-d3ba-4e5e-af56-3d2c5781f7ca",
     "SecretString": "{\"username\":\"[ユーザー名]\",\"password\":\"[実際のパスワード] \",\"engine\":\"mysql\",\"host\":\"[DBエンドポイント名]\",\"port\":3306,\"dbClusterIdentifier\":\"[データベース名]\"}",
     "VersionStages": [
         "AWSCURRENT"
     ],
     "CreatedDate": "XXXX-XX-XXXXX:XX:00.075000+00:00"
 }
  • 取得したシークレットを変数に格納します。
$ secret=$(aws secretsmanager get-secret-value --secret-id rds_connection | jq .SecretString | jq fromjson)
$ user=$(echo $secret | jq -r .username)
$ password=$(echo $secret | jq -r .password)
$ endpoint=$(echo $secret | jq -r .host)
$ port=$(echo $secret | jq -r .port)

取得した認証情報を使ってRDSへ接続

  • 以下のコマンドを実行して、取得したシークレット情報を元にRDSへ接続します。
$ mysql -h $endpoint -u $user -P $port -p$password
  • 以下のようなメッセージが表示されれば接続成功です。
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 107
Server version: 8.0.32 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>

おまけ

今回は、既存の認証情報をSecrets Managerでも流用したいため、シークレットを手動で作成して検証しました。
既にRDSを構築済みで、「既存の認証情報をそのまま」Secrets Managerへ移行したいという要件がなければ、 以下の記事にて紹介されている手順を踏むことで、シークレットの作成も自動で行ってくれます。
(ただし、既存の認証情報は変更されます。)

blog.serverworks.co.jp

おわりに

いかがでしたでしょうか。 今回の検証を通して、AWS Secrets Managerを利用した認証情報のやりとりについて、理解を深めることができました。
この記事がどなたかのお役に立てれば幸いです。

阿部伊織(執筆記事の一覧)

インフラエンジニアからクラウドエンジニアへ転職。