Skip to content

Commit 64b44d2

Browse files
Promote Cloud SQL CMEK feature to ga (#6195) (#12039)
Co-authored-by: Krishnamoorthy Rajarathinam <[email protected]> Signed-off-by: Modular Magician <[email protected]> Co-authored-by: Krishnamoorthy Rajarathinam <[email protected]>
1 parent fc04513 commit 64b44d2

File tree

4 files changed

+227
-1
lines changed

4 files changed

+227
-1
lines changed

.changelog/6195.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
sql: promoted attribute "encryption_key_name" to GA in `google_sql_database_instance` resource.
3+
```

google/resource_sql_database_instance.go

+19
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,13 @@ is set to true.`,
479479
Description: `The MySQL, PostgreSQL or SQL Server (beta) version to use. Supported values include MYSQL_5_6, MYSQL_5_7, MYSQL_8_0, POSTGRES_9_6, POSTGRES_10, POSTGRES_11, POSTGRES_12, POSTGRES_13, POSTGRES_14, SQLSERVER_2017_STANDARD, SQLSERVER_2017_ENTERPRISE, SQLSERVER_2017_EXPRESS, SQLSERVER_2017_WEB. Database Version Policies includes an up-to-date reference of supported versions.`,
480480
},
481481

482+
"encryption_key_name": {
483+
Type: schema.TypeString,
484+
Optional: true,
485+
Computed: true,
486+
ForceNew: true,
487+
},
488+
482489
"root_password": {
483490
Type: schema.TypeString,
484491
Optional: true,
@@ -834,6 +841,12 @@ func resourceSqlDatabaseInstanceCreate(d *schema.ResourceData, meta interface{})
834841
defer mutexKV.Unlock(instanceMutexKey(project, instance.MasterInstanceName))
835842
}
836843

844+
if k, ok := d.GetOk("encryption_key_name"); ok {
845+
instance.DiskEncryptionConfiguration = &sqladmin.DiskEncryptionConfiguration{
846+
KmsKeyName: k.(string),
847+
}
848+
}
849+
837850
var patchData *sqladmin.DatabaseInstance
838851

839852
// BinaryLogging can be enabled on replica instances but only after creation.
@@ -1218,6 +1231,12 @@ func resourceSqlDatabaseInstanceRead(d *schema.ResourceData, meta interface{}) e
12181231
log.Printf("[WARN] Failed to set SQL Database Instance Settings")
12191232
}
12201233

1234+
if instance.DiskEncryptionConfiguration != nil {
1235+
if err := d.Set("encryption_key_name", instance.DiskEncryptionConfiguration.KmsKeyName); err != nil {
1236+
return fmt.Errorf("Error setting encryption_key_name: %s", err)
1237+
}
1238+
}
1239+
12211240
if err := d.Set("replica_configuration", flattenReplicaConfiguration(instance.ReplicaConfiguration, d)); err != nil {
12221241
log.Printf("[WARN] Failed to set SQL Database Instance Replica Configuration")
12231242
}

google/resource_sql_database_instance_test.go

+204
Original file line numberDiff line numberDiff line change
@@ -1051,6 +1051,74 @@ func TestAccSqlDatabaseInstance_insights(t *testing.T) {
10511051
})
10521052
}
10531053

1054+
func TestAccSqlDatabaseInstance_encryptionKey(t *testing.T) {
1055+
t.Parallel()
1056+
1057+
context := map[string]interface{}{
1058+
"project_id": getTestProjectFromEnv(),
1059+
"key_name": "tf-test-key-" + randString(t, 10),
1060+
"instance_name": "tf-test-sql-" + randString(t, 10),
1061+
}
1062+
1063+
vcrTest(t, resource.TestCase{
1064+
PreCheck: func() { testAccPreCheck(t) },
1065+
Providers: testAccProviders,
1066+
CheckDestroy: testAccSqlDatabaseInstanceDestroyProducer(t),
1067+
Steps: []resource.TestStep{
1068+
{
1069+
Config: Nprintf(
1070+
testGoogleSqlDatabaseInstance_encryptionKey, context),
1071+
},
1072+
{
1073+
ResourceName: "google_sql_database_instance.replica",
1074+
ImportState: true,
1075+
ImportStateVerify: true,
1076+
ImportStateVerifyIgnore: []string{"deletion_protection"},
1077+
},
1078+
{
1079+
ResourceName: "google_sql_database_instance.master",
1080+
ImportState: true,
1081+
ImportStateVerify: true,
1082+
ImportStateVerifyIgnore: []string{"deletion_protection"},
1083+
},
1084+
},
1085+
})
1086+
}
1087+
1088+
func TestAccSqlDatabaseInstance_encryptionKey_replicaInDifferentRegion(t *testing.T) {
1089+
t.Parallel()
1090+
1091+
context := map[string]interface{}{
1092+
"project_id": getTestProjectFromEnv(),
1093+
"key_name": "tf-test-key-" + randString(t, 10),
1094+
"instance_name": "tf-test-sql-" + randString(t, 10),
1095+
}
1096+
1097+
vcrTest(t, resource.TestCase{
1098+
PreCheck: func() { testAccPreCheck(t) },
1099+
Providers: testAccProviders,
1100+
CheckDestroy: testAccSqlDatabaseInstanceDestroyProducer(t),
1101+
Steps: []resource.TestStep{
1102+
{
1103+
Config: Nprintf(
1104+
testGoogleSqlDatabaseInstance_encryptionKey_replicaInDifferentRegion, context),
1105+
},
1106+
{
1107+
ResourceName: "google_sql_database_instance.replica",
1108+
ImportState: true,
1109+
ImportStateVerify: true,
1110+
ImportStateVerifyIgnore: []string{"deletion_protection"},
1111+
},
1112+
{
1113+
ResourceName: "google_sql_database_instance.master",
1114+
ImportState: true,
1115+
ImportStateVerify: true,
1116+
ImportStateVerifyIgnore: []string{"deletion_protection"},
1117+
},
1118+
},
1119+
})
1120+
}
1121+
10541122
func TestAccSqlDatabaseInstance_ActiveDirectory(t *testing.T) {
10551123
t.Parallel()
10561124
databaseName := "tf-test-" + randString(t, 10)
@@ -1875,6 +1943,142 @@ resource "google_sql_database_instance" "instance" {
18751943
}
18761944
}
18771945
`
1946+
var testGoogleSqlDatabaseInstance_encryptionKey = `
1947+
data "google_project" "project" {
1948+
project_id = "%{project_id}"
1949+
}
1950+
resource "google_kms_key_ring" "keyring" {
1951+
name = "%{key_name}"
1952+
location = "us-central1"
1953+
}
1954+
1955+
resource "google_kms_crypto_key" "key" {
1956+
name = "%{key_name}"
1957+
key_ring = google_kms_key_ring.keyring.id
1958+
}
1959+
1960+
resource "google_kms_crypto_key_iam_binding" "crypto_key" {
1961+
crypto_key_id = google_kms_crypto_key.key.id
1962+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
1963+
1964+
members = [
1965+
"serviceAccount:service-${data.google_project.project.number}@gcp-sa-cloud-sql.iam.gserviceaccount.com",
1966+
]
1967+
}
1968+
1969+
resource "google_sql_database_instance" "master" {
1970+
name = "%{instance_name}-master"
1971+
database_version = "MYSQL_5_7"
1972+
region = "us-central1"
1973+
deletion_protection = false
1974+
encryption_key_name = google_kms_crypto_key.key.id
1975+
1976+
settings {
1977+
tier = "db-n1-standard-1"
1978+
1979+
backup_configuration {
1980+
enabled = true
1981+
start_time = "00:00"
1982+
binary_log_enabled = true
1983+
}
1984+
}
1985+
}
1986+
1987+
resource "google_sql_database_instance" "replica" {
1988+
name = "%{instance_name}-replica"
1989+
database_version = "MYSQL_5_7"
1990+
region = "us-central1"
1991+
master_instance_name = google_sql_database_instance.master.name
1992+
deletion_protection = false
1993+
1994+
settings {
1995+
tier = "db-n1-standard-1"
1996+
}
1997+
1998+
depends_on = [google_sql_database_instance.master]
1999+
}
2000+
`
2001+
2002+
var testGoogleSqlDatabaseInstance_encryptionKey_replicaInDifferentRegion = `
2003+
2004+
data "google_project" "project" {
2005+
project_id = "%{project_id}"
2006+
}
2007+
2008+
resource "google_kms_key_ring" "keyring" {
2009+
name = "%{key_name}"
2010+
location = "us-central1"
2011+
}
2012+
2013+
resource "google_kms_crypto_key" "key" {
2014+
2015+
name = "%{key_name}"
2016+
key_ring = google_kms_key_ring.keyring.id
2017+
}
2018+
2019+
resource "google_kms_crypto_key_iam_binding" "crypto_key" {
2020+
crypto_key_id = google_kms_crypto_key.key.id
2021+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
2022+
2023+
members = [
2024+
"serviceAccount:service-${data.google_project.project.number}@gcp-sa-cloud-sql.iam.gserviceaccount.com",
2025+
]
2026+
}
2027+
2028+
resource "google_sql_database_instance" "master" {
2029+
name = "%{instance_name}-master"
2030+
database_version = "MYSQL_5_7"
2031+
region = "us-central1"
2032+
deletion_protection = false
2033+
encryption_key_name = google_kms_crypto_key.key.id
2034+
2035+
settings {
2036+
tier = "db-n1-standard-1"
2037+
2038+
backup_configuration {
2039+
enabled = true
2040+
start_time = "00:00"
2041+
binary_log_enabled = true
2042+
}
2043+
}
2044+
}
2045+
2046+
resource "google_kms_key_ring" "keyring-rep" {
2047+
2048+
name = "%{key_name}-rep"
2049+
location = "us-east1"
2050+
}
2051+
2052+
resource "google_kms_crypto_key" "key-rep" {
2053+
2054+
name = "%{key_name}-rep"
2055+
key_ring = google_kms_key_ring.keyring-rep.id
2056+
}
2057+
2058+
resource "google_kms_crypto_key_iam_binding" "crypto_key_rep" {
2059+
crypto_key_id = google_kms_crypto_key.key-rep.id
2060+
role = "roles/cloudkms.cryptoKeyEncrypterDecrypter"
2061+
2062+
members = [
2063+
"serviceAccount:service-${data.google_project.project.number}@gcp-sa-cloud-sql.iam.gserviceaccount.com",
2064+
]
2065+
}
2066+
2067+
resource "google_sql_database_instance" "replica" {
2068+
name = "%{instance_name}-replica"
2069+
database_version = "MYSQL_5_7"
2070+
region = "us-east1"
2071+
master_instance_name = google_sql_database_instance.master.name
2072+
encryption_key_name = google_kms_crypto_key.key-rep.id
2073+
deletion_protection = false
2074+
2075+
settings {
2076+
tier = "db-n1-standard-1"
2077+
}
2078+
2079+
depends_on = [google_sql_database_instance.master]
2080+
}
2081+
`
18782082

18792083
func testGoogleSqlDatabaseInstance_PointInTimeRecoveryEnabled(masterID int, pointInTimeRecoveryEnabled bool) string {
18802084
return fmt.Sprintf(`

website/docs/r/sql_database_instance.html.markdown

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ includes an up-to-date reference of supported versions.
198198

199199
* `root_password` - (Optional) Initial root password. Required for MS SQL Server, ignored by MySQL and PostgreSQL.
200200

201-
* `encryption_key_name` - (Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
201+
* `encryption_key_name` - (Optional)
202202
The full path to the encryption key used for the CMEK disk encryption. Setting
203203
up disk encryption currently requires manual steps outside of Terraform.
204204
The provided key must be in the same region as the SQL instance. In order

0 commit comments

Comments
 (0)