AWS Secrets Manager を使ってRDSへ接続してみる！

## 勉強前イメージ

[これ](https://qiita.com/miyuki_samitani/items/d19006aab6f8f6f284f6) で勉強したからやってみる。
パスワードとかを格納したらいいのかね。

## まず AWS Secrets Manager とは

サービス、環境、アプリケーションに接続するためのパスワードなどの機密情報を管理するためのサービスです。
詳細は [こちら](https://qiita.com/miyuki_samitani/items/d19006aab6f8f6f284f6) で見てください

## さっそくやってみる

### 構成

EC2を立てて、RDSへ接続する簡単な構成。
接続情報はSecrets Managerを使用するって感じで設定していきたいと思います

![12022-02-19 # AWS Secrets Manager を使ってRDSへ接続してみる！ -.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/dddf9389-25b8-b93f-f269-2396914ca939.png)


### EC2 instanceを作成

いつものことなので詳細は省きますが、
[こちら](https://qiita.com/miyuki_samitani/items/61e1548cb61f4053e78d) を参考にしていい感じにEC2 instance作ってください。

以下のように適当にインスタンス作りました。
`aws configure` コマンドで設定も終わらせます。
jqコマンドが必要なので、今のうちに入れておいてください

![101インスタンス _ EC2 Management Console - Google Chrome 20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/b0d4f50f-5135-1ff2-79e5-f8b3cdcb4513.png)


### RDSを作成

こちらも適当にRDSを作ります。
全然違う記事なのですが作り方は一緒なので、 [こちら](https://qiita.com/miyuki_samitani/items/adb7595e3b0d03bb5b33#rds%E3%81%AE%E4%BD%9C%E6%88%90) を参考にしてRDSを作ってみてください。

以下のようにRDS(mysql)を作りました。
今回はパスワード認証にしています。

![1RDS Management Console - Google Chrome 2022-02-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f14d2a20-a35c-e7a6-650f-a098c8bd7838.png)


EC2からRDSに接続できました。

```
[root@ip-XX-XX-XX-XX ~]# mysql -u XXXXXXXXXX -p -h XXXXXXXXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 8.0.27 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)]> 
```

データも適当に入れました。

```
MySQL [id_user]> select * from id_user.user ;
+------+------+
| id   | name |
+------+------+
|    1 | sum  |
|    2 | jun  |
+------+------+
2 rows in set (0.00 sec)
```

### AWS Secrets Manager の登録

- AWS Secrets Managerへ行きます。

![1Secrets Manager - Google Chrome 2022-02-19 12.11.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/80c29b91-6fc0-f3c0-8af9-b3e7f22f32af.png)


- シークレットを追加

設定を選択していきます。

・ シークレットのタイプ : Amazon RDS データベースの認証情報
・ ユーザ名 : RDSへの接続の時のユーザ
・ パスワード : RDSへの接続の時のパスワード
・ 暗号化キー : DefaultEcvryptionKey

![102Secrets Manager - Google Chrome 2022-02-19 13.31.0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/20ae7988-ac06-9e93-9c71-e1d5a0a36c9e.png)



・ データベース
	・ database-1 を選択(今回作ったデータベースが表示される)

![3Secrets Manager - Google Chrome 2022-02-19 12.45.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/75ab19fc-26a8-1703-5ce0-8ba8dcd23d9e.png)


・ シークレットの名前 : rds_connection
・ 説明 : RDS connection

![4Secrets Manager - Google Chrome 2022-02-19 12.48.3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/c2d5f4b8-4205-2bed-5ff4-8f0cc3893089.png)


・ 自動ローテーションを設定する : しない
	・ 今回は設定して見るだけなので、ローテーションはなし

![5Secrets Manager - Google Chrome 2022-02-19 12.49.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/107f59d8-269e-5760-aa0a-9b5dd57b7d76.png)


- 作成できました

一旦作ってみました。

![6Secrets Manager - Google Chrome 2022-02-19 12.50.2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/8330e83d-7af8-f2a4-455c-f31bf40bf8f7.png)


- EC2からシークレットマネージャーにアクセスしてみる

`aws secretsmanager get-secret-value --secret-id [シークレットの名前]` でEC2からアクセスすることができます。
今回のシークレットの名前は rds_connection なので、
`aws secretsmanager get-secret-value --secret-id rds_connection` になります。
出力結果は以下になります。

```
[root@ip-XX-XX-XX-XX ~]# aws secretsmanager get-secret-value --secret-id rds_connection
{
    "Name": "rds_connection", 
    "VersionId": "XXXXXXXXXXXXXXXXXXXXXXXXXXX", 
    "SecretString": "{\"username\":\"XXXXXX\",\"password\":\"XXXXXXXXXXXXXXXXXXX\",\"engine\":\"mysql\",\"host\":\"XXXXXXXXXXXXXXXXXXXXXXXXap-northeast-1.rds.amazonaws.com\",\"port\":3306,\"dbInstanceIdentifier\":\"database-1\"}", 
    "VersionStages": [
        "AWSCURRENT"
    ], 
    "CreatedDate": XXXXXXXXXXXXXXXX, 
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:XXXXXXXXXXXXXXXXXX:secret:XXXXXXXXXXXXXXXXXXXX"
}
```

整形したのが以下になります。

```
[root@ip-172-31-10-19 ~]# aws secretsmanager get-secret-value --secret-id rds_connection | jq .SecretString | jq fromjson
{
  "username": "XXXXXXX",
  "password": "XXXXXXXXXXXXXXXXXXx",
  "engine": "mysql",
  "host": "XXXXXXXXXXXXXXXXXXXXXXXXX.ap-northeast-1.rds.amazonaws.com",
  "port": 3306,
  "dbInstanceIdentifier": "database-1"
}
```

- 各パラメータを変数に格納

上記の出力を変数に入れます。

```
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)
```

- 変数を使用してアクセス

以下のように接続できました！

```
mysql -h $endpoint -u $user -P $port -p$password -e "select * from id_user.user;"
```

```
+------+------+
| id   | name |
+------+------+
|    1 | sum  |
|    2 | jun  |
+------+------+
```

## 勉強後イメージ

ユーザとかパスワードも勝手にとってくるイメージやったけど、手入力なんやw
勘違いしてた
でもこれはユーザ名とか変更する際も楽そうだね。

## 参考

- [RDS の接続情報を AWS Secrets Manager でを管理する](https://random-tech-note.jp/rds-rotate-password/)
- [【AWS】SecretsManagerとは？AWSでキーを一元管理する方法解説します](https://engineer-ninaritai.com/aws-secrets-manager/)