Skip to content

Commit ddb33cb

Browse files
authored
feat: Added support for secretsmanager secret in endpoints (#27)
1 parent baa10d1 commit ddb33cb

File tree

6 files changed

+112
-30
lines changed

6 files changed

+112
-30
lines changed

README.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -303,14 +303,14 @@ Examples codified under the [`examples`](https://github.com/terraform-aws-module
303303
| Name | Version |
304304
|------|---------|
305305
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
306-
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.6 |
306+
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.17 |
307307
| <a name="requirement_time"></a> [time](#requirement\_time) | >=0.7.2 |
308308

309309
## Providers
310310

311311
| Name | Version |
312312
|------|---------|
313-
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.6 |
313+
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.17 |
314314
| <a name="provider_time"></a> [time](#provider\_time) | >=0.7.2 |
315315

316316
## Modules

examples/complete/README.md

+6-2
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,14 @@ Note that this example may create resources which will incur monetary charges on
2828
| Name | Version |
2929
|------|---------|
3030
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.13.1 |
31-
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.6 |
31+
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.17 |
3232
| <a name="requirement_random"></a> [random](#requirement\_random) | >= 3.0 |
3333

3434
## Providers
3535

3636
| Name | Version |
3737
|------|---------|
38-
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.6 |
38+
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.17 |
3939
| <a name="provider_random"></a> [random](#provider\_random) | >= 3.0 |
4040

4141
## Modules
@@ -58,11 +58,15 @@ Note that this example may create resources which will incur monetary charges on
5858
| Name | Type |
5959
|------|------|
6060
| [aws_iam_role.s3_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
61+
| [aws_iam_role.secretsmanager_role](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
62+
| [aws_kms_key.aurora_credentials](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
6163
| [aws_kms_key.msk](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/kms_key) | resource |
6264
| [aws_rds_cluster_parameter_group.postgresql](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster_parameter_group) | resource |
6365
| [aws_s3_object.hr_data](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_object) | resource |
66+
| [aws_secretsmanager_secret.aurora_credentials](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret) | resource |
6467
| [aws_secretsmanager_secret.msk](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret) | resource |
6568
| [aws_secretsmanager_secret_policy.msk](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_policy) | resource |
69+
| [aws_secretsmanager_secret_version.aurora_credentials](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_version) | resource |
6670
| [aws_secretsmanager_secret_version.msk](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/secretsmanager_secret_version) | resource |
6771
| [aws_sns_topic.example](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sns_topic) | resource |
6872
| [random_pet.this](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/pet) | resource |

examples/complete/main.tf

+87-11
Original file line numberDiff line numberDiff line change
@@ -119,17 +119,15 @@ module "dms_aurora_postgresql_aurora_mysql" {
119119
}
120120

121121
postgresql-source = {
122-
database_name = local.db_name
123-
endpoint_id = "${local.name}-postgresql-source"
124-
endpoint_type = "source"
125-
engine_name = "aurora-postgresql"
126-
extra_connection_attributes = "heartbeatFrequency=1;"
127-
username = local.db_username
128-
password = module.rds_aurora["postgresql-source"].cluster_master_password
129-
port = 5432
130-
server_name = module.rds_aurora["postgresql-source"].cluster_endpoint
131-
ssl_mode = "none"
132-
tags = { EndpointType = "postgresql-source" }
122+
database_name = local.db_name
123+
endpoint_id = "${local.name}-postgresql-source"
124+
endpoint_type = "source"
125+
engine_name = "aurora-postgresql"
126+
secrets_manager_arn = aws_secretsmanager_secret_version.aurora_credentials.arn
127+
secrets_manager_access_role_arn = aws_iam_role.secretsmanager_role.arn
128+
extra_connection_attributes = "heartbeatFrequency=1;secretsManagerEndpointOverride=${module.vpc_endpoints.endpoints["secretsmanager"]["dns_entry"][0]["dns_name"]}"
129+
ssl_mode = "none"
130+
tags = { EndpointType = "postgresql-source" }
133131
}
134132

135133
mysql-destination = {
@@ -303,6 +301,10 @@ module "vpc_endpoints" {
303301
route_table_ids = flatten([module.vpc.private_route_table_ids, module.vpc.database_route_table_ids])
304302
tags = { Name = "s3-vpc-endpoint" }
305303
}
304+
secretsmanager = {
305+
service_name = "com.amazonaws.${local.region}.secretsmanager"
306+
subnet_ids = module.vpc.database_subnets
307+
}
306308
}
307309

308310
tags = local.tags
@@ -573,3 +575,77 @@ resource "aws_secretsmanager_secret_policy" "msk" {
573575
}
574576
POLICY
575577
}
578+
579+
resource "aws_kms_key" "aurora_credentials" {
580+
description = "KMS CMK for ${local.name}"
581+
enable_key_rotation = true
582+
583+
tags = local.tags
584+
}
585+
586+
resource "aws_secretsmanager_secret" "aurora_credentials" {
587+
name = "rds_aurora_${local.name}_${random_pet.this.id}"
588+
description = "Secret for ${local.name}"
589+
kms_key_id = aws_kms_key.aurora_credentials.key_id
590+
591+
tags = local.tags
592+
}
593+
594+
resource "aws_secretsmanager_secret_version" "aurora_credentials" {
595+
secret_id = aws_secretsmanager_secret.aurora_credentials.id
596+
secret_string = jsonencode(
597+
{
598+
username = module.rds_aurora["postgresql-source"].cluster_master_username
599+
password = module.rds_aurora["postgresql-source"].cluster_master_password
600+
port = 5432
601+
host = module.rds_aurora["postgresql-source"].cluster_endpoint
602+
}
603+
)
604+
depends_on = [module.rds_aurora]
605+
}
606+
607+
resource "aws_iam_role" "secretsmanager_role" {
608+
name = "${local.name}-secretsmanager"
609+
description = "Role used to read secretsmanager secret"
610+
611+
assume_role_policy = jsonencode({
612+
Version = "2012-10-17"
613+
Statement = [
614+
{
615+
Sid = "DMSAssume"
616+
Action = "sts:AssumeRole"
617+
Effect = "Allow"
618+
Principal = {
619+
Service = "dms.${local.region}.amazonaws.com"
620+
}
621+
},
622+
]
623+
})
624+
625+
inline_policy {
626+
name = "${local.name}-secretsmanager"
627+
628+
policy = jsonencode({
629+
Version = "2012-10-17"
630+
Statement = [
631+
{
632+
Sid = "DMSRead"
633+
Action = "secretsmanager:GetSecretValue"
634+
Effect = "Allow"
635+
Resource = aws_secretsmanager_secret_version.aurora_credentials.arn
636+
},
637+
{
638+
Sid = "KMSRead"
639+
Action = [
640+
"kms:Decrypt",
641+
"kms:DescribeKey"
642+
]
643+
Effect = "Allow"
644+
Resource = aws_kms_key.aurora_credentials.arn
645+
}
646+
]
647+
})
648+
}
649+
650+
tags = local.tags
651+
}

examples/complete/versions.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ terraform {
44
required_providers {
55
aws = {
66
source = "hashicorp/aws"
7-
version = ">= 4.6"
7+
version = ">= 4.17"
88
}
99
random = {
1010
source = "hashicorp/random"

main.tf

+15-13
Original file line numberDiff line numberDiff line change
@@ -151,19 +151,21 @@ resource "aws_dms_replication_instance" "this" {
151151
resource "aws_dms_endpoint" "this" {
152152
for_each = { for k, v in var.endpoints : k => v if var.create }
153153

154-
certificate_arn = try(aws_dms_certificate.this[each.value.certificate_key].certificate_arn, null)
155-
database_name = lookup(each.value, "database_name", null)
156-
endpoint_id = each.value.endpoint_id
157-
endpoint_type = each.value.endpoint_type
158-
engine_name = each.value.engine_name
159-
extra_connection_attributes = lookup(each.value, "extra_connection_attributes", null)
160-
kms_key_arn = lookup(each.value, "kms_key_arn", null)
161-
password = lookup(each.value, "password", null)
162-
port = lookup(each.value, "port", null)
163-
server_name = lookup(each.value, "server_name", null)
164-
service_access_role = lookup(each.value, "service_access_role", null)
165-
ssl_mode = lookup(each.value, "ssl_mode", null)
166-
username = lookup(each.value, "username", null)
154+
certificate_arn = try(aws_dms_certificate.this[each.value.certificate_key].certificate_arn, null)
155+
database_name = lookup(each.value, "database_name", null)
156+
endpoint_id = each.value.endpoint_id
157+
endpoint_type = each.value.endpoint_type
158+
engine_name = each.value.engine_name
159+
extra_connection_attributes = lookup(each.value, "extra_connection_attributes", null)
160+
kms_key_arn = lookup(each.value, "kms_key_arn", null)
161+
password = lookup(each.value, "password", null)
162+
port = lookup(each.value, "port", null)
163+
server_name = lookup(each.value, "server_name", null)
164+
service_access_role = lookup(each.value, "service_access_role", null)
165+
ssl_mode = lookup(each.value, "ssl_mode", null)
166+
username = lookup(each.value, "username", null)
167+
secrets_manager_access_role_arn = lookup(each.value, "secrets_manager_access_role_arn", null)
168+
secrets_manager_arn = lookup(each.value, "secrets_manager_arn", null)
167169

168170
# https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.Elasticsearch.html
169171
dynamic "elasticsearch_settings" {

versions.tf

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ terraform {
44
required_providers {
55
aws = {
66
source = "hashicorp/aws"
7-
version = ">= 4.6"
7+
version = ">= 4.17"
88
}
99
time = {
1010
source = "hashicorp/time"

0 commit comments

Comments
 (0)