Skip to content

Commit 1af857a

Browse files
committed
terraform build.
1 parent 824aef5 commit 1af857a

File tree

11 files changed

+252
-192
lines changed

11 files changed

+252
-192
lines changed

.gitignore

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,12 @@ replay_pid*
1919
!.vscode/*.code-snippets
2020
.history/
2121
*.vsix
22-
.idea/**/workspace.xml
23-
.idea/**/tasks.xml
24-
.idea/**/usage.statistics.xml
25-
.idea/**/dictionaries
26-
.idea/**/shelf
27-
.idea/**/aws.xml
28-
.idea/**/contentModel.xml
29-
.idea/**/dataSources/
30-
.idea/**/dataSources.ids
31-
.idea/**/dataSources.local.xml
32-
.idea/**/sqlDataSources.xml
33-
.idea/**/dynamic.xml
34-
.idea/**/uiDesigner.xml
35-
.idea/**/dbnavigator.xml
36-
.idea/**/gradle.xml
37-
.idea/**/libraries
22+
.idea/
3823
cmake-build-*/
39-
.idea/**/mongoSettings.xml
4024
*.iws
4125
out/
4226
.idea_modules/
4327
atlassian-ide-plugin.xml
44-
.idea/replstate.xml
45-
.idea/sonarlint/
4628
com_crashlytics_export_strings.xml
4729
crashlytics.properties
4830
crashlytics-build.properties
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
cloud.properties

cloud.properties.example renamed to common/utils/src/main/resources/cloud.properties.example

File renamed without changes.
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@ export CONFLUENT_CLOUD_API_KEY=<API KEY>
1717
export CONFLUENT_CLOUD_API_SECRET=<API SECRET>
1818
```
1919

20-
2120
== Execute Terraform Manifests
2221

2322
The terraform manifests require the Confluent Cloud organization ID in order to provision infrastructure.
2423
This can be found in the Confluent Cloud console in the "Organization Settings" and exported to an environment variable:
2524

25+
image::org-id.jpg[]
26+
27+
image::org-id-2.jpg[]
28+
2629
```bash
2730
export TF_VAR_org_id=<ORG ID VALUE FROM CONSOLE>
2831
```
2932

30-
This value can also be queried by using the Confluent CLI to query your account, piping the resulting to a `jq` query:
33+
This value can also be queried by using the Confluent CLI to query your account, piping the result to a `jq` query and using that value in a `TF_VAR_`:
3134

3235
```bash
3336
export TF_VAR_org_id=$(confluent organization list -o json | jq -c -r '.[] | select(.is_current)' | jq '.id')
@@ -51,7 +54,7 @@ This `terraform output` command will create a file with those parameters:
5154
```bash
5255
terraform output -json \
5356
| jq -r 'to_entries | map( {key: .key|tostring|split("_")|join("."), value: .value} ) | map("client.\(.key)=\(.value.value)") | .[]' \
54-
| while read -r line ; do echo "$line"; done > ../cloud.properties
57+
| while read -r line ; do echo "$line"; done > ../common/utils/src/main/resources/cloud.properties
5558
```
5659

5760
== Teardown

docs/org-id-2.jpg

51.2 KB
Loading

docs/org-id.jpg

30.6 KB
Loading

terraform/flink-compute.tf

Lines changed: 60 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,88 @@
1-
resource "confluent_flink_compute_pool" "main_flink_pool" {
2-
display_name = "main_flink_pool"
3-
cloud = var.cloud_provider
4-
region = var.cloud_region
5-
max_cfu = 5
1+
resource "confluent_flink_compute_pool" "compute_pool_1" {
2+
display_name = "-workshop_compute_pool_1"
3+
cloud = var.cloud_provider
4+
region = var.cloud_region
5+
max_cfu = 10
66
environment {
77
id = confluent_environment.cc_env.id
88
}
9-
}
109

11-
data "confluent_flink_region" "main_flink_region" {
12-
cloud = var.cloud_provider
13-
region = var.cloud_region
10+
lifecycle {
11+
prevent_destroy = false
12+
}
1413
}
1514

16-
resource "confluent_service_account" "flink_developer" {
17-
display_name = "${var.cc_env_name}-flink_developer"
18-
description = "Service account for flink developer"
15+
// Service account to perform a task within Confluent Cloud, such as executing a Flink statement
16+
resource "confluent_service_account" "statements-runner" {
17+
display_name = "${var.cc_env_name}-statements-runner"
18+
description = "Service account for running Flink Statements in 'inventory' Kafka cluster"
19+
20+
lifecycle {
21+
prevent_destroy = false
22+
}
1923
}
2024

21-
resource "confluent_role_binding" "fd_flink_developer" {
22-
principal = "User:${confluent_service_account.flink_developer.id}"
23-
role_name = "FlinkDeveloper"
25+
resource "confluent_role_binding" "statements-runner-environment-admin" {
26+
principal = "User:${confluent_service_account.statements-runner.id}"
27+
role_name = "EnvironmentAdmin"
2428
crn_pattern = confluent_environment.cc_env.resource_name
25-
26-
depends_on = [confluent_flink_compute_pool.main_flink_pool]
29+
lifecycle {
30+
prevent_destroy = false
31+
}
2732
}
2833

29-
resource "confluent_role_binding" "fd_kafka_write" {
30-
principal = "User:${confluent_service_account.flink_developer.id}"
31-
role_name = "DeveloperWrite"
32-
crn_pattern = "${confluent_kafka_cluster.kafka_cluster.rbac_crn}/kafka=${confluent_kafka_cluster.kafka_cluster.id}/topic=*"
33-
34-
depends_on = [confluent_kafka_cluster.kafka_cluster]
34+
// https://docs.confluent.io/cloud/current/access-management/access-control/rbac/predefined-rbac-roles.html#flinkadmin
35+
resource "confluent_role_binding" "app-manager-flink-developer" {
36+
principal = "User:${confluent_service_account.app-manager.id}"
37+
role_name = "FlinkAdmin"
38+
crn_pattern = confluent_environment.cc_env.resource_name
39+
lifecycle {
40+
prevent_destroy = false
41+
}
3542
}
3643

37-
resource "confluent_role_binding" "fd_kafka_read" {
38-
principal = "User:${confluent_service_account.flink_developer.id}"
39-
role_name = "DeveloperRead"
40-
crn_pattern = "${confluent_kafka_cluster.kafka_cluster.rbac_crn}/kafka=${confluent_kafka_cluster.kafka_cluster.id}/topic=*"
44+
data "confluent_organization" "main" {}
4145

42-
depends_on = [confluent_kafka_cluster.kafka_cluster]
46+
// https://docs.confluent.io/cloud/current/access-management/access-control/rbac/predefined-rbac-roles.html#assigner
47+
// https://docs.confluent.io/cloud/current/flink/operate-and-deploy/flink-rbac.html#submit-long-running-statements
48+
resource "confluent_role_binding" "app-manager-assigner" {
49+
principal = "User:${confluent_service_account.app-manager.id}"
50+
role_name = "Assigner"
51+
crn_pattern = "${data.confluent_organization.main.resource_name}/service-account=${confluent_service_account.statements-runner.id}"
52+
lifecycle {
53+
prevent_destroy = false
54+
}
4355
}
4456

45-
resource "confluent_role_binding" "fd_schema_registry_write" {
46-
principal = "User:${confluent_service_account.flink_developer.id}"
47-
role_name = "DeveloperWrite"
48-
crn_pattern = "${data.confluent_schema_registry_cluster.advanced.resource_name}/subject=*"
57+
data "confluent_flink_region" "us-east-2" {
58+
cloud = var.cloud_provider
59+
region = var.cloud_region
4960
}
5061

51-
resource "confluent_role_binding" "fd_schema_registry_read" {
52-
principal = "User:${confluent_service_account.flink_developer.id}"
53-
role_name = "DeveloperRead"
54-
crn_pattern = "${data.confluent_schema_registry_cluster.advanced.resource_name}/subject=*"
62+
data "confluent_flink_region" "main" {
63+
cloud = var.cloud_provider
64+
region = var.cloud_region
5565
}
5666

57-
resource "confluent_api_key" "flink_developer_api_key" {
58-
display_name = "flink_developer_api_key"
59-
description = "Flink Developer API Key that is owned by 'flink_developer' service account"
67+
68+
resource "confluent_api_key" "app-manager-flink-api-key" {
69+
display_name = "app-manager-flink-api-key"
70+
description = "Flink API Key that is owned by 'app-manager' service account"
6071
owner {
61-
id = confluent_service_account.flink_developer.id
62-
api_version = confluent_service_account.flink_developer.api_version
63-
kind = confluent_service_account.flink_developer.kind
72+
id = confluent_service_account.app-manager.id
73+
api_version = confluent_service_account.app-manager.api_version
74+
kind = confluent_service_account.app-manager.kind
6475
}
65-
6676
managed_resource {
67-
id = data.confluent_flink_region.main_flink_region.id
68-
api_version = data.confluent_flink_region.main_flink_region.api_version
69-
kind = data.confluent_flink_region.main_flink_region.kind
70-
77+
id = data.confluent_flink_region.us-east-2.id
78+
api_version = confluent_flink_compute_pool.compute_pool_1.api_version
79+
kind = data.confluent_flink_region.us-east-2.kind
7180
environment {
7281
id = confluent_environment.cc_env.id
7382
}
7483
}
84+
lifecycle {
85+
prevent_destroy = false
86+
}
87+
}
7588

76-
depends_on = [
77-
confluent_service_account.flink_developer
78-
]
79-
}

terraform/kafka.tf

Lines changed: 74 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
1+
# Update the config to use a cloud provider and region of your choice.
2+
# https://registry.terraform.io/providers/confluentinc/confluent/latest/docs/resources/confluent_kafka_cluster
13
resource "confluent_kafka_cluster" "kafka_cluster" {
24
display_name = var.cc_default_kafka_cluster_name
35
availability = "SINGLE_ZONE"
46
cloud = var.cloud_provider
57
region = var.cloud_region
6-
standard {}
8+
basic {}
79
environment {
810
id = confluent_environment.cc_env.id
911
}
1012

1113
depends_on = [confluent_environment.cc_env]
1214
}
1315

14-
# ---------------------------------------------------------------------------
15-
# API KEY and Role for Administration of Kafka
16-
# ---------------------------------------------------------------------------
17-
resource "confluent_service_account" "kafka_manager" {
18-
display_name = "${var.cc_env_name}-kafka_manager"
16+
data "confluent_schema_registry_cluster" "advanced" {
17+
environment {
18+
id = confluent_environment.cc_env.id
19+
}
20+
depends_on = [confluent_kafka_cluster.kafka_cluster]
21+
}
22+
23+
// 'app-manager' service account is required in this configuration to create 'purchase' topic and grant ACLs
24+
// to 'app-producer' and 'app-consumer' service accounts.
25+
resource "confluent_service_account" "app-manager" {
26+
display_name = "${var.cc_default_kafka_cluster_name}-app-manager"
1927
description = "Service account to manage Kafka cluster"
2028
}
2129

22-
resource "confluent_role_binding" "kafka_manager_kafka_cluster_admin" {
23-
principal = "User:${confluent_service_account.kafka_manager.id}"
30+
resource "confluent_role_binding" "app-manager-kafka-cluster-admin" {
31+
principal = "User:${confluent_service_account.app-manager.id}"
2432
role_name = "CloudClusterAdmin"
2533
crn_pattern = confluent_kafka_cluster.kafka_cluster.rbac_crn
2634
}
2735

28-
resource "confluent_api_key" "kafka_manager_kafka_api_key" {
29-
display_name = "kafka_manager_kafka_api_key"
30-
description = "Kafka API Key that is owned by 'kafka_manager' service account"
36+
resource "confluent_api_key" "app-manager-kafka-api-key" {
37+
display_name = "app-manager-kafka-api-key"
38+
description = "Kafka API Key that is owned by 'app-manager' service account"
3139
owner {
32-
id = confluent_service_account.kafka_manager.id
33-
api_version = confluent_service_account.kafka_manager.api_version
34-
kind = confluent_service_account.kafka_manager.kind
40+
id = confluent_service_account.app-manager.id
41+
api_version = confluent_service_account.app-manager.api_version
42+
kind = confluent_service_account.app-manager.kind
3543
}
3644

3745
managed_resource {
@@ -44,54 +52,76 @@ resource "confluent_api_key" "kafka_manager_kafka_api_key" {
4452
}
4553
}
4654

55+
# The goal is to ensure that confluent_role_binding.app-manager-kafka-cluster-admin is created before
56+
# confluent_api_key.app-manager-kafka-api-key is used to create instances of
57+
# confluent_kafka_topic, confluent_kafka_acl resources.
58+
59+
# 'depends_on' meta-argument is specified in confluent_api_key.app-manager-kafka-api-key to avoid having
60+
# multiple copies of this definition in the configuration which would happen if we specify it in
61+
# confluent_kafka_topic, confluent_kafka_acl resources instead.
4762
depends_on = [
48-
confluent_environment.cc_env,
49-
confluent_role_binding.kafka_manager_kafka_cluster_admin
63+
confluent_role_binding.app-manager-kafka-cluster-admin
5064
]
5165
}
5266

53-
# ---------------------------------------------------------------------------
54-
# API KEY and Role for Developers on Kafka
55-
# ---------------------------------------------------------------------------
56-
57-
resource "confluent_service_account" "kafka_developer" {
58-
display_name = "${var.cc_env_name}-kafka_developer"
59-
description = "Service account for developer using Kafka cluster"
67+
resource "confluent_service_account" "env-manager" {
68+
display_name = "${var.cc_default_kafka_cluster_name}-env-manager"
69+
description = "Service account to manage 'Staging' environment"
6070
}
6171

62-
resource "confluent_role_binding" "kafka_developer_read_all_topics" {
63-
principal = "User:${confluent_service_account.kafka_manager.id}"
64-
role_name = "DeveloperRead"
65-
crn_pattern = "${confluent_kafka_cluster.kafka_cluster.rbac_crn}/kafka=${confluent_kafka_cluster.kafka_cluster.id}/topic=*"
72+
resource "confluent_role_binding" "env-manager-environment-admin" {
73+
principal = "User:${confluent_service_account.env-manager.id}"
74+
role_name = "EnvironmentAdmin"
75+
crn_pattern = confluent_environment.cc_env.resource_name
6676
}
6777

68-
resource "confluent_role_binding" "kafka_developer_write_all_topics" {
69-
principal = "User:${confluent_service_account.kafka_manager.id}"
70-
role_name = "DeveloperWrite"
71-
crn_pattern = "${confluent_kafka_cluster.kafka_cluster.rbac_crn}/kafka=${confluent_kafka_cluster.kafka_cluster.id}/topic=*"
72-
}
73-
74-
resource "confluent_api_key" "kafka_developer_kafka_api_key" {
75-
display_name = "kafka_developer_kafka_api_key"
76-
description = "Kafka API Key that is owned by 'kafka_developer' service account"
78+
resource "confluent_api_key" "env-manager-schema-registry-api-key" {
79+
display_name = "env-manager-schema-registry-api-key"
80+
description = "Schema Registry API Key that is owned by 'env-manager' service account"
7781
owner {
78-
id = confluent_service_account.kafka_developer.id
79-
api_version = confluent_service_account.kafka_developer.api_version
80-
kind = confluent_service_account.kafka_developer.kind
82+
id = confluent_service_account.env-manager.id
83+
api_version = confluent_service_account.env-manager.api_version
84+
kind = confluent_service_account.env-manager.kind
8185
}
8286

8387
managed_resource {
84-
id = confluent_kafka_cluster.kafka_cluster.id
85-
api_version = confluent_kafka_cluster.kafka_cluster.api_version
86-
kind = confluent_kafka_cluster.kafka_cluster.kind
88+
id = data.confluent_schema_registry_cluster.advanced.id
89+
api_version = data.confluent_schema_registry_cluster.advanced.api_version
90+
kind = data.confluent_schema_registry_cluster.advanced.kind
8791

8892
environment {
8993
id = confluent_environment.cc_env.id
9094
}
9195
}
9296

97+
# The goal is to ensure that confluent_role_binding.env-manager-environment-admin is created before
98+
# confluent_api_key.env-manager-schema-registry-api-key is used to create instances of
99+
# confluent_schema resources.
100+
101+
# 'depends_on' meta-argument is specified in confluent_api_key.env-manager-schema-registry-api-key to avoid having
102+
# multiple copies of this definition in the configuration which would happen if we specify it in
103+
# confluent_schema resources instead.
93104
depends_on = [
94-
confluent_role_binding.kafka_developer_read_all_topics,
95-
confluent_role_binding.kafka_developer_write_all_topics
105+
confluent_role_binding.env-manager-environment-admin,
106+
data.confluent_schema_registry_cluster.advanced
96107
]
97108
}
109+
110+
resource "confluent_schema_registry_cluster_config" "schema_registry_cluster_config" {
111+
schema_registry_cluster {
112+
id = data.confluent_schema_registry_cluster.advanced.id
113+
}
114+
rest_endpoint = data.confluent_schema_registry_cluster.advanced.rest_endpoint
115+
compatibility_level = "BACKWARD"
116+
credentials {
117+
key = confluent_api_key.env-manager-schema-registry-api-key.id
118+
secret = confluent_api_key.env-manager-schema-registry-api-key.secret
119+
}
120+
121+
depends_on = [data.confluent_schema_registry_cluster.advanced,
122+
confluent_api_key.env-manager-schema-registry-api-key]
123+
124+
lifecycle {
125+
prevent_destroy = false
126+
}
127+
}

0 commit comments

Comments
 (0)