SSL 接続を必要とする DB ユーザー用の AWS Secrets Manager のシークレットをローテーションするにはどうすればよいですか?

最終更新日: 2020 年 10 月 15 日

AWS Secrets Manager のローテーション機能が、SSL を使用して Amazon Relational Database Service (Amazon RDS) インスタンスに接続することができません。以下のようなエラーが表示されます。

": setSecret: Unable to log into database with previous, current, or pending secret of secret"

解決方法

DB ユーザーの Lambda ローテーション関数を変更して、SSL 接続を必要とする DB ユーザーのシークレットをローテーションします。この例では、Amazon RDS MySQL DB のシングルユーザーインスタンスを使用して RDS MySQL シングルユーザーテンプレートを変更します。RDS MySQL 以外の RDS データベースを使用する場合は、Lambda ローテーション関数の作成に使用できる AWS テンプレートを参考にしてください。

重要:

シークレットを作成して、自動ローテーションを有効にする

1.    Secrets Manager コンソールを開いて、[新しいシークレットを保存する] をクリックします。

注意: 必ず Amazon RDS MySQL データベースと同じリージョンにサインインしていることを確認してください。

2.    [Select secret type] で、[Credentials for RDS database] を選択します。

3.    DB ユーザーと同じユーザー名パスワードを入力します。

4.    [このシークレットがアクセスするRDSデータベースを選択してください] で、Amazon RDS MySQL データベースを選択してから、[次へ] をクリックします。

5.    [シークレット名] と [説明] を入力してから、[次へ] をクリックします。

6.    [Configure automatic rotation] で、[Enable automatic rotation] を選択します。

7.    [新しいAWS Lambda関数名] に名前を入力し、[次へ] をクリックしてから、[保存] をクリックします。

SSL 接続でデータベースに接続するように Lambda ローテーション関数をカスタマイズする

1.    AWS Lambda コンソールを開いて、[Functions] を選択します。

2.    [Function name] で、RDS MySQL 関数を選択します。

3.    [ARN] の横にあるページの上部で、[copy] アイコンを選択します。

4.    SSL を使用した DB インスタンスへの接続の暗号化から、rds-combined-ca-bundle.pem 証明書バンドルをダウンロードします。

注: ファイル名は rds-combined-ca-bundle.pem のままにし、ファイルをディレクトリに配置しないでください。

5.    rds-combined-ca-bundle.pem ファイルを Lambda に追加します。手順については、AWS Lambda コンソールエディタを使用した関数の作成、を参照してください。

6.    lambda_function.py の "pymysql.connect" を含むコード行を以下のように変更します。

conn = pymysql.connect(secret_dict['host'], user=secret_dict['username'], passwd=secret_dict['password'], port=port, db=dbname, connect_timeout=5, ssl={'ca': './rds-combined-ca-bundle.pem'})

7.    [保存] をクリックします。

手動でシークレットをローテーションする

1.    以下のコマンドを実行して、シークレットのバージョン ID を一覧します。

注意: EXAMPLESECRETNAME をシークレットの変数に置き換えます。

aws secretsmanager list-secret-version-ids --secret-id EXAMPLESECRETNAME

2.    出力から、VersionStages の値が AWSPENDING となっているバージョン ID を見つけます。次に、以下のコマンドを実行してステージングラベルを削除します。

aws secretsmanager update-secret-version-stage --secret-id EXAMPLESECRETNAME --remove-from-version-id EXAMPLEVERSIONID --version-stage AWSPENDING

3.    Secrets Manager コンソールを開いてから、シークレットを選択します。

4.    [ローテーション構成] で、[すぐにシークレットをローテーションさせる] を選択してから、[更新] を選択します。

DB ユーザーのデータベースへの接続を確認する

チュートリアル: rotating a secret for an AWS database(AWS データベースでのシークレットのローテーション)にある手順 1~5 に従い、MySQL クライアントをインストールし、一時的なシークレットを取得します。

注: 手順 3 は、以下のコマンドで置き換えます。

mysql -h $endpoint --ssl-ca=EXAMPLEPATH/rds-combined-ca-bundle.pem --ssl-verify-server-cert -u $user -P $port -p$password