#31.manage_master_user_passwordについて

# はじめに
こんにちは、nayaaaaです。
manage_master_user_passwordを設定することでAWS Secrets Managerでパスワードやローテーションの設定を自動で設定してくれるということで備忘録として書いてみました。

# AWS Secrets Manager連携と自動ローテーション設定
Terraformでrdsインスタンスやクラスタをデプロイする際に、master_passwordもしくは、passwordにパスワード情報を入れることで、デプロイ後のrdsインスタンスへ接続する際のパスワードを設定します。
これらのパスワード情報について、今までは.tfvarsで管理しておりました。
そこで、AWS Secrets Managerを使用することによって、AWS側で管理された状態のパスワード情報を使用し、ログインすることが可能になりました。

しかし、その際は、AWS Secrets Manager用の設定も必要となります。
Terraformでは、**manage_master_user_password**を使用すると、AWS Secrets Managerのsercretの作成や特定の期間でパスワードの更新を行うローテーションの設定も自動で行ってくれます。

https://tech.dentsusoken.com/entry/terraform_manage_master_user_password

ローテーション機能には以下の２つがあります。



■公式ドキュメントから抜粋

>>・マネージドローテーション – ほとんどのマネージドシークレットでは、マネージドローテーションを使用します。このローテーションでは、サービスによってローテーションが構成および管理されます。マネージドローテーションは Lambda 関数を使用しません。
>>
>>・Lambda 関数によるローテーション – その他のタイプのシークレットの場合、Secrets Manager ローテーションは Lambda 関数を使用して、シークレットとデータベースまたはサービスを更新します


https://docs.aws.amazon.com/ja_jp/secretsmanager/latest/userguide/rotating-secrets.html


**manage_master_user_password**を使用すると自動でこのマネージドローテーションの設定となります。


TerraformではAWS Secrets Managerの設定をする際、この**manage_master_user_password**を使用しない場合は、個別でシークレットの作成とローテーションなどの設定が必要になります。

# manage_master_user_passwordを試してみる
※vpcの設定やサブネットは省略しております。

```
resource "aws_rds_cluster" "aurora" {
  cluster_identifier          = "test-aurora-cluster"
  engine                      = "aurora-mysql"
  engine_version              = "8.4.mysql_aurora.3.09.0"
  master_username             = "test"
  manage_master_user_password =  true

  database_name               = "test-db"
  skip_final_snapshot         =  true

  vpc_security_group_ids      = [aws_security_group.aurora_sg.id]
  db_subnet_group_name        = aws_db_subnet_group.aurora_subnet_group.name
}
```

- 以下を実行

```
% terraform plan
% terraform apply
```

![image (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/9957b6d7-8710-462c-a901-8a4a662da66e.png)



![image (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/8dbd74aa-4e6c-4fdb-b247-62f2f6435e6a.png)



![image (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/769bf6b0-6e2d-4f8d-8112-bb6901143229.png)


![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/5a638aee-0c49-4193-8c01-8be8d7ef26bd.png)


ローテーションの設定も行われており、「すぐにシークレットのローテーションさせる」で問題なくパスワードの更新ができました。
また、４枚目の画像からマネージドローテーションとして設定されていることがわかりました。


# 念のため確認👇（シークレットの作成のみの場合）


```
resource "aws_secretsmanager_secret" "secret" {
  description             = "テスト"
  kms_key_id              = var.kms_key_id
  name                    = "test"
  recovery_window_in_days = 30

tags = {
  Environment = "test"
}
}

resource "aws_secretsmanager_secret_version" "secret" {
  secret_id     = aws_secretsmanager_secret.secret.id
  secret_string = jsonencode({
    username = "nayanaya"
    password = "password123"
  })
}
```

- 以下を実行
```
% terraform plan
% terraform apply
```

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/41b0eac0-45b8-4329-8e1c-0542f7df8774.png)


![image (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/2d230480-be4c-43a8-ab80-8873f62fbb3e.png)

![image (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904736/d3decaf7-7df9-4238-9888-b1d5431c745d.png)

やはりシークレットの設定のみでは、画像の通りローテーションの設定はされないですね。

以下のソースコードでもローテーションの設定（lambda)は別で設定していますね(125行目〜）

https://github.com/giuseppeborgese/terraform-aws-secret-manager-with-rotation/blob/master/main.tf






# まとめ

manage_master_user_passwordを使用することで、以下のことがわかりました。
- AWSが自動的にシークレット作成
- マネージドローテーションを有効化
- Lambdaは使用しない

今回は、簡単な確認のみとなりましたが、時間がある時にローテーションやLambdaの設定も試してみたいと思います。
以上、ありがとうございました！