AWS Secrets ManagerでRDSデータベースのパスワードを管理しローテーションする

やりたいこと。
　AWS Secrets ManagerでRDSデータベース接続時のパスワード管理をする。
　また、同時に生成されるLambdaによってシークレット情報のローテーションと同期して、RDSのパスワードを更新させる。



#RDS作成の注意事項#

プライベート VPC の使用が必要な場合は、Lambda 関数を VPC で実行するように設定されている必要があります。
次に、プライベート Secrets Manager エンドポイントで VPC を設定するか、NAT ゲートウェイを使用してパブリックインターネットアクセスを持つ VPC を設定して、Lambda ローテーション関数がパブリック Secrets Manager エンドポイントにアクセスできるようにする必要があります。

この設定がなされていないと、以下の通りのエラーが表示されます。

`シークレット "test/app/naata" のローテーションに失敗しました A previous rotation isn't complete. That rotation will be reattempted.`

ただし、今回はパブリックで作成し、検証していきます。



#Secrets Manager でシークレットを保存する#

**1.シークレットのタイプ**
RDSを選択し、シークレットに保存するユーザー名とパスワードを入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c03e0ff5-0b24-b2ca-4ee3-d4f52dd1481d.png)

**2.名前と説明**
シークレットを簡単に見つけて管理できるような名前を付けてください。

**3.ローテーションを設定する（無効）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/82cd466b-35e1-a864-03f3-20bddfd60f11.png)

**4.レビュー**
アプリケーションでシークレットを取得する方法を説明するコードサンプルが表示されます。


#作成したシークレットを確認する#

最初にmysqlとjqをインストールし、awscliを最新にしておきます。

```
$ sudo yum install mysql jq -y
$ sudo pip install awscli --upgrade --user
```

シークレットに設定した情報を確認します。

```
$ aws secretsmanager get-secret-value --secret-id <シークレットID> | jq .SecretString | jq fromjson

{
  "username": "naata",
  "engine": "mysql",
  "dbname": "naatadb",
  "host": "naatadatabase.ceis6fakmqqy.ap-northeast-1.rds.amazonaws.com",
  "password": "test1",
  "port": 3306,
  "dbInstanceIdentifier": "naatadatabase"
}
```

各パラメータを変数に格納します。

```
$ secret=$(aws secretsmanager get-secret-value --secret-id <シークレットID> | 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)
```

mysqlへの接続を確認する。

```
$ mysql -h $endpoint -u $user -P $port -p$password
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.22 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.
```



#シークレットのローテーションを有効にしてみる#
「保存」ボタンをクリックすると、しばらくすると、ローテーション設定が更新され、シークレットを更新するAWS Lambdaが自動的に作成され、ローテーションが実行されます。作成されたLambdaもよければみておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/cf90ca86-9209-0ebe-9f43-c530dcc6f4c7.png)

シークレット情報を更新し、パスワードが更新されているか確認しましょう。

```
$ aws secretsmanager get-secret-value --secret-id <シークレットID> | jq .SecretString | jq fromjson
{
  "username": "naata",
  "engine": "mysql",
  "dbname": "naatadb",
  "host": "naatadatabase.ceis6fakmqqy.ap-northeast-1.rds.amazonaws.com",
  "password": "}jjjjjjladjslajdadjsal",
  "port": 3306,
  "dbInstanceIdentifier": "naatadatabase"
}
```

後は同じように接続を確認していきます。

各パラメータを変数に格納します。

```
$ secret=$(aws secretsmanager get-secret-value --secret-id <シークレットID> | 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)
```

mysqlへの接続を確認する。

```
$ mysql -h $endpoint -u $user -P $port -p$password
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.22 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.
```