From c53b75568451d1baa472476834b7dce610f08cf5 Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Tue, 18 May 2021 19:30:21 +0300 Subject: [PATCH 01/19] Adding data-platform-foundations code --- .../data-platform-foundations/README.md | 49 ++++++ .../data-pipeline/README.md | 8 + .../data-pipeline/gcs_to_bigquery.md | 151 ++++++++++++++++++ .../data-pipeline/pubsub_to_bigquery.md | 96 +++++++++++ .../data-pipeline/resource/raw_data.json | 26 +++ .../img/Data_Foundation-phase1.png | Bin 0 -> 23106 bytes .../img/Data_Foundation-phase2.png | Bin 0 -> 37496 bytes ...Foundation_Multiple_project_Single_VPC.png | Bin 0 -> 36756 bytes .../img/three_main_workflows.png | Bin 0 -> 49219 bytes .../infra/tf-phase1/00_generic_variables.tf | 30 ++++ .../infra/tf-phase1/01_services_project.tf | 70 ++++++++ .../infra/tf-phase1/01_services_variables.tf | 25 +++ .../infra/tf-phase1/02_landing_project.tf | 57 +++++++ .../infra/tf-phase1/02_landing_variables.tf | 20 +++ .../tf-phase1/03_transformation_project.tf | 60 +++++++ .../tf-phase1/03_transformation_variables.tf | 20 +++ .../infra/tf-phase1/04_dwh_project.tf | 59 +++++++ .../infra/tf-phase1/04_dwh_variables.tf | 20 +++ .../infra/tf-phase1/05_datamart_project.tf | 62 +++++++ .../infra/tf-phase1/05_datamart_variables.tf | 20 +++ .../infra/tf-phase1/README.md | 87 ++++++++++ .../infra/tf-phase1/main.tf | 23 +++ .../infra/tf-phase1/outputs.tf | 40 +++++ .../infra/tf-phase1/versions.tf | 17 ++ .../infra/tf-phase2/01_services.tf | 40 +++++ .../infra/tf-phase2/01_services_variables.tf | 29 ++++ .../infra/tf-phase2/02_landing.tf | 86 ++++++++++ .../infra/tf-phase2/02_landing_variables.tf | 82 ++++++++++ .../infra/tf-phase2/03_transformation.tf | 76 +++++++++ .../tf-phase2/03_transformation_variables.tf | 63 ++++++++ .../infra/tf-phase2/04_dwh.tf | 59 +++++++ .../infra/tf-phase2/04_dwh_variables.tf | 40 +++++ .../infra/tf-phase2/05_datamart.tf | 65 ++++++++ .../infra/tf-phase2/05_datamart_variables.tf | 40 +++++ .../infra/tf-phase2/README.md | 93 +++++++++++ .../infra/tf-phase2/main.tf | 19 +++ .../infra/tf-phase2/outputs.tf | 20 +++ .../infra/tf-phase2/versions.tf | 17 ++ .../manageing_multiple_environments.md | 27 ++++ 39 files changed, 1696 insertions(+) create mode 100644 data-solutions/data-platform-foundations/README.md create mode 100644 data-solutions/data-platform-foundations/data-pipeline/README.md create mode 100644 data-solutions/data-platform-foundations/data-pipeline/gcs_to_bigquery.md create mode 100644 data-solutions/data-platform-foundations/data-pipeline/pubsub_to_bigquery.md create mode 100644 data-solutions/data-platform-foundations/data-pipeline/resource/raw_data.json create mode 100644 data-solutions/data-platform-foundations/img/Data_Foundation-phase1.png create mode 100644 data-solutions/data-platform-foundations/img/Data_Foundation-phase2.png create mode 100644 data-solutions/data-platform-foundations/img/Data_Foundation_Multiple_project_Single_VPC.png create mode 100644 data-solutions/data-platform-foundations/img/three_main_workflows.png create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/00_generic_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/01_services_project.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_project.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_project.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_project.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_project.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/README.md create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/main.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/versions.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/01_services.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/01_services_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/02_landing.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/README.md create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/main.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/versions.tf create mode 100644 data-solutions/data-platform-foundations/manageing_multiple_environments.md diff --git a/data-solutions/data-platform-foundations/README.md b/data-solutions/data-platform-foundations/README.md new file mode 100644 index 000000000..269e506a5 --- /dev/null +++ b/data-solutions/data-platform-foundations/README.md @@ -0,0 +1,49 @@ +# Data Platform Foundations + +## General + +The goal of this project is to Build a **robust and flexible** Data Foundation on GCP that provides **opinionated defaults** while allowing customers to **build and scale** out additional data pipelines **quickly and reliably**. + +There are three provisioning workflows to enable an end to end Foundational Data Platform along with Data Pipelines on top of it. This is represented in the diagram below. + +![Three Main Workflows](./img/three_main_workflows.png) + +## Target architecture + +![Target architecture](./img/Data_Foundation-phase2.png) + +In this example we will create the infrastructure needed for the foundational build and run a demo pipeline. + +## Before you begine + +Since this example is intended for the data infra engineers we do expect that an initial organization / folder and service account with owner privileges will be pre-created and provided as variables. + +This example assume the next items were already created and provided: + +- Organization / folder +- Terraform runner Service account with owner permissions on the above organization / folder + +## Building the Platform + +Building the platform is composed of 4 steps: + +1) [(Optional) Managed resources and services](./manageing_multiple_environments.md) +1) [Data Platform Foundations - Phase 1: Building the projects](./infra/tf-phase1/README.md) +1) [Data Platform Foundations - Phase 2: Deploy assets](./infra/tf-phase2/README.md) +1) [(Optional) Manual pipeline Example](./data-pipeline/README.md) + +## TODO list + +| Description | Priority (1:High - 5:Low ) | Status | Remarks | +|-------------|----------|:------:|---------| +| DLP best practices in the pipeline | 2 | Not Started | | +| KMS support (CMEK) | 2 | Not Started | | +| VPC-SC | 3 | Not Started | | +| Add Composer with a static DAG running the example | 3 | Not Started | | +| Integrate [CI/CD composer data processing workflow framework](https://github.com/jaketf/ci-cd-for-data-processing-workflow) | 3 | Not Started | | +| Schema changes, how to handle | 4 | Not Started | | +| Data lineage | 4 | Not Started | | +| Data quality checks | 4 | Not Started | | +| Shared-VPC | 5 | Not Started | | +| Logging & monitoring | TBD | Not Started | | +| Orcestration for ingestion pipeline (just in the readme) | TBD | Not Started | | diff --git a/data-solutions/data-platform-foundations/data-pipeline/README.md b/data-solutions/data-platform-foundations/data-pipeline/README.md new file mode 100644 index 000000000..52662ee25 --- /dev/null +++ b/data-solutions/data-platform-foundations/data-pipeline/README.md @@ -0,0 +1,8 @@ +# Manual pipeline Example + +Once you deployed projects [step 1](../infra/tf-phase1/README.md) and resources [step 1](../infra/tf-phase2/README.md) you can use it to run your data pipeline. + +Here we will demo 2 pipelines: + +* [GCS to Bigquery](./gcs_to_bigquery.md) +* [PubSub to Bigquery](./pubsub_to_bigquery.md) diff --git a/data-solutions/data-platform-foundations/data-pipeline/gcs_to_bigquery.md b/data-solutions/data-platform-foundations/data-pipeline/gcs_to_bigquery.md new file mode 100644 index 000000000..785bc0b0c --- /dev/null +++ b/data-solutions/data-platform-foundations/data-pipeline/gcs_to_bigquery.md @@ -0,0 +1,151 @@ +# Manual pipeline Example: GCS to Bigquery + +In this example we will publish person message in the following format: + +```bash +Lorenzo,Caggioni,1617898199 +``` + +a Dataflow pipeline will read those messages and import them into a Bigquery table in the DWH project. + +[TODO] An autorized view will be created in the datamart project to expose the table. +[TODO] Remove hardcoded 'lcaggio' variables and made ENV variable for it. +[TODO] Further automation is expected in future. + +Create and download keys for Service accounts you created. + +## Create BQ table + +Those steps should be done as Transformation Service Account: + +```bash +gcloud auth activate-service-account sa-dwh@dwh-lc01.iam.gserviceaccount.com --key-file=sa-dwh.json --project=dwh-lc01 +``` + +and you can run the command to create a table: + +```bash +bq mk \ +-t \ +--description "This is a Test Person table" \ +dwh-lc01:bq_raw_dataset.person \ +name:STRING,surname:STRING,timestamp:TIMESTAMP +``` + +## Produce CSV data file, JSON schema file and UDF JS file + +Those steps should be done as landing Service Account: + +```bash +gcloud auth activate-service-account sa-landing@landing-lc01.iam.gserviceaccount.com --key-file=sa-landing.json --project=landing-lc01 +``` + +Let's now create a series of messages we can use to import: + +```bash +for i in {0..10} +do + echo "Lorenzo,Caggioni,$(date +%s)" >> person.csv +done +``` + +and copy files to the GCS bucket: + +```bash +gsutil cp person.csv gs://landing-lc01-eu-raw-data +``` + +Let's create the data JSON schema: + +```bash +cat <<'EOF' >> person_schema.json +{ + "BigQuery Schema": [ + { + "name": "name", + "type": "STRING" + }, + { + "name": "surname", + "type": "STRING" + }, + { + "name": "timestamp", + "type": "TIMESTAMP" + } + ] +} +EOF +``` + +and copy files to the GCS bucket: + +```bash +gsutil cp person_schema.json gs://landing-lc01-eu-data-schema +``` + +Let's create the data UDF function to transform message data: + +```bash +cat <<'EOF' >> person_udf.js +function transform(line) { + var values = line.split(','); + + var obj = new Object(); + obj.name = values[0]; + obj.surname = values[1]; + obj.timestamp = values[2]; + var jsonString = JSON.stringify(obj); + + return jsonString; +} +EOF +``` + +and copy files to the GCS bucket: + +```bash +gsutil cp person_udf.js gs://landing-lc01-eu-data-schema +``` + +if you want to check files copied to GCS, you can use the Transformation service account: + +```bash +gcloud auth activate-service-account sa-transformation@transformation-lc01.iam.gserviceaccount.com --key-file=sa-transformation.json --project=transformation-lc01 +``` + +and read a message (message won't be acked and will stay in the subscription): + +```bash +gsutil ls gs://landing-lc01-eu-raw-data +gsutil ls gs://landing-lc01-eu-data-schema +``` + +## Dataflow + +Those steps should be done as transformation Service Account: + +```bash +gcloud auth activate-service-account sa-transformation@transformation-lc01.iam.gserviceaccount.com --key-file=sa-transformation.json --project=transformation-lc01 +``` + +Let's than start a Dataflwo batch pipeline using a Google provided template using internal only IPs, the created network and subnetwork, the appropriate service account and requested parameters: + +```bash +gcloud dataflow jobs run test_batch_lcaggio01 \ + --gcs-location gs://dataflow-templates/latest/GCS_Text_to_BigQuery \ + --project transformation-lc01 \ + --region europe-west3 \ + --disable-public-ips \ + --network transformation-vpc \ + --subnetwork regions/europe-west3/subnetworks/transformation-subnet \ + --staging-location gs://transformation-lc01-eu-temp \ + --service-account-email sa-transformation@transformation-lc01.iam.gserviceaccount.com \ + --parameters \ +javascriptTextTransformFunctionName=transform,\ +JSONPath=gs://landing-lc01-eu-data-schema/person_schema.json,\ +javascriptTextTransformGcsPath=gs://landing-lc01-eu-data-schema/person_udf.js,\ +inputFilePattern=gs://landing-lc01-eu-raw-data/person.csv,\ +outputTable=dwh-lc01:bq_raw_dataset.person,\ +bigQueryLoadingTemporaryDirectory=gs://transformation-lc01-eu-temp +``` diff --git a/data-solutions/data-platform-foundations/data-pipeline/pubsub_to_bigquery.md b/data-solutions/data-platform-foundations/data-pipeline/pubsub_to_bigquery.md new file mode 100644 index 000000000..5778258e4 --- /dev/null +++ b/data-solutions/data-platform-foundations/data-pipeline/pubsub_to_bigquery.md @@ -0,0 +1,96 @@ +# Manual pipeline Example: PubSub to Bigquery + +In this example we will publish person message in the following format: + +```txt +name: Lorenzo +surname: Caggioni +timestamp: 1617898199 +``` + +a Dataflow pipeline will read those messages and import them into a Bigquery table in the DWH project. + +An autorized view will be created in the datamart project to expose the table. + +[TODO] Remove hardcoded 'lcaggio' variables and made ENV variable for it. +[TODO] Further automation is expected in future. + +Create and download keys for Service accounts you created, be sure to have `iam.serviceAccountKeys.create` permission on projects or at folder level. + +```bash +gcloud iam service-accounts keys create sa-landing.json --iam-account=sa-landing@landing-lc01.iam.gserviceaccount.com +gcloud iam service-accounts keys create sa-transformation.json --iam-account=sa-transformation@transformation-lc01.iam.gserviceaccount.com +gcloud iam service-accounts keys create sa-dwh.json --iam-account=sa-dwh@dwh-lc01.iam.gserviceaccount.com +``` + +## Create BQ table + +Those steps should be done as Transformation Service Account: + +```bash +gcloud auth activate-service-account sa-dwh@dwh-lc01.iam.gserviceaccount.com --key-file=sa-dwh.json --project=dwh-lc01 +``` + +and you can run the command to create a table: + +```bash +bq mk \ +-t \ +--description "This is a Test Person table" \ +dwh-lc01:bq_raw_dataset.person \ +name:STRING,surname:STRING,timestamp:TIMESTAMP +``` + +## Produce PubSub messages + +Those steps should be done as landing Service Account: + +```bash +gcloud auth activate-service-account sa-landing@landing-lc01.iam.gserviceaccount.com --key-file=sa-landing.json --project=landing-lc01 +``` + +and let's now create a series of messages we can use to import: + +```bash +for i in {0..10} +do + gcloud pubsub topics publish projects/landing-lc01/topics/landing-1 --message="{\"name\": \"Lorenzo\", \"surname\": \"Caggioni\", \"timestamp\": \"$(date +%s)\"}" +done +``` + +if you want to check messages published, you can use the Transformation service account: + +```bash +gcloud auth activate-service-account sa-transformation@transformation-lc01.iam.gserviceaccount.com --key-file=sa-transformation.json --project=transformation-lc01 +``` + +and read a message (message won't be acked and will stay in the subscription): + +```bash +gcloud pubsub subscriptions pull projects/landing-lc01/subscriptions/sub1 +``` + +## Dataflow + +Those steps should be done as transformation Service Account: + +```bash +gcloud auth activate-service-account sa-transformation@transformation-lc01.iam.gserviceaccount.com --key-file=sa-transformation.json --project=transformation-lc01 +``` + +Let's than start a Dataflwo streaming pipeline using a Google provided template using internal only IPs, the created network and subnetwork, the appropriate service account and requested parameters: + +```bash +gcloud dataflow jobs run test_lcaggio01 \ + --gcs-location gs://dataflow-templates/latest/PubSub_Subscription_to_BigQuery \ + --project transformation-lc01 \ + --region europe-west3 \ + --disable-public-ips \ + --network transformation-vpc \ + --subnetwork regions/europe-west3/subnetworks/transformation-subnet \ + --staging-location gs://transformation-lc01-eu-temp \ + --service-account-email sa-transformation@transformation-lc01.iam.gserviceaccount.com \ + --parameters \ +inputSubscription=projects/landing-lc01/subscriptions/sub1,\ +outputTableSpec=dwh-lc01:bq_raw_dataset.person +``` diff --git a/data-solutions/data-platform-foundations/data-pipeline/resource/raw_data.json b/data-solutions/data-platform-foundations/data-pipeline/resource/raw_data.json new file mode 100644 index 000000000..d1b25ea9a --- /dev/null +++ b/data-solutions/data-platform-foundations/data-pipeline/resource/raw_data.json @@ -0,0 +1,26 @@ +{ + "schema": { + "fields": [ + { + "mode": "NULLABLE", + "name": "name", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "surname", + "type": "STRING" + }, + { + "mode": "NULLABLE", + "name": "age", + "type": "INTEGER" + }, + { + "mode": "NULLABLE", + "name": "boolean_val", + "type": "BOOLEAN" + } + ] + } +} diff --git a/data-solutions/data-platform-foundations/img/Data_Foundation-phase1.png b/data-solutions/data-platform-foundations/img/Data_Foundation-phase1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6ecc4a59b3ced342ee78b1a35b8f9ef27d82c30 GIT binary patch literal 23106 zcmeHvcUV)~wl4^Rh=3iHW)1VvyYQlv$C6cLmXrMHj` zC`e62I-!#gN)jMI2qnCQ@9uNl=X&n@zWd(!-hKC(KLTrJtu@CS!vQ> z?qj>z*x2~=u3f&(#>Vjn8`}=yT|0o0GOb(EY;2Z1dY3Pn_}R{3oMKN;`=g);?|nsD zOS=1>Rj6?&;kOjUp1?X%P;Y_7LBd1CR8p$B7hUnuY3+-0yAE*QBC>8Va$84euL zaLu9k4NhP(smU2DkR?arbyv#zjgHCkYu@mY4*I79zrWAV&!5>G9)O*BVM8~hvI8Wr zX}ho@hPVG=WBa-n|NZab|Ehoej^f?;@=pSvakHxRjW9@ yJT8x(ErOTHue<~<} zY^7|E?Krj%_=thn(?f%=ZvWC`pzU-5wLQ47upe)+%NZEF98|;UefWQUsv0(}+~i~6 z4Z?-0wT8Ecytu7Kge>_4j;tZYTS=N_tSbwP{Z^?YU!t6dlwqm({HfyrdGW`$=Psj< z2+Fn!`4uCU8(ws8A{Ds|3lU%YB$jmBr51B5ZTx2%uMX8JsN5xI3X1Q=-yWk&yab?T8HgISpPYzPeUE@)ZVGWlqYMNsPJ zNCp~pS%@NgJ>Pg;#K7wi(;WkZ)d|w*t;K`>uL+x$-9;`uVr%}hE#^{5Tdu4)VWygo zl!GxCy*z~Aup@}p=ubbGm+TK_nNd8OCkMDs044(wieap^wlbL@97oCBMVX7J<+y9vE}mqkW+h{RThbZsh+uE9AJq;x7^^u zAwg^Tlhua|^F^?=C&J^9ytovsT1kM@LpiVPmVxmZ3|8{SXpJ(UMgcP4#bms5$tztd z9L*WEz8RLNCAF(eeW=!R^!5khl&jSKZ(|TGh%FCJ+@R7|bn}ys$bNirWNI&IM|Lo_ z0;bnux@IN1*100yzlvE)4Ch)RERqD}oFXF|do2aftqaIrDw1lKID~yVk$0$d?A532 z(!ecQI=}eu4ZK(CgIV8140xp&^gt_RlFDP z`#u<+h47hk*_(o$yYu4UFbr-_3ynJe&Wpn`U}>p6Dxz3O7Y$juJ{#Pj!Lcd$xz!*~ zObjuz(I|z<6X0_`H{{+L{k1##)a=$rZzgqdQ>Gt`awx|LDn;82lGSQ!%RFdX?cT+^ z$=GvStG8a)I590I`J6^_gfFtvVu#oP+sVAnLzd<&NtZ-P;9P^w3tMY?c){sH-4_#C z`O7SoX%}ro_FcUcW%c!S+nX=L-UqYdMGU0CjMG^S)l*K2h_0H&9&L9O-3oC@6kt>( zRdAYAvUxL?_w1|X&gRjRd>;3f$Jk{IUzqPP%tS0?W#@UNj=VdyZMR0>4Hz&1%Q!~j zaJNlPFT-xPtTb!lIydrqp#~tW$(F{Y(se-}>&jwgOjO-xA!w4K_>;_8%Sz?yWDTV7 zBU_FkPiLFx4b0jhmC@-`A-jRvrI5zNdscN;XhPR0;4YT*O zkv9q`m3xJ;(|6A=jO`RvA}JA-_b&mAtBxsX^}hIw~Fkum)&DC;$9^N_M`}Km1o}&zilN@fbGLb z8l?tm>-Eid`Iwy}#rPJq7VWUOpQDka@kXHDzA+LCwkFPA5_F0wLdyIbzSpKW}+tE2*7 z<%4QHGTvUxNln`ws=Vw`+oLha;Eqe$r+~rn ziU0Jewp{Yt?nT@3f9+mGKX3wP#wvorLA*_{UCsh`wvVp~Z4*Rc4}fobt}@~O-6PjK z$_OfT{*Uyq8MRU(bl@0`nr>O+VME)VY+iZSwz6}RnNdykL<298_F~ZHeUcTzYXY>j zM6wH-CfRNE7a&%v2WeOjsHgWmQWAXIscXxBhd_>{jmEpIu82XkVGI*#SG!QXHMNY} zY?Ro*ZnZ~t3&0)xemlNx@uH|HhKICuWl-R{ zni4B>1j}M>$($vPFts2-Oa_F-6dPKtceCBv*n-b75L*pcINgbsHly)DS*;wExuHiT zRC>9r`GKvR;P;xt)pkEKkP28|!=-D1^a`MxCe~F!{&(G1$sZqX{?QOCn4X-h;YFHj zj?bBl7z>Qu!YIheDJkVJ%Eo#Mj!lq@f(rPL>FgoD9}tG39*tZmc~v{7p_yPQGZi+tm$Gk%g+v z#$bx8U%y{zFCU@JidFb6bQXhZJA1WqGY_OPnanBMpzNwLTP=WKHkG~GTM_|0eSH_z z)yCXGn4r6UPXjs zYAThAo1$&1eMxhb;9hhqznolgpx2Hy>QMFK>l|EKqHeJvPo~etr)H#GVAh-b+x!)= zfHGKBGv*Rm9emFH@QKFu_?(-WT8J^~5OaQd{|J;y!2U7OK}b`-P$L79K>Mt<9c6m# za%N)-Zo0G$jT+iGw}ZS;Bu=m}nuP{qwwRVUMAGccC#-E%XX#5GLVxAwUMoTPR4D2d zVk?`O^XM?Y=G>*|kZ^wN{Nk*b3l8heT)ZEf+F9G14b#D;t0Cw;GI~?P=^SE|vwpMb z0*jIQ(5PsG4E>k-H2s*`b=C@0tIyWB*L{+F!T(;roo}Dft&NpxvBL)w&3d|gyqB+W zhO^7W@W(u-egVbl97;?wqzuQmdz>4kW@zg9H;)_EeBRR^oK!SY3`H2}`P<%$=o=XJ z*=&sJ?;l)_l4*Jy19H5yLH;=XKBekIu~4d&7QyJ&o!e$sBdc^fbzN-^Ha7KRe?nDO zh0k3FhG5SctMzyaH*3AS8CP(fMV%SN-VxcDlG3d$_M5$X1b=Ce8j2?BX>jvxhNIgA z`K1Xpn5AZWnP|hCn{$G=MDw0&P+7;t@^bW6Izw~!P=q2yZ(QwwL)yZ0o~?W~FKhl9Ervz3YydiT$W+0tmd=tG9^t4DPGa~j zc1;5cVr*+rRZ~@X(KffTbhEKN)pO%<-Pq^0b5pFkF&cbJ*E0)Ky#CH9BM; zuv>zTtZB0I{fH}3cbV3#nJ-(XmurT%Mhb;l)!9<%2EA*@m@QA{CticwxJWU(Spa$O z;~t074uXPMmHrROnWi9Nl}s4i=MrQ4sVeU z&}i)Uv<>82y|Pzv>Adj${#xxa6wg2Cg0e5!HPqDB8!|O*tVYgS9X@=xBTZ$ULfeWB z<^quaZ@%N|hoJG~?#GD3X>ifaOr)$*_~#mVsD}sj5kw=rtsMlRS#5+MLxNdX>*@)A!eQ7R9|$@QDH>&tzy47Up=-2a#q^do8Ui{4StT zt4ySAD@ZaiSX4wvAm-Ew(V&Q?S-0Ai#zD85P1{wN7gE+HNgl^lB0LjSJ{mO!(LfjxgN{AMo2!3>}HX25qiIanq>wfHsJk-#GfnNkD`xIFXXcVN)f`4bp8TO~5A05hmNggdo0v6x-;IW&9| zGRomdm97~np65n$ntKEl--WwaaxbN;L8}7S;jG9hO+p6f!ZFtPXj@y`r!J~_Ii{3S z0Id#On{2G6Ax`s1@xdm^AA8F%GD0)QQV>hua;h>3I;Z8x0MLF`I9?Te;y;EH~=n1-rGyb2xjlE*G$$SDKyE*m4aE*0VF zuF|zS+12kgC5{?Ys}@QfJYCcvFHkSVL)1^7F}{6yw~?Wj8@Y`vn3YmDIPxDXtjJ0ufCq%cR|nz>UT*Hkp2)K6+0 zJr=J|rBVVJA(Z{?ICVx`7k#Cs{_Dqx4aEq1k~%+(Du*x7Sp9oI3O zF@Rw-i0mAr?a;qtKl`7 zL(tQaw*6-?QsI1PNB$SRRq)NQ%k*_IqMj0>LSt)F0D2IaL>okm4wQl&61xLeD4EIW ziO-YDQ_OE|7}?(I>shQiU|dc7pa%H17ReSV@acA9@Ki@8PD+}2ybpby@WM`A`Jgpv zdsl4q=Uzgnxqk6;iqHhsn6L)g%3XsZvc?UzW*%dWR-CqaQ`6>R=6cTb}fdkKsXT zgr;jD8Cds=yM2Q0&j0|@kJV9|Y>Y|`=NC&(8<5k0-FI|UB=|9?L%f2r)Zt<%V;C0q zo_@3=L!%t*?Gkj~^ARJ1RrjiQ*l)cZI*j$1?V0}O^d>`4t~dO;n3k+SD|_)sPg-Qn z0hQm?ZH6P}yy%YeAKuGPD)>^&vV(PKaLa3FWPSmWhXA@k%U~&qu z&?mvZb~}z`okm@#<@7%JJ-X}VlIz7QET?31vQug~<*({#+XwNGFCX9DC8PNq3txd} z6byKF48VZN;({Aj_v0h9w_SvtP@A<*Zx_G<&XRRtGI92(1##4Y$N!T*|M>-4_CyWF zL($ZhDn+#yu(QzhnYIe1b-#tEW#w{g_;n=Yd2`32CrQUlc0^cg2CQ6EZVbs(>wzxb zDzA)*0cefT=oq`fQYokjgzi~V?yyl zUIMlbvh)Ni6>jDpvZHn;I8UwHGF72^^U}IRncZ(0FJaWrzL?Ed8F2SpITiF1Ko)=J zS!=)q;jS(JmC&7mjg~Zrab;-W#fz-@4z5J3Q_M<>j&ZeRTSLlK)G5XBV!oL%`4NjwFJsy#L!50c7_`MNLyp_V|Mz7w^w%V z?9b{(A~S`A6QazoUY&%PySi2wS{S{UJKPvx2g9g)!`(krE3TU3nQg4`&tqeRoFGMS zIaGLFYq7zZgu{pD+;Zb6>&GO$$^{Qi#`K!zPOX?EwdjPWyl-zvIZT{#iZL^`_MUu! z8?docxnm={&rLG{rK3Q!FI@}wy!@lKS~LVhAi2sOAJ$hN7dEbqj(F$rGoG@`gdT&q zy+_AZ>#lfDYAP)UXJC|r=o_*BCV6FcjlTZ#8vS0*CB^cqbOTnpvHd-5sJvT=6o_4vZIrpHNs($2?{t9*Vv~}yj z;H1jhZCJ0vV}z80m}z57|!4V@Fl->jy=Jw;vT% z9LFBlqIrW|kKk`)Unzo>l)Zj)oIEnou26|9<#Sf45Oy`c;s5Yr?RAu@Wuc72=en-V z6r5?Rp^2%9GX#3^ANVlbFS3;Dx4aZg5Fx)4;HauClP18K53mH0;r`flf}IA+EnVyp zxG-U>Gb!;fr9F+Abf)nA*`w2LE)Vy_VKCW}HJ2|B-*NSMH+RlWfp$?FT4L7S%}I0j zd}EPO>XdI9ZES6_*LL(o%LRjHybcq$>_X<;sdqA&jlxC%41MAu+aDMj8yey$7#li| zYFbZepu}&=crqrb!-T2*c)e*)ZLv8jKP|ePtJvd1p41-l3lhnF-Pz#0kZxdrXC_z( z-`PG!G2X1hA_Hb;iN1k8rG#3I3nxI5N~gbNPtdMkzm}+AZraSxxrB~UW|y%M8Wzcy zjjul7bLgHnEnkwioZ(bPE5u^0a$U8NhYvq37f|G)Xw$b_GUP0cAD7O-ocw1Nroqi6<1Z9KXTd+i{cXxea;pSZCdg1Eiq}%n#x%}{f-!Bf)+L#P+c{jqOL6W zH!l{Qd^Z&_Mp|jh0D?0O!9$0?@SO|n@9VKH4J^5mVRh%uaoSefi&09q$J3=UEm0yjGNe5r4uwTIUpqzvg1aXA}82;lk86Q;vv8B)#cT1-T!Azn&UDJj7t&VK z{32y^K;Rsh$AKBIeWYjq_@XBLw`=aLI4LbZI4Lf1KDbct2Y)C7K7x;XWqL^bzU>)X zClG%g7)5`gUSOThTs7ZAyTZAoZHSpW2M7T-#KH&H2KpdtdJ>H}0-K)DP4|=UX~!%n zwPf|;xM;54s0->_G8ST*;-HhLhLBdF*g>dl%-kG5>wqlxizwX{U(!DOh2Ib09mKDg z62*zxbqKkcyjFAB>+iv+(1>)InM%NSWFB=ZK<~l$x&INQ5|k^;?fuZm$U!fHvyf0I zB~>kV;Z@<|!@i{@xl<|ZFtAI0Wzla--UtM>qmo^OAR{e(PC7v-N6smW;p^R%kf^64 zprmAeP%zvnD@V@UKAgSaIKcdy+Q@?k69f+@I2M&wRm|THOt0dyBqQ7vRr8MGod#!) z=|8(Xt>(J8$Vw#*>ZXG0Pg%EZa7}s}>}|&+E1kpfaac;KuZvbZosbjwb0@OR`R+t< z9T?wu#>XBeIEx{=vHzaGg}cKQV^Y2IyF1H-aIO*ppMcNC9}=}<6R+4cG`kWqGwqB` zE$xIhGNGLWfgP$9W|NMj74ltUKUo#^t@J>?B^?e+TT94Dt^EFsJbpCW36%YQ2~_H= zB$t}drv`hQ)+vczF<>Gu8zQx?taJR5#{%JLK;cn5uaiXm#P8-Ydy+xn0^P)5NPcc# zKmItCHdmu@;lkD^a+kxp9~i86#@9(K$o#6A9LlM&sbS*xF*J{3JD;;ZkNI&opF<~XOfjozz-Y-Ka6eXJSVBX}S2DBB`Z)ZPg1`g6vK;V+;U3ElIIAZ>buKU=46p>q}&TK{&IF{RGsxnqYmqpRCADdDM|UvHwGm5+^X0-(LM?AX*olK#gnnqt2s<%45ujMj2-fk-}Of)tHa6 ztH`0@k3GNx(MC%1v&B&%u|}>`%hV@`sYV_${Ts}`P63}Cf2w^kjJ}I}WMhUM69g}+ zDY@1|q)somZ#51)dsWC~F`M$NGaPfFClLwY-qWy%f5l`q0jz zU(VI%-nxE`uW3S9?**+Tsn<8eQM|vI-+C$$m-lRUb_S@7d(dF_Zr|<%r3YnN$_U{% zl^f{G#Wm08PVE~>sQgqZ<5k+2#j)mRFhBBXX8e+hiyv3O_&s);l%wX;t1q?c&GdhS z(Y(t!r{|nWlaRvM;`ky=aj7b_ys&JP+N?9g=R>@WYv(&87)_IpVcyD)XlTtZmbDhr z@XyuVVLsyf+Ka%QC`HSz6rSfrdIt zrBody#F&yu{9J_HIKD_L{T3eBu0;ABh(E@^vcvrH^WN87hGD||#{LL)8IkKss!r{q z&xF1M;I*?I0A8DRg<=&1V>kTK&>r$;diw3cnOOyroL$0+L5YC@PiTBVMrsBMZ7%A1+d3TnRk0vIY`I}{N*DsE ze_J*q^~f~Dr2wt2*>A78Haq{xgf^`KBl$Z0(|B0@B+49g(*bcx4k;HHpO1SSJ(?E; z_>6W?s{tN}gu<_?H4KLCWD>KlkTg5=|5@nlcUc>4la`V(x36g}CEG&{aD>&+n^DPX zh(};4gKTGFX0nuubxO!Sp^avHy^);*6nk;~fF_o#v4~k;M{M^I8nJ zRF9q3)2&J+;hr-}yAux{IxKjorEz|TK=U{?X<)dgZRDMm#WAkgDEo$XpG4qM+@b8x z)!c)pQ>Y}a!i+Q1bMx7OR$#T%_q@9o zQy)on&}eSC=a8qqB+X}oM1^B1i_Q)f3ttyTX}9)3V+G$Ap5>t__L}B9v7UZ_=GyR| z6)06QYftMd&0wZBJG7c0@@n+_g%&m25y!2h|5@T-+?aEzV4}JntTOYyWhKUY=>coN zYWilx!^)3=C?5^4g~DX1BfXzgG%siFlWxla-!bXV;$rN|*GI zUT^hnrjAjs`Uijk(*ZjLrn^YXO2!VE;{13R^wE9H|8 zEJaV|#RrD|LS8xX>JzMUK*r2!3&Cxvkl)Qbx;i^;5}zM6oD2SAcfY(AOX=33*td*EEG)=J3HuCC43WEn_Dh zn)U0(Rh5@QrsLUVG-L#PfbbW$dt!OjYe<%u!1Vvzh>p zM^tZj*cB6PAor3WnXaKCIi{9YX)-ZdI10Yt*`aMfI{aP^UoMvRIQl4Fke@T>byGm9 z!^C475g?;Mki#z~s88&XXLmg;r26xm5_~y0>3pK~uo6M^jGN!XCLNBd5@qs4)`X2t za-`H-IlGNCK4%YeL-!sagMZcc3l8VjTFIsAsBNe5+i9g^k6Hwtdz(0PXlK6My`!q? z^_veU?QuV1{hKPTs?t}F@*oK(GlBo@Q=PvS`2Tvc`j-TMN$?kn{@;CI^vec++2Ai5{AGjx(x=kDK;{?7`~sO@ zAoB}ku!{frcYA)J=r0ugg`&Su^cRZ$Lec-9-*Nrr2Y>m&Uw-hHAN=J9|22N_9*lKb zwGgP2xRZj#1kevw&9$`c#JE^B%+1v|$CFD0JCmcBsY(!Psx~&Q+RqmBz~#>(n4LhG zOP}X|r=!xb)oh3D{xf*6oI%y0`+rtCqWLD8klWp8bZ|DOPzQqlt#Bh#_}_Xl{H>JZ z|Ai6amskB|>FbsOXVk)DqC~9DL$3{ewdb`t)ifzmwn90o>fS&&QM(x5qqrQc%CrZ1 zNI)L{y#j_F9}mX$z1w(FU&Eb{)H|md)I^ZEqRT(>0-6X5XEJxDH|Vwx-M1XVTim*% zKHi4|x=~a({P2pF;mw|}S~e%p2bdS_ME2UMZFcgvPWa)xpfYaI5@cX-75X zr3SfItVLD4)x4fE(~SjnW7-^`v6Ld6tqg;EZ(0n#@K=k@?N!Fee_+gv)`I(GPK7(_ zK539`z8B6<*zm(WFMtJ3+9>!$w@_YfDxF5~M(P*Ew6Hb4Eg$EI>A*q8BaAo>>gvzH-BB^`OdI6STS{=yZ8QRx|FT0EGZED(fwsOBjqB zFkPm2+V{Rt^DG%4)y_{Z=2O2Om`G;H<~`b_)Ka~B#MTSPRBg@iI|8|s+nra$9YU{U4^>B(FWqd`RJeheNDk&lqsT{8)22IKQ*FMD9UZUg zVJ%$Oo)SFh8zmfXKP>RgrYVGtZ@1qa-?Qh?Nm1zyP4&p6G!Y!9HyjRc8a>f(5e<6G zics=;aML$79jMV3QoS0sGNN_LwzpG4h^V|Mt>WllGwXK-u0@iN0Q-5Gr!R=$(%?yyD3McRLmvW~Xqk^?d6o2?lgt&Oon+l& z)ANK>o8;JSZkvfKHAc&PX>1utS{N;%7SvpSB0#M^qjWl`;gpGqlAcm)MrYI5LPKv0 z=F%yXl^3`84UL?3v-JljMv1(%DHPZX%fU*;hS4X!sej>?2dG6Fwi$a}Mwn|f}t>N}JuyDu{){RbrL144m ze&P{x!nQqWeB}A7)NWiuxMPStS9k^Dk9q3~Z)_LB4`KzM{F+6tbQ1uG1pS4`SpaxO z<0767d^pu$@EV*F5XMi~vshl}s!pGUcIMwpWIbb-32Z5re4pC*7I`(Mog0gNsWOno zVHquLNK4(*!HT{CY6<-ElvYy{t1eY@U4_2>q>k?p9&^Bn{+oH+0}wCJn@DH<10nV# zGHOvb^x42+rXDfd!Oq`Xoz5FsbY;duH1T&N65=ctm$URdy#*EspcDLu`Ux$S$}ps| z;Niq;m82=|9J>a&(lJn9B4CDC{XPXxmko1%=SmUByh#@i3w+%eu{Va_Il|muKB#iu zB5t+FX887eSfu_Nm_xXG)^75`w0M6k(kn?r2p_VJ7Cgu$Q7rW+rHH0gPBL+KQ6UmxMAx{kjYVlc6h960|jKGgB z5lyw7Iif24QR=ZMd?B>2OCe*ET0^2P%=hwnC33n^Gh&sDzjaA9@nEBM=2F$|MilQ1 z^@-C?Z@g7ki58Y&R2E@t0#?ig27RfC)mcqXTF-N>*d}g<N^$YxrNF7hys1rS7n2zDW<|iXo3AvB7#@jb z&TY79Xl?Zl3byK+;|P5phx*y;l$50gbBoQGe`b?KuJ%$;)ns5GT{IRrU*N*^xVSq!w>Y zJ?=*2-&vzfY4MZspxRpZS*jC7_-7Qrp9Qmgn{O|#&X7XXYpcC!x`_tc^146sS5?S7 zi9*;`2T@5^eZxza1FNIa+vNQI?youk+ztL7!d#qd@~A1>H%HIoT%rt?7nciqY5tLy zmj^W8Y1Z@x73a9L4HYHs{mFWAc99Wh?PkmWQouq_FzhS`30$|DagV{6z!; z;kW+BV-Bs2F#*BDhwH0vmMN+7w=^zs&ucCQ40BO+Zxrj+Is5%3Ob7axmo4qk!3h^2wFP z#>O(&!I{}v9>AhLo&AfE^fYlTvFNh^mV82LBeI-5teQM~A9rgw^{&U{69w|&K21%C zEPXO!BC&o*DyCXA8FtC1#F-fxSd8RhkQ-F*dVCS{xv4EMla}l_am4Yi<#m*f-;6vehDe zflF2woHG1Ln~V_z4a3NQuT3W=9^!G1AVms-%uGxsr=~_KJhIBllC~`bC<6amH9BCW zFc)n*48}saWIxvu6zKkO#!Nh=TQfD40Rcf+6`o8lfn!zP4}3hX&<ws?RBQYTXz;BKp$Eid|>qUj`i{zpP4{gL` zAr)<1tyq?i<(E90Sf%p@iakn-IG~?pmOZi6O*)9$&&&ZM3kk!0tJg_#+r)JI)wCP; zIN$U4p^q|`d)3TXidw6#_0Rw_OGY6{AU~+u53mH;jUGB3rzo9Xxp35VYR^xs@t77W zlvo=0&0J9*Al|rWwe*QNb41JEevFQ5M-VBWpVTE5E8R!X!ZLpX4tb{9ykH?l;ZVP@ z#z$M_k~I^`VlN#zJZ(AbbAQup4hzNG{lr~$E24DFdPA^xiTKcEj8iYV4HDFdQ`ZXq z38Vx5M=SX!Q%kXni2X#s|5eVN*- z$m-T$f&IbCCr6&WUbjn!-W9&C7*UUf>z`m7_*e^GV0+VDM<5^^A=gJ0>(( z6gA>D&Qx)9bo8ZgE*;(x5DdpgOijH^PVO%~fVbL3W?$PplaXl;oX~qy+wBC3o6Jb{ z`#*kzURn%5Qa`S?cIOh;cOux>ns~@3x2NM}b59GF{g(_L1NtNH_{rBPjx}Dk;NoE# z)UC)WY7ZIcotL&8fC-2n(g&KXeK>=P1R4b0y`e1#G!^?J1t9JiTd)GV4JXib61<~o zyVq0?r}sWQ8(aSN8ra$H9Kc`s>4m^VAT~B9m}chigYsiXfh*>*+n4Y97k_PV^y;a| W&A!fv05V~0dRJ~%p`ZIE>=8GA?)D%rzG2qF7A6d}tnjGZC7 zv5YXb!FWFEobx^B`}=nOdA`r$;27xuZ%)%}#yd z#0fgJ+c$JioFMyj;shxt6)EsdrIL=&i4(ym)NUy2KeAXs7`a{a4P2-ZtvYSbgPXe` z;=QweK|}<%J!R-~x^KxY`A`%BN5_DJq<=FS5t!oSFfIs;Kon`gXzmYJW zSEfYyt*HV3BS;p%VGhO11UR;|AIGb`4c6@6Vaj-a=QnYt`*V%K3}sA_L1!p{VF3Sq zozM6v@$=(}US%-ZkB{&Z9s$do|sJ;^1K%qToCnxJ89(D)lBf>c96nelHYMRnw-OQ@O8rWka1!XKBVRHD zMrqi)PW~-d3HePqUaWs>6wAb>t=R7A^S~H(MVP@Ua#; zWKAvM^g;Qs#*X@eMEAp!!iRyQ@Nbi6A26cyry?falOP}rhpGzF>$WvJoTTi>)7!Xl zJe&9{viWOcXo>n_aH=VB=>S~Q2Xgxi)PGzVxEi1bKGHl7@Z+C z1lv{CGM)orF?s3IkT{bm(`3G&j!+WwBVMmftvqmwk}ewyD!|P#?M~3(?rKWm?tTd- zo}aWX-^-{ZEGDA|-}eTDT*bW8Jt`c~FlCh1h`pUkAkyIGd!X|6)QF+{nuP-^l70M- z`O-i8F<%LBc>8{I!=N$lDs=rtBUJHG)o1B)c98d8axl(>$}svQzXjV$=IhZ!gdjiN z;(~L-$m+LdKFdzc;7Tqtz>Q)TkLd#8Z?(i!v9i;Ep**x+R)(op zhQk?A<#PiVM(6zdD5Z*XHl(tR8FCI`teuM++Ab6hdU&^{yPK-W1_hs|N_s788{t7V z&px}mAG?pE33)jcsY$XX*s=&8^T9oO-zsFM*lYX^&D_Li7MJcCanY9YkHaGmirs{g zJ1RU@DmG>L;ao+iR>jLK-*+sk^UU%Zu|;c*Zs@K_6ND-SzTq-nfe0zdL|e+9fv@@< zh-&PpCW~rM?M9AVeE7_Bzxn88&=ck_O_3K=z()r8V^}(x1q(DtA=z^F5kI_TQ~QZg zD4U=g1l_;zwUhQhKENFB32{E(~0duQ6j&;QkK;JDj)5&@|Wu|3N<@Y8%-25-zlRo#I zviT@^&5jQq^k!=-=QgYxUxs30&A99w5~$6{7JR&S>aLKQkdqW@^1+>HKIaOLW0}Sx zGK0G2^6^o9iEZy%f{B^kT3SM!hXI_Ya~^Agk8JbDmKpSJ(MYqcW@<+vb~tL#GGQ{k zqy$O_7t8Yp*NK2ziEz;;JsekKe~0$*1fvD;Pn)JT*A#q;*CGO)mBH76rFp?ZBK$bm zFozNKy8cQY)Pt-mS)-AttJuKf7eeI_@^q7f5RD0>(7)^lL*R=YQ1^T<>mPH#P zaw^j$Hp*BT)TL&U(GAx^i_vc@-rx5{#{n1hwtvc6XRrW;HLFs9v``7ld}JBSzMZP1 zDqwr>eZR!&RW>^Jix$^DTQ6U|F_sBu>j^31W`84GTvbtWy&OZFq&Frra@wRld(1w^Rn^GZ>(DO}kZ z+!rUSef-nu7TF&=virx5Jhm-klXTSa?)*Rdx!30RjPin?5%n|4@Sh-|`|&B5^gn*Z z{^`eGzknPBnuX6?qJq$UJ5Hh}ZiA>Gr^(AH?zf2^UxLS#k0YSu3AsR$_s~x&Zw4Q;g;DWpH)q@noG&cpvw=OaZdhJNAkyH_W9m871W7xyBzK-VGah5T39wS4se4E#MSLdf1l-^BezY{ zqn+IhBDO53dZ(p1c~m*kda}LfK-SOCZ-yx@+cq8xn<>*bf6{JdI`r{l^=&nz2<(EP zp%F)_No(unVY!&c-2E;-T}Y(1b`R=V6BMrGv$B177~t)2X=P=2z3$k$Zt{QFer^3) zn%||t)yDnKLM0+scjJ*@8)n%ryk?)J#ZRVnE{YA$Bfmdo9~b1g_igh{^VCW2)!Xk4 z$K+(!CW8El)A6rOcev$Yu&vfrQBiY2exZrcQM*LN)6EyNjEW`&go|y~UflP&R_h0g zP9D+D$W`!rNxYzCX?VAyzEq{>-TQYBJs-X?SC)GHttETTywYWx{@C6(g8x`u?kK3W zyV6$ZVcAjV=ftCx?|qGKb_dDO-#RNATQNRvA0=h>K|yLCzrJ!wBSCE-cVS2V}=_Vxu=+}c`kVPQ{qxAVh?&lbF>7BqWAg}OwAZska2 zFSWL|jvq9&&hrW1uaYBNASHbJ7R>GG?UIgTF*-e%@+PIheYr?XB2{W}c4TA(i(Snk z0!bsKv7$mjL87j@+SARA|HGYiMAgm)c`V{Ez~pXHPDEB)N?K|b59N=|Tn}taAcX?k zNt(Tztmo~-5HX10bmSC-3}VSEUgp462(a-~#{>+m>MmrM&9M`-i+R#}p!8f`7urzY zzYcIzWi;HjG&c8guTfjAQ(G0R20Rr}b{%VGI=L%v;Bz#E_6*G{M8s{pZh8$%gyDPR z*kaQgzLqgRkBLT;p*PCG`64r)v+QLT8JEk8S5KOPjP{3ozpbNC?Foh z=#dx=_22E#V{P1K_Wcr^Q@XawarJCjAO2QpdA%dlsdH+$f;Hi}wr1@vBM(Q$*Y+~1 zH1m6A1R;Z5X}ft-nw|jPb3f+G$?(Vi97yEv+F77gBIH5CDNc2Zi2?zri>1qYbpa&gf({7za* zI<|DntR^t(?Hl%;ZG>v$?zgHTT^BumJ@CS;u`@=Ye0D3E4*Pl8)+|zRT=++h|WS0kVvC*yApjMh) zKF-oNr>HhB-P|%`xxREY|C}dLwt26xGol}5IV-Emc2VjJ8a<}!{z2Mqb+`t4)!W;f zJ=K)|X?uaR%i;D+54VD^JKzPWRco=@nxm`R-9}#&c-)cPU6Fhi@d!@!t6^c z8`2%ReRpT~ei}m$gs#;;prIMpR_V#De)mSIy1M)~I!HwGdiw&~MqxOp4eQyBL>?_Q zYyZe!pVrUAZ!)6TgSi^-e%Ca|OA;k;-=X_QI16FcXCsKll~K#s5B4F4*N38HhkRVz zNDgCV?Kym2wK#Pld-TdI5bl0%kR*Z4@84fEC7L9>0`=%V!cE7w_2`P4YqeiZ4u=XS zBqX9e&jImKT{?*$4#d*%Rh_3$w)N_OwLuJ}505-+k#tpQsk(y*1;}{`ci5(1qHXyO zUHxTp2Xp1eGHX%c;)A7*Xe6@Gs0Zg17MycZ99dHyV8s`|{&jJd6Es^MfZs6^y&)AamJ*KKI!QR+LG7OcGvV(kdRYFC`c+m_i@+7;Fj;O z?K=}klEP@rnChycl$6y%tbg6^_v~TBqdAzGZ}#rX8>82p^U;F}jUR85m|GYFTlv;Y zVgFk%(*3V9RcwsZ)a;3hnB{-SKW*4v#(eDISm_YU!)+!4HcZRe**QbTkN)4c`^g^N zoZ{7^Z!zGZ!<~XdC2U&3%DpAOIq=Ym$x$4g5~9k1}q2CYBqzAsSl{_S@5r7JcOs<+k@ zANgY))s^o?R(#xTEv&mzh1=Su>mQWViBSqjzeAI|9Nl=ZbxsUk=CQ$^YVy8}N5S{* zT?6ax_8@}1vxlR)Ki}BcnEvdL%XoKpMR|Fpm*=QJffEpCJFg}$u(9&P3!IiIBW^98 z(z!5J>$l92qU$m#ZDXVBHW~CK&A!ie*~QTX;c>`!5>F(CToGI-D7c~}T&REuz-J+L zh_3(c61{GkyM&;{;(eaM0;1gYkw#eKbgoj~;k3Qif{c^Mp?Kr6^sU@)loSgLJeF;|upSHe!YH4jg zp>k`B&g5_#5iz8P(^>1Y3olDPxmY44UB#c0A+Md~61aWgu)VCGR?qP0)3?^vTXxDpb8W^iTZiQ#eg zsxHo?FgG)KtFpSX#Ldah+IZdczLS&RBb)v~jGUO5ZIxVDG9@LYhDIl_015$zuk$11 zH#cdVSGm&6D{<))Pjco>eR#(Gc5UqK?Y+HYmPT4Kc*MnI)O^qsEd`RQDm`IRDg|hX zOxwz;8rSRNlS)acmcygdcVcr+@?FlAbH)T5hNd2HvK`s9UgmS)YmqG!mz0>9j`Fv* zj!WkSHiL73mAiv;^ik2dV<2;bnQ!YYD+efj;BSz?{QI%hm&gdu%=8EyX-`(x>(4`%;V6nU8 z2rO?M=kfFVssBi@enJs<7QW0sT-P^Wx{sS7eozfao}HOkSrE3)^NM(k-MRxUD6{RV z=-_IOrW_xbo?pmI1)QZJ-D81(lrtXjRSgt7mgP?LpZepG1;&GeLt}Ea`HoAnvd#t9 zY>z1ciun(S`(LFOY{#!YkNY!49ABPrr~JcuCyy_m%KhJXwZY>ZH<6>F=$ni#}rVd@+dyE7moFDfy z4TOeA!3QNb~%ezLhsx1n_T zTF0X%FDKjtH$yJKGyPAa#7IaA0q$2o?ogy$(T*!44+%DGq=KB)A_u(|C6(p-$rR(y zBPHKU9S@ulwZuk3mlYZOWaB2djr<3%EI#wDhGKxPuICInsmb95xE1I$N~eKpF)8?m zryD#54Z%lkc8ni`!3CD&pyzy~>>X?*TueWczxs=LcKy^9MGZzO$W~PFlinNP>w6dA z)}%jhvC*mj%}Hy4s-5KSxiW3Z)qbhFu&}?9*5~D5Rohty{bH_*G36@1s_+IcauZf5 zm%2=SYhSxP3t2U{9&T0z``I;i!oW{Hkz4~_Azvr#6M?+Au`Ag4k=rSy^Hrq$} zX1)ZRD=m$~+4=4C0j8+v>mKDR7B#s>Tso2up|ND=SNAb*HHO}uuTTRDk!wO0ZhPw{ zv8JC@h)#>4PZ|IkUPzxMmlf~MPr+g+~IEzoq@u+x?&F)n)<3SugT`}Na$5ahxeopGJQ!Y>Pci&&yv zOc)n(Pdv?saDktXnBQTuQSFvq?2{9=v%{o3WWq?Ay%xlL(7z6=t*)r2ZC)&K+PYVk z>QTl&o$b?tny>#5qkj13Ns5bc}J1;y>Cw%Xwp#+9= zweYE#^c2bJJ(m%ShY2ECH;0Fl4}v0^uM| z2o@F0gU>laxfv$wl5n^WmC!Opk_xQy)>~=;z)?}poL-m zC7=Fvw`=KBEfO4yRNJ>kZq<(5vt}V3P06^@WtrvzPZi!e`Eog35$?m9+WD*unSAYKr=Tb6i++?Afb_vP}x& zb2_0=2Ut}>6!&XBestcrJV`%;JvTpAQk}(XL+>vgV zz_NfZPej$i5HaaTZiDQ2`yhw%ZL;%077dA3>`ixVsda{DfX8i+rA$}INBK$O1iwboF1C1R zgha~yCU0?IBA9Uvjtzl4Oxnw8+&c&BFmp7U%B&L_d5!IFYs%_LnAc;{o3ETp%?og_ z)36v62>PD%0V#E=Eg!uXPP2D;B&98FU)feGQ?v0Dm6aCnogRtkh{vgc7KG2}Jw3xP zAfNp$`@K~G>phuIind|rDUO+Ao#$KxiD;JvY!@p%I2&^Y6)kCK@(M7$YPXU&oMCWm zv1HJWeP6bE#(;Sd@IEQ#K1Ax~IMm5ih&d)mZ;+%(U9UtlN*id z>TT!%k(bi~p(3aEMVxJyxcl0A8_ zA?gx7<0+%klMqH+c5+MdIgojNkxgobi>ttym`gNmjTd`D6vg4#Ob3`xw!t++;Ws3YgA*d( z1dCKAr3%n|eHkMFWZ>_>TUruU(sRW1o}_yUdx|Zqla0zuUV0c|#^aoz$SJQYN$Ht6 zVrHoWrq?&bd3$j+5EyxpYeK@38zsw+yb5XWI)KOI#D*if>Ev4eZn4q-Fb%`#`qB%jc#w~YlSztOKrLtr zuSX=0y$%HA8+X7_3*e|*=}pSfsoP6bp1uiU8pTW^kBnL~JjJ*V%Yt9tqVS|?{MW2P_C~wS> zgVd5Wq!-#8!_fkz$aDP_$$T(T4IiP-+K*3wswUUeE=WzVZ|U_+v%*|BE3T!eI1B$Z zm>xIUWjxNpBb)L}J*s-hOojw;?QUXg8kuux1uL5A&UJ9-H$2Izak*_WZMh}Aom}`F z%_b6QaI(C3vn%JK=xI8ZJWTM!>e88_)DlcDuaM=7_yHZAPibur#kqVVA$jGpb9Vxi zmG4UJ=z@Fe_m^IHTa)a#D(xGHq0K$x)Xl3Sg9H8ED8dsvg!>!H?H4+PRQ7f24U@H+ ze7jUFE|>_MERRtNRk`-!jWtS7K{OG%87*sWYGFvCbTqJTErP^qKeL0KHF3+54R# z;fwwSfE|2UCsF9T8y{zDBT}p^LMPRCFfm{HwdH+!fCk2V>ry{5`POv<_w?Zp<&zr8SJ=cjfG!<^cX_wj{GQGM;>2}cbY%tIle*NS1@z~g;pQ_JwO z^Be312jSw7Kq#)0Vc6?lH87sUPT_vIU1;}v4bkqdq=bNM83DUd(vv=!SF*y7-eg>D zY&;)<>*!zJMJ{#jX+Sk!&)y~KR>U&T(X-6Ep${Zw!=hY2G}Kd5R?Ye+hfA3vc@lD5 zazB~AdqfQzL-N2QeQZaJ!vdWY6>odHF*m1r#U@kXi zdO5Aw3N$?v1D(APrw8wgf$lfHN!h4Qp2zSTuO^H z#ER#${F?NB5hD?n1-KIl#-Jy_SQ?w;*wZd9Wyq}as?v~+tJ`ZZ-uO91z!PO{iEt)) z{-^?t4JVDgwSK?}KG#Z4=ss+}qpdBSDh^BO;7`#g94SAc%wfjmvLWK-)6YsX>2!PS zoiN&Dwc@6ytEtv$ugdSJitN4kn>DiLu)7Vu?(od>qEVG#Xjp^=x8u7#Pgifd)_a$C zxSlnU;=wg`S#D*+59q%)^5P{E(G=LCjV8{0ebeA0JC77JMn_%yRXT-&HrDd?n}3i5 z+#d%|BtK;8p8Gg!Ltk##|J~A01EVIU#iS6OO+o~ndRtNZF|$csBJT;AzkxkFogSv5 zNk9)H39JYoPH+sJr*|dB!8b*F1fy$yyC9Ku7G<(E$C{FCg}Up!hV(>%oKt1%ULBn= zH%UxCE3AgjN;Bx*6Uny_*k3Pl6g&!O0(ckxw=G#Ng%>)_cuxM84iDZJzGCGU{F+(V z>+ON$TYH5Z)Opn!#36HdzWg_Z=);kF-0n&t|KJ06I8g>IzD-(78qfMGUgjiEn51aC zbABUBAxM7WnaidS?pTP~)veTh)%T#h1Ls-ilo@5GyTVQfvr@|p2uJp9J2=H)0m>(R zE7c*#CsIz>l*$RFBZf?jU=O!nG{xlzyGB=ipp~xBcb8FY&M@Hu()U>up5}zYTetDr zI3+DxcepYY#6;l}&q0m@p*M_$>C&$yo2N{ap4Q<8)iPEEIkZUebI*iF`hxkqYVj(H z@S$5NdBzUs)R#teqxQFgbJBC_1fF?>SA;z>=W;niIx056%}6$yqJ`eRf^z_U*A8XP za(H(C$b-RICR#~0J=J!Wv{u>?j1F_trIhKrdy^*C$3T^$TxX!*z?1Z!oPrPxjHSEl zyRgq%kH>=14H`(#+vxm$G0dH*v8IfCvHn(b){E0rAlssJ8B)al5>=U-8M1Mh7Rba_GnZLeBz{JeVzF4;(+l8E+QqG2yA=Mfo$L<_zfQ%1wY{JuX--m0 zUb4@uf1vf+^7FY_F-nxOowpk)eh7`n($;^J%m9!e-+#MhWXMcpoLMAX+5O768HdB$ z`@mY56wnCQB&%TN?NbFT)1E6w3h8gn-=mQf+Y&^cE^1PiaPZZ*lk@Sn0cTZb_o9&- zrdi_N-Oz&6n}MSSfv#m?1)9XiGQ>-ZG*CiqF@Kg6&92SvO8 zM!NZLD3v*^WVPEPhfQrea83?<&%2lNsPZQl`};UoaW*4i0y6p@7y=JXA(= zGq<3iATu*0ZJ!m8tbb*xI3c(o#bKj(jZzPEITgX0y7njv7Ep1K*rBYXwct$prfO}*;#S_fB^G*&sp8-FjmCj z%`acb3&Vp0?SJ7L5|L!JAKO%=lP@AwL}<3gC7JG3QsxeYg7l~sm1;e9OGZ|M(5Dwe zLPGlbbgg6=sdTh~I(}-ZshOFXfx*^vOOy`3jd-%5p&=yD+k3mIiL^p8-p9#l`EY;d zG-^%g7puqT4o+m)t+OYaDJUM1U}GdrNig$r%U;=v$a@zaOhhkt_dq8(QRe360|Nsu zp<%&_^78M*S?AA2x3;w0%Ny*8lNnuc^gs`wy zl52&@Wj?;7;GBF5Q&XB5&PAVpap}MNdfYX5_GJZC6Vz$}_XdLyMXenv2zk;obHSCn zZkD`!Xjw~54RAH;aFy`za3m6`0;UXAPFZui_U6t)p=s4(&*R6BLqbR#+b9{hb->b+ zk_H9_y{r&na=aYPFRB+y42vzLDt6ssB<3=U`&ZEcpQqa)>#X?QSq-&-tp3e1&mG^W zg=iA4c_l8$)wAgeeuKlqx6dJ}s)qXdR5lY66Z77A$zr;?Xffj>Bfaad6BAusUG;95 z6b|tm3=3zpS(U4e2i58=W zK)5O-#q5|26aVUFu9REE+r4G`-+(gGuOiC411VuF(I;qUb9Zk)LvFE0Nxl&}<6ti? zi8BQj`d48}UJI<(U0P;y@rVkf(6JVP+YN=vP1aPe^H=zlzMDSG0r)OnRu#25ii>hf*?xML7T$rxFYFIDT!m90Hk1epj%_;&%M@-uu{# z*)k6ld^9PgwjV=NKbH~{Ne+QFpA4JEJ#lYqYinjy6G#$&aNrLF4F`ujH1?g0lao_< zaL+=PgIuiJ&6w5I)%ErD&`>g~mb5f3lZURZv3!esTbD3(B_+J$9D@H8Dd`tGl#jkW zxNnszcge&Pf}N8--G|Wcu_C5Y`OSZEy&(S@%C!h=fK+K$YGclMyuf5n^w8>#x~a1YnnnF9DEOU-EZDJ*>Xt> zBrTnrolQqahaf_7fokTjTtss^SY&lmQrm5Ep39;0OQ-7vp|zbJXNtV^9ZY6IBw(V$ zy3&Tot6e;HQmM!*SFT_%7|*hXh6%f}-Y*qSLyr$GsR#%PVnwJSRwRU%LqkJA{?OCY zTbQ4xrlASf;pXIg7o3BA{+zb9DmPd4K%^O{S^mK zfOf$*Z#W4O2Lf;)8DuE<8Ma&ud-UO-lTE>s10K7Y9@FtwLrbez%Z7f`kcPaHhEH#; zD=oy)tZamnid>$%Cr!@hxCxAdV{CMEvFNgPx{#0%${bWuTPr}}85pQoA%6Icfm+P0IW$aEJB?1|EWc0|J4Fj65|zb%*TNARyU>MB(FExM%nBhGcBnWmnE( zXFeUVZ$Z7^;`g+|0AuuIC~0eGaBy?eZ??SyW+x>rz2J6DlTQx@g9QaCA$iW7OU}q( z*j!Ls-hyTI-ZM1?x+TxjQbav_2B9%FHU`3I`3Yfdr{3Ds)YM|7{=9!SOa-ZdhrN9+ z#--=$*Rwo4_G>X*zut9xq_Vu^p`U^7&-!}#De%@9*{|L2|4$&rMDo9Z9RUn0ebz#s zjRh=InaHAXM5-yD40JAvrYe4+pt>pi|LJIyz`$CH5{@CV{pg5d!e+-%( z6tZ#LH~_e;r7(r3s<*f8EsEFHxh)qCX9svVQu9Gg$fG z_*+3zkG$NU5p`AZ!f~D9$0PpIt6}pjIDvtby;YU`7|kC);;(H7nx|14%HZbRr@_Ze z;P?@L>C}h=&bufAvJ1~?6u=^WJmN3iDdIQ5oj~97@kjv%a{P$DG^c3gP(k+2!>#-^ z3BlXDDjM55J!bI0eoKYfVvbXunv^-xk0ZFf+uxD@a;jpHWTP_-+J%%F`-ibk2sRpd z`!3w1O|4RgM@H2noFNP<7Z9*Xk}LhCD8cObO@Fru+L{z*cX3#P?W`r82rkTUh1zVG zdP|f%rLD$mB)a2%VniB8T68pB@la=X0L_n)4hBznJu$g_up@xrv8fJxvjo##AOM(7 zY6!|Vb{GqD>F)6=(g;uQ3!EGb6qg45Pm3t}!wmtvIEvi;0Q(i+l2-#J76=bFPb!Akk-2WAVkhSTki zJH`*&94hwI_XA#c+a3niIzYCGt&7C6)QBCyNq_a3@83U;JY>zGqiFu}B@EED7#;zU z-Pu{I+Q;4fuB+xxJ-84LNTpVtTKcRa`M9H zGA9uZ$(DB2iw2iGLTpI?=i+wIE>2rm4lw$?t0`Zz1sl=sQnHb0$SD)z*i&dAar=H% zX+4gU{^YVsN*QmBlUVOeFp`cgY$`nZ4$sW|3;_)e4D=$TUB($%nfR8Lm(ggnLr4^x z=#TAT*x1g7LUVksiytppfbO}#u){t)0iGkv3}~mXTW8j^b!*DxC|K`!&?gc8gTsoG z)p`#reLQ>CG60$5j(a3AB8#o!@mPC0M#-C^Mxx~!ctmWFsF*^Mq$MZINK3QHs8THw zi9~>w)t;lJC^oNSr4CODzN4m=`8DTMTzlB@z5}dg4EFQqCD0v&(&D=4oT@}k6lip= z`}9x*reXs{F(M%@e z^n)=#2X)EFVFphp^ziD?H9K-X}GwkJP)yeB218 z#){I|MrE+2-c%HEP3>|2{k>OJ6$Jp1})|KG{c=C+r1l&;1M&c zLYiRlas@iYCoS`p;!&{{Zegn!p|eXi^||GncAr@zs?ITDt|1D&xfa+mHN}g}Ogy>1 zd4`sWi3z|P&CSg#T<#?QKKzP{TO)o+GHv8|wCtLw#Q2r$^c8wnQSKLxw`Z zO##l(&`<~Yix)3i5v{|UI81@o?K`;=$(r;Lp)N7e(F#FCc{w>b35hrt+{y~o4l6VB zLuY41LwgnJaXi?fEYB*7NQP>HrJqxDCt(_qoZ4jj7-rQ*9ItQK^5Ky zuA*BrbsjCB$2Wx3b*JUU%V}xQ0~7$yv5Uu-BkeQ*H>x^{j*i~i^757;&M@I?#bjh0 zDog;aVYqJc_ptmIcj3Y|DlY5>6|cNO-s^TsV$WcIo36+QFNiq6MmM~*upHBeJKYKq zW+I6~CQd9C@@VA;g&h0b01v7$sC)gg{g&4f14a@z6aq8>*K?0Z?wPMPy<8)a z!Z4mWg8Wvha3fxb!t-g9>=*N>i(fO&J1fx!yh5f?9KKan2BSr%n()mL4A?4MW+v~H z(fX4oPXID;CjI`^M_WqPNfbNwHPSNxEkwTFbikL|4N&ixp!IIO3KS(o83XmX98U?*%t_Vs*W}rEEcm z=jNTN3k##wciQ7F_ao!t;(F2*#xR)dde)&ntY`Uyz(67%55m0DNl!`wqUzk-oM%~e zb#-H7V{L6pN2)qN9jZQjcs{S^oxvwcTJST~w%05sJ3gdMjIGGcQ{f3N5bulC4;Y+RBfROEt7~{tCaI$fQMGp` z?p8#y$AB~Dg>_BD@3dTbbM7W1iF`QxoCb9 z(Ez?$U&)crWkoj1M%Cl&o_ix!gz|Cb_b$7|TqPkO%EHSI4TZ)amK!zJGTGzE2=5S`-iY zEe{sX&Drvzv}t4hgbeX#7J`YbzHJLR*&)4F?tqw*Hu~+*IcMJ`T)G%-I^JncZIWZ` zJW)1+;~Dqr*t@_&7Xkp8yMXc$4UJ*o5%w{pkAlXWTFi_7mPU;e;Otqd*Y6pl%p6q1 znTe`_DGMk9qU3lJr8Pw_mLE`_!@abv87hgA4-b9($kS7w3bOtXA_Jn)9|8 zFbK$=(bPxpeRYCAODORSvA}>ifN5%Cf*ZlB;JYz9)f@rvRZzr4d%Z=?(WF%R@iX*; zz{M3i$3I@Y?!%wkyaP?!e;AYN@?~wqW2lbPnBHY2Ab`F+LrGkro*BPa^NJ{xxZm9* zD(n)wRvmRqRfR-L5|9FIOYU*YKLQu?s(}6E(~r6R0!R;xe#P9jvo@J4vxCDdudKY2 zVIIMsxd9ciY|wPCFDY@~-(H=cw@bTI_3}#2)ja2=Ng%Dm{hb z;m|y~@u{U9x}qiCldeVaW_L6V}_zml?U`56>l7BRBoThq2vr557g z0!zxUm&e*Yxd=eIFq*vaNPCbi&(qs`$x{|Kc?Q6WJ(KmmWq^KnmNq9h*T~S2m4)S$ zJ*T4Y#*N}31_lN_C>tBwv4oM6^JFiU8ptbeCTK)~Wm)s(;NXbmR&aE3%3@?I3StAa zo~w!g_>x0R9cMz#arZfnOB3lepF-qjx5I~aR6?Ud_K^3l-slXQmkM==R$O{Wy$FD? z1fQ@oiY$s5Ya?a$H8nMWO28Pz!FCsaMod-~21q>Ap4;?5W#A9wtlp~*HlintZ86FBtpE4JpPg&AeZ3T3ks@^tJ?!HyUt~zjpO@2Bpt{zyQygBfPllLfr2R` z5(P=g_>2rup^IjY&qz&nc}kf(;^X6il&=D|JeGMhsUTUsNr{O@EfUC}Qbofb?4To< zev>V?Y#2~&YJ(EG4K|KJNS9mCt5srj`=MT7Hvox`Am0w|bWHJB$R5lHMp(|)_?VYC zK(>PawUurnNe;_n`dLk0p4zT=37~BQ zn$6cXS>Vk0S)Mpa_^DXY{zk@Xy{SE03ZHmc0f!9*;xjM&Gxv$NWoA2{Q6Vm-^&2FffTDXF>MjFum4FZ>(k(=AmysqLFco6o0s0pb89;| zV9V@#p5K~TT5{YSILBpC?BnRDo{PqA5rFh}H7L?>YExlmW~RTxus~8!u(O4&G9-f9 z&(4nTEG!AxVI>WA~jv0~~ z56U%+eRPU8AfZzdpJ68V;VeFbKyJtKmq>S#BmhRwz#u3f@WF5y04IKynm?HW{U#k^ zf!f1V?=idr6j**fK^RQ8N)z^2Eujanyy(xv7`i}F?{^yXCrNf> zIHnDR8{pVZ#rR#It_K{ID6N_>u{5Qd8y*@tRu=xsse#**lh1h@n%(Z7c?J~n$VpS) zlp2%-iJqrMGc^NZg3RA|zhcS_g(9HRc>O$_j0$q;JpA*^KleDk_qQeY<5QZXBwS#y zAg~W({zbrJ`R>LF{us?7fS&*$;`ZC0;V%Fb2{QvuH$MS`DH&1fU~uTgKN-|wmKrdy z-{j%@a-GXg8kwB?avDEnlaa`4$YU@j>r$^rf^n!AOh{0X@g5pfKO(h#_Q#QvpJO`1 zjk@Ymy1#Pc%@5?lB|VY%W7GUz!2kJ<^YBTokpS-tcQ#r18GC}aDOKvaflAU>wq2MV z{|)Kusr%#RmOWax0PmguU0_izAkkW@@U9D3zIUfAHA}%|91L!h`{PCDT}ZfS!;LtV z0Zcsljmv}@S5v)aLr>leP`)wE^VwhGM&{+*E<>+hgj;pp{CSY&u_2&KtlQYwj4LEm zR7iSDj@F6>8gD}OK{-Z!=&j1_m17^`xvs;ra(fy}DifFo_c9}oK7&1DH{3%jRnwx#}8yLT?$vPEicC(>}@im3=1lFWeW=n1qB6Hye&_!y3bIM5-=|@ z_LrwYt|6rEREs+ND-2=MJJ(nB%%s_N2qt_7)`B4`^pku3+L)(DWoA8q+7nwkF4-KI z8=2+{j{Zw!KeYK2Y_?T*qd?O1jd2?Nnj(hRZ-3sZmv}>GU;$!}eSE~aPaD@C%Wgl5I zJJ2%64h(39%U;@o9%Y%FrZgLW^eO;ve%&PPI^hpgrUnX(909$*3fQbNloa`gxj@SKq%gQ+G zaBNYNMaBWs+tAPOv(UD z(hdQRQCcd#?UGI)z^cZO-EXn%91r*a7PN$D8U$bHj~I63obmS}*Vq zQV`oOXUGQ;fin=+R#sCT@q)}KAT4<&_Ou}=(HVDg<0j#b`+I8!r(<^d{R4SHjUd{)nsj11#!gBW(+I7ei z3V}SOPU7Q#yu7>&H1QfOfB5iWX=w?8P~e5j$;v|LB|*+^0K`^L8I%S32PTKZEqjGo zJDp++8UHdJ5RjSQm6f4^`Hn4QYb1KgV#Iqm$Ox(oRTt0jk`O1@s1|*0dS|3jv0v@G z%d9==cXg+AXdoJKzxf{As$Vp{i5HyA>6>%w{MUd%)F{$CYi7B|^@2Fu$jFF}f=p|8 z)jNM`eB5lwp>}V!ohjcY<=VAtaLYnKO5s)t)RYF&Jq0DDg9_CmQ29rZg2bexZiQ%^deP?=FtexV z`jgcB3Z#d{N|T2ZTdQSQ!MUxteQ1D33|Q}6T|IB^<=?pP<(ztk9kmJ?()`5ZzG`2r zRR3Th;Q%(6`ji$zsM6M|Z*0`QQeRztO2ybuEZ22gUmt3QCxz6Lh{NXV_bb#~SU zC>kPyQP23|+LyNg*F&#O;l(c~;!b@!4LJ+_q4b-C1A$zLxNAMN(wdUOK6O0|p8ybu zD}hg6;La$9{TBH6Mb5u%6Fo5r=qx!tU2t5Q=bhn%jK6U!@%|$#IY`Cc`%Fyn+kQ4G zY3*It*DzUo(hZsvQo;nn5AWvz?2s+7aB(d?UDt;X0k5*P1CG(<<>le!qz-kpin&3J z4Gk6$7eL0!&xg<-HfV`50|FoD^5x5I5K!L@3yXA%;#mK2CIDfJvHdKRJ*^}oWW_4N zfalTOBE0+^Z$sI z!Eb{T1TMo@BQh)Vz{ZWPk7T}WuQ!f7X};qMaS<$EdgOaArA{Q`qGwgpJ`JM4@!n^_ zim}zA>CB*^*I%17pE*Reh|9~5V=!FvJ<$LW%$+R2o>WfKE}u@$7se57{rDMY^K0J^ zC63K8gg4c7>!@X{)wdkRQtYVO?R+hL%y8O~>Uc}8-2wB!nt;Lz!9afFUGY0gpq>hZ z8|Dt#w4!(KW_z<#^?QtpEhjIR1*JFXA<{uw5Tyqs2!t*K2!xXFj%Vf!o*B=d z_gm{d?^DLL4fFN}p-Xv94a~;}a4+@wYI<%o-5Dc4fB~(` z+FW>iimC!XLPzIw+1J*)sap&ws`;0rbhL0XKEo}pl4t-sUw0lGihAPqTy~43!MB$v zJ;jc5o70+|U6aq-_$2zReT)4hC~+o@2&{&?x_ax_n1!+NOE)eoNX>&dq9a~Z7ZMX4 z{mHz+D;;66TwhO?&wP;b*gmCxf|gA9*ufAydSa;SX5(9AWvgNTGTdT0aQy4u>5<(_ zA=}0XAA7-DN;`xHA??(_>W%uGOb;Bji+sT7SRaKzeb)&lCpblqj82SwhXaDq5Xs}}NxzYh1laVR*;m>n0lbPL6)&eMpd6dcfvDls-5>K#hL^ntcxo4%7BR>HI(; zw8mRghK~U3rl9&I+|TAb%ns5wGEt&nJ-Y!t_dU7CXZ##)XI*6gzbqrl>>CpIbQ6Ws zAh|XCj*w90iSz1DGGAHbqT&d+*jifWW_~6`xr@f=u5`#saRH zc>JB}f`S`Iu)v!G*7Wh?$8X;7RS%7gExF0qXO@A@-o` zX5&@vn=~mMsD+V0Kjx@!B*)K1hYIMn&r;n8gV8hVdUOY-EACt6l8s!y1z^}J)`cXx z&(Uu2Ptt}C>KF|~ZKjOftkbMNKMeEt&&jcXO)!ucBf3aEQA2X$maWiB-rafBBc=m-3d&cJv}tzSG`a7a!b4X6!}yHlae;S%_bqT z4934=h~r~PVimDm2NQ{onXsBh7rgiK4XqyU&b1cR>(>_+mMWbF^lAdj7Vi!flyu~% zSS%3_PdI*Mm$d=CXd z12TSN2&ZfdI23S=pJCb`lN61Sn;86F>z9G{%{^f>Y(;shs+J=$_;ODdBABJh?6VDL z0i7Y`krnvDY^%YtXIY@UY`tSXqr31*Xx`Wz96{C7p}pE)NOlF~UwC$f`HINw z@-otYeQr$98zL$ynx+IFOVu$qSGagl@PMbbb}xXPCOI42i&h*V@B!<2cim$sYIVPq z#mE6anzD8y2#xY(%x~D%q+&#YN%w;lWj@Y3L2J8B z(>3`i2*E0lS2J@wDBbn-PtW72J$Hu4P-vg7)EaH=PrT15`g-Gfu~THPa(dn_Nwd4C z6>23?lx7{o3aPY2wZGMYw5A1yi5)x0sT5@P+fN4@5jUYEZmQSB~sb7tp2wV{RG zHpXj=-1#8(v3okX>`nbIcfq&Cg~h#FG@kGF$aW2v3wBor_2%F7e|~OARd&m|K5te! zWV(~uu|NL+?z-bQYmaX_uDt0&_&LEX|YDy?SJW7@#POArrf!6R7cbSML+o9ZvBLE>zIHKOcS! zrFcL1!XbO+gZ92BjgMfj6Ik2fNc`AbY~MY@)Y>ZNQF*k38Anuv%o5Vh;_&hFyDeYn zCzaK|U3Yvfe=FJk2rK#u)tVb`I$W3KIcqGbBgP*)09S`>QmgQDJvlmkkHg=n;=H@~(-ykk;bv3PU zKrg7DCBHm*Wo<8q&*kX#B&gKcaZJQ}^5Q&Q7g7RNlhEq7HD{w4z#LI4_pq9W*tg>{k%FwIo35 zciH%9dnn5o=}|LskLMY)uFSNDhD-LNldlFmFPh8J9%Xhu9!-_i1C9W%R6CFtXf!bo!i9yK$3xD2tT(9;^mr^Z}Cj2O7J~!rT}z`S$!5@7eZgq9Rl4Z8GrUr2Dd;vD>z7Fhm3G&NkTkI)7O7w=%hyZAMS?>Z+I#L9LunDfMLmlPY5B#a)>dg-1T| zdG!}dF}A!ZqGjr;w_OjQm)4lc0tsug!25dn@+G6djl9Cb5i<11h$CDfB7yfnS=-dd zj~_vIuUG0ZEqKm`+wjQ>E)@7RP+knUWI&a?4&U=F1U}tK%Cf9Ysq~7*mGDr5Tf@l# z)=S@}Lo=Yikwv|X4ekb-%F}6~1+3A`$SFQ_OV`V$dK5*e?Z9)vPgOH6m=XOOQtF8= z>O2KCns!NuP`9v8TpS#w6#i~*MIZ^YbkM#}N(uNeZZb~CL%2|Y9$CI@p`#g{mHORbaX;*t!g zs-tAP4E^4gDU7{+`4fzq6V>%im$-bmO{B9jF^H_7GqPK#h-z7fNz>Pgs-UmwIgv1) zR$6;)L|VY=RV^(o;I?w106@I!Tg_8yg zR`a>CT{-pvKZ+^q4QxZ~k5jhsaVQL$uo*}od3()5dE;WEuFYHNPettMP zNOuGFDU+d^PGt85P2iKk+}v)C%1TQMWQmH1L>y-I7=|T+ELhWWlSOobeb3|}fF>V9 zC1P5GX)j}>?XJtEKLXn+hFR+B0;(o~&Es5pVU!viCb)LVIrG6h6?5&VYk)uB4v*5v zu9~)(LmfdaD=%;1(;E#11qGl>5OCt&WNQq~;ltlve)0e*lkKp+sHjz@OFkvU_{bI>VMFxUwx%?VSAL{u$w>T;R~p<>(>~+yG4h4)_pg`c zWClR>8i7F2gMjGvbAP`9fYQ?FIM~=g6#@h6Wp(vtP0V_3e!k|Y|JJGvxh&U9I{SOR zc0+?vF~W%)<3l_bHT%qrjK0quoE``z=|K}+DLVVUi17reo^rk$$IGOjzcQ%BWUcfy z+(h4!@={H#^m6}lmQJ<1fPNV4IFfYNyIa*%R60H zEGt(jezBNf4`O}dMq`SP$Ri8CZ}T5MKy>>mZs@pBm-!CKdM^wDmm8d2#oe{OE2nkL z%+5K;rH)!DC@GDPjF~Dzm%a2whpA5P;(?S9C!V3l4Qpjdl!67xv#*ON{B3Ne7KTbUp6BG` zyn81onBM%Qxw%;;)U6gUwutc%+-byJnvibnT~wgXL??^mWFKc#&A^S& zM_NSaj&F4Gd=ANuw^)y!pzyA47XZ%AQbVVbPh$5fKKk&}b1VAN_7 z7K6))QH&_jN5S1k{vmx&CxXWUBu;Dk`9UHr3udJibB?A}v#^M#_|uIXYHeZZnrG~l zqs#m3GW(W|2P%bhIs`Xkt&`wHhredQNw|#H1)gmO`GRJft!dxdjEviW*^syijMm;> zP)7-%$~AKV8v#O%*M5`&H_zpoxIidnH|i;Cz7 z53b|fgWsS=QsFKCR#H7jl-SzjE^*XW!a>@X7Z4wIcy>v{J9azTPf&!Mp z3!$`J472j$;_lO(Z0@2fXH_BD5B5)SFBjiWG`dUd-?Vr5*g;`ZRLh*?Z#@Qm-_TQ@ z)pg6sy5501>cXf*qASNMd{@35EKB8b!0q$iKJ6w$-ZkU+mM9Joh_bQ*E)gj6TGZNF zXr{#imK0*d19%L+J`0PBh`UqQJL@0ZlypVDzYFs z2o444zb?$Zzso$0U{%VmrPlybF#N zK%R042#^Q$P))^^4m>$$$W0!485<7?qy>~zSF>x?aSiiSurA-XOucftxX@I}^Bjvt z;6zT~B}z|#i6zW*h$5Mm6E`%sL;f+}$k5Gse1FjQ>@URm2U86tH8K7n77Qr50jpg+ zgMb%{C=*TY;qF2sA8sRQI|lsv(#^aDm46O@YFTNNNz~yb9tJnr_6bk0$aQ%U6Ya~_ z=wYi##38FAI$lK;a| zeG7mWmasT+ zIC=zGxuo#0v1RXdZKWGHYI5no@oWAP9UTo2CE#7HuHJ>+aKG*5CYCDycBPR{N$Q9S z;Gvxp;gt0}lX}E{JH5p-O+xSf@26qC#u2IX%I(Nn;WcG=&S7RRHjGyz0>eB#S=~l- z_r+&Fsy7UZjX1$c3v_^%rY2%<#bjKNS~%UbCnZk~PK6$HFaEGaGg?7eCII|N2siSq zjK|`moYY5??Y8H{oG+lG%cIqM$}R`_ifmfg_*&No)V`FVX+_mu-232Pa_4AgBC>{Q zulLc{E$_);BaD>3v|VP0X#qoZVPTIV_o+v3XGH5Zl}|4NyREhtVJ{*gq6iRCpp}#} zZtChjOBuKi@1Ku<4V{fpuG^XFmQx6?@4 ze4P%vymXG!aym(JI;uU}Zo-$K`LMZgkH2AY(Rro%qy<@GQc^R`eH&xo9RkpKHGtg> zMb2KzN45xD7rG~{g@?P%JZ3w9hbdwry}5=EE);Npb~z)#o9e7UJ5)cvs>&~lfvpV<_bcPi+;#Q2!w6R4kiFK4 z^xtJNQ3J}2;*DHXdVM&_MLqsPA9upZEYSkvD9}({TlzS9n@gyQ40z+>p%jF&=$Mz>bVa0%Di9msfaj zxsu#ThD&A$&)KI56Cj5H{P&IMnb=r*dK9LP6w}O_f%psrL_EH z+iNOFR49j|J1?9(rMNpdR}(K&?6^5J;M8il5``Z8rsCn*Yi3rOIo;tf67#$Bv3N5m z-0MNhdU*EL{58#ofJg`^T}7g4ASVZ04R1(fE>GZ^_PMQA$=L3DkQ2f2`%6Yo9q4eQ#-Yx%V=Lo7XR^6ig33O68>cTS ziNoPQR^X96l)e=tDDRwMnp<4V&&e4c8!LGCuDB<}Zw=cE&Z-`%zBb&RB{mR?$^cOZ zXqrOuEdl~|K=z(Dy*b(PqUAlyi@>#CokUQ9aON`kFyldco)a-p=H#mBPrC;^`xddt z7Y~Dc6*qIA-rU~2G}QU~5OG5N>sL#ChHG&jlKq^j40mP%>_yz;I#X-1UTol4dyJt_ z);B`;2Nkz#ZXdq~fm|;;r}5dt&@dixY73-pH+&Kkvo1cj1_@jn8@^Qe12+L^Ys%oR z-zmD}HQz5>{P6Gh7SD>>#dkKYPe9F%1a4@4lan0@0TIrRNM^SIR0)7mPY`9YLIa9x zYtM}@aQ)q^)^5o3`}E|oiBZjTqFn<8Zi)P3hf1449VQ@#BPh0ONIuLJ2#ox9`zJYI zR*ei+O!y&f*in+j|M}Z%kebjR7eR#ouM4R|KCJNLA_<)!MYX8_z4*;EbDrQq}SMrFe>qEuIW0ti^s24XG9^EIoG#GA~LNHGBG(Ln3GIy9#*) z+pi_q=dxQqryO zUmfZ{71_2J%26_u!sK=7!Kpo%?Uv>w&b49LAS6haonY>_=@$6o@TX}Bs|J_88(F=E_Yc!{ z;Jbj;`PFy?C}gdhKw43Ku2JbDO`ZPnfC`BnHLKTeg>=5yJ>R%oSIx5Jp}A?NmLV-d z3D;+E;y&+vw<6=vFK>t^mvv}y=}O`mc%;TdT(!hrH?_9!9zCk0q}LeMV#{s%MxjM6 zo&mR0EA!c1fc^c(Io?n}5q|hjcW%E$=pLoPQacuxI@4>n5Dge|YVYK^AUDsKx0HO2=J57bBARZZ?j2oHpFlYF=*q zPWgy6W7yPAA2vZ$X7z6Zy)cw3MgNkk$fdEP;3Vp1f`0GCj@~c5TNpIg**nm z_y2$uBnN)-3<%U~%8fR6K5CFxPu^Gq{;p_*itwv&Ge$4RW=z96+DIRHvVowAtLUyg ziNUuUEOhOBP1?$My5#zPUBk%4L^fd44b;6&b;KhHb3z>@s@Fjr-HvOX1o_+6Xf8(= z7sWt=Cls0%fb*gItG0n&7_-;0mYThrZM!EKghIOF>L@Xwt#m^Pqf{4c= zqM}IP-+uTI+~(6e1cEZl>Na)vA*rsF6?d5H+P81tK7Nd-JdvfRrw2F~VI3gU1d%bo z-Y`&De0k+MNE!BU8?yoC`9J;ipPZn8l;FJ@x(li*b}h)wT>^gGl$o^-Bv*%O9an46 zk|viK(@yLxzClH`t3s5_Dw>{y{N0(k)@AE!T}L>ZfL=qTm10UtqH(DHetugy?}da-{cM)Z!@t~!x*HHA?Ghf6 z4c_GlH`~L-zXHj9(IJXJD+xmP8x)d>3R(4H^XZZ`ghL0yVH@Cm(Ll-iv9Jkm7EfO5 zSmm(*NhPB%*~d_skJSME^=Jx+eeCR7X|a$KsNvzWwniXCArszHaL1_5S%9pnsRo(3 zwzjs84zF@;Q4vUJX;YRNWmS5?V5ag-pzH!n+2PPOctHcGmj2yC|LM#Du!FdWeorJm ztC}t;|NK0ja&41hzU{?#x*lp=p?bfMRgAQi^JMSX9o@rNm{wlM1a{3z$ojPHF&t6j zw!K^T;=6P_cZ0UBuH=Oaw$z?*I9x+RW5*a`8n-?X$}>E1JhC~O^CCmID!|}3s7RCu z&>+i%Va4(40Z)0hQOk*Uxd40pH^X~J@FyKEf63#b)wjb=1XV~dC0uxAyR-E43tWp9 zyTv>|eI3*PB7ZO~N7*%*Zm(L3>2ak(l=@J+_U? z`H?mFBM{o}b7$|7Ew1sAgt8_p6DdR&9-`RGlnM7u?clt5$1#YyWFO`Db#|q8 zy2Dx*LYMiFuSUcsX>tt)tk=39G=V3dg@Do2BSpRYFSd=d){sV-% zl|p;_S%cWNxT%dZv4DXU`xTt^)uR!=Tok*d17%^8+quP(&J)10sqr99+3Mtv1s1VH znykDPye3;-$AMI&->nqcvAvX;O5A?=Rf!9&K+qgqJCQL7R1Mg%jWO)NCCashg*}mYftIm8LMl98LiY5y2>N%h*-(M3NdG-z_tIXP zx_2G1zFR4v#A6{x`e;7$uRVchWWr+kfH#CW!T~QhG?c&7^5|;}E)}|0@${D8hvTV| za04d7ScctE^zrCwg|-HsU#~|2m8ZPlIrX+MQD>tErM6RDSVQ61SB9qq5>GXwFVCoY zx_1p9YCR&U_}+SVexQegaNV(~Gb7~R*g9H!j@aH{vJ$}aMtT#g-8cyEpH5Y&6JLwKQQI`i8v zm*pyCB*7rSU3j{^eWC0J8{=;^%pnr;@T>Fvf9uQL<0vjx+{gzmX*rV=^tNB9&7k-VE>fvf1u)|x4ufylBL}L;ZT!aQ`IIz=?OSiz{s+KPbVgip+Es336=z( zf*=3i_(SF_?uYc?KWCo8N8b$G0JH8N^V2^m#(Y^-RkbVyejNh)?T`Fg$0b$OCJLc_ z(3dbZ_-neneUe|n3I0yLXkTbMdiNMT{mO@He`0MOf8HqbZSBZ!zcEN&RlTJ5M>6Gq zeA9n-qxOQ{^^o!jLR?)72P1;9rkkzArKib7ci^FKh@lC!oO)b}WToNG>lg0_{L6O4 z!Sp0g?4Ph*p)f+yZ|eYSs_kZ~$=G?^@zb;lsvj^< z+48-BvUsZ~)Z|Ce%Ha&<4J=Rg{ z4tp={_so|ZQ<5OUAHnl6)n3UHvo$_6wjDO$sz8rhNZ}2NE3Z4SQo5W1W`b4Uhflg( z6g2hE(sgFP!Y!yB_y$q;M$61)9tkzlvs_*i7DPG?d>?4GvBdQ4*8BN+b=})(;B^;Q zLKX#ny_ayQY;%CMBSOTY#D{s{!U5G~e%mvfCQ{W2mrj=i=6^7XM#+~&fG9L!G_wPXEKy)eTp_7 z996ipe6pbW6ZaJ=Pm7>SK%k7K`@|MguTk1(2D^r_MO^#X+yrE9LnSi#=xGXBQPJhO zb#3udqq>7@t_m+#gvB2uY|UprP0Te_5+Ji-^eXp8fQwEtCJI>Bigrlo-S)U#X3fwHNJkc;CqfQ%gCw84f9V(cBoG$jZ+skMxmvK1z{taHHZC**gpVqg1}GnN-INV0tC znKuFagPG2SwXcPtI-c>@+luVZN<4dmPge ze3Nh{?o?b{wd?u|+U+Y0;-!H`9%s`RX<#uyb>h{jMz)spTCDcVG^}XRx$&_I;h=A+ zfbEmU&C8pK+?QgjntHv!Zmz{Cp>1-<=XKx}Pc>(anYL@Z@LYEC_L%W-+xNL^=P67& z1()lwr158=%Y^`{a2m=vB5={Qnb^ZixA9AZO-S#G^-2* z^a(C~`XpD1pFPRTOVHSt!Z7W&SX4}sFvP>>G?#d=7A$Co zcX>qeF2OSM!D3?}DSK?uoWIdHgl7mB&5F!^?%VK4Eiob-;u8(2h=q5- zbwTr2gDzRxdEZfUp4%D;brJBsWY`}${^-o~QgN3xHeL@pdxiU>j_>5g+*o!f*l5w8 zHu@>h#hJ8fm-;WPXU!G)NDQKaaxr&3^aDrUf5=lRZ1b2lbTZa3Mk$67aKtH zLrP+rl^1FRZeZP=Pdph76&4v$H^JWsDe#UCA7sAglD4UAG{STxMXs>m;w|{7TOn^f z5XuMvU2T}=xmHE4(4zOQ8Pya1TT}ci*B2zG!l%OCEFuaMpz{86uR@PHt6&^@R54)TI79 z>!;sQuy+1@MJ7iL`Gaog2_TV*KUr$M{N;ovX~$kqbbl+uu>y_%HfFz`;M6~45BhU~ z%T@pDmqC`b*ht>GDZT;##0G;;T)XrS+N-L5Hrp?`(K$I}&L%61Hv`0>`b&9k%<<5B;V+sgZ5c`-+1;%cA=;3Cn}pWl}=oQZoiCqyyq?_YL#VfwLO$;DNJ z+q@~xfbX}vM=eJpFP>VTxHp8IyK&B`$-@;c^*7^Ke?f+*wJ~Rl-YY(vJZC#1jeC>< zhg;9UiT2Vjdc&V8mf`yD-)wY~!beB(r_#+~y$1FrT4i3_6bD1~;35SU?N#NTK?O)168>maiKNT`1aq$E+2@~wI*iqq+p#+dv7hWPaX zold+~nj(5^%moT+Z2h(uD?o;RF*h?6zB>=qx^W}Rwp;8McjI8ak3=v5nJ^!ZLPOto zSE%hRO}eIpS&fq+s;m70{sB1bgNAC5$Rt@gxy4-2B^h&;v_&AF`X>RwG&;wHoM5Nc z)3clGfUP*J;>!GRZ>1ECByO6{I&G&#FBQB6@A$Bq1m&lo0RiYwjA;)p$j?^@+NrE` zGVTXel%N;VAt1L+AaVT9l>6viy+9ktxQW=f$aeqLbO5MxBiLQo#Q_&!W5wPgbfsl$ zX8f(?HZhg9VDaq%K>FJTyzu6Jp*he(Qa<$v7Ia(#q#DqU7_^QCwecj`T;co61GE$* zlnUVNDBkCADE(YYvYa%&-_8CH%LIW*B?k-PSGs~I*XE)>Ii z312}oFRPxq6dTY0s6XEn0GHqin7Pi*PEdMMDW<4c2kH}M3fLZzguH8CLcMB=^ca>= z^Ag1Z4bEn8dR$XJxQK?ZZD+3Bfe;Ji%b1_qwSmr!f7L%OnhkIwn^%CU%POYLT!PX*?4k?b(LCLH;x?X3*oE7ChV+1p< zELg^`#H8_eQw3(7FX6Z`%7;JkHwvKo5Y`uS5Y!=3_h%oSNc$EULJLJOzt<|cZBqP* zd4BLqn-b5+?p{WUl0gW!vys7#X-Sfd5C26S(llIN*toy7^`$Ka$B@P^Kg3WaVg1cZ zHE6>N%cF$etq+w8bx_3xHpiNfSqbc+Cwv6^{HPvm`oM~1_ReZ^?x)~y+2 z^1*3nOs8;-;&O=6$-kKecy-zdhh`qv7XPKh11T-A7ZcJrWr3syP&%hSFfNCM{@oLS z;cYjvjubXIjd3m{wezFKaFZy zNgpkKKrp161snc=kVv@G*DpV?CDQl4=SiT`|G%FGu%S3e_kCjAFi}Jr259F;`V1*Q jkxqK_Z%qHG|87EOzDDoGn_Orn4fCqn4b=kWTlfDTfNpP3 literal 0 HcmV?d00001 diff --git a/data-solutions/data-platform-foundations/img/Data_Foundation_Multiple_project_Single_VPC.png b/data-solutions/data-platform-foundations/img/Data_Foundation_Multiple_project_Single_VPC.png new file mode 100644 index 0000000000000000000000000000000000000000..d96c90e209e856d22b6cba2b21dbd718806538d4 GIT binary patch literal 36756 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 Ee;4zIS^xk5 literal 0 HcmV?d00001 diff --git a/data-solutions/data-platform-foundations/img/three_main_workflows.png b/data-solutions/data-platform-foundations/img/three_main_workflows.png new file mode 100644 index 0000000000000000000000000000000000000000..a6b20fdb7c2ddfa982261e72995b8469e86fad07 GIT binary patch literal 49219 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 Hclo~or7(3( literal 0 HcmV?d00001 diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/00_generic_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/00_generic_variables.tf new file mode 100644 index 000000000..d227b0b40 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/00_generic_variables.tf @@ -0,0 +1,30 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "billing_account" { + description = "Billing account id." + type = string +} + +variable "parent" { + description = "Parent folder or organization in 'folders/folder_id' or 'organizations/org_id' format." + type = string +} + +variable "projects_suffix" { + description = "Project suffix to make resources unique. If no suffix is provided a random suffix will be created" + type = string + default = null +} + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_project.tf new file mode 100644 index 000000000..d8a66e024 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_project.tf @@ -0,0 +1,70 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +########################## +# project-creation +########################## +module "services-project-creation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + billing_account = var.billing_account + parent = var.parent + + name = join( + "-", + [ + var.services_project_name, + var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex + ] + ) + auto_create_network = false + services = [ + "storage-component.googleapis.com", + "sourcerepo.googleapis.com", + "stackdriver.googleapis.com", + "cloudasset.googleapis.com", + ] + + iam_additive = {} +} + +########################## +# IAM +########################## +module "master-service-account" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" + + project_id = module.services-project-creation.project_id + name = var.data_service_account_name + + depends_on = [ + module.services-project-creation + ] +} + +module "set-tf-data-admin-service-account-on-services" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + + name = module.services-project-creation.project_id + project_create = false + + iam = { + "roles/editor" = [ + "serviceAccount:${module.master-service-account.email}" + ] + } + + depends_on = [ + module.master-service-account, + ] +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf new file mode 100644 index 000000000..1ea45f57a --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf @@ -0,0 +1,25 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "services_project_name" { + description = "Project name" + type = string + default = "services" +} + +variable "data_service_account_name" { + description = "Name for the projects editor service account." + type = string + default = "projects-editor-sa" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_project.tf new file mode 100644 index 000000000..ad97839df --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_project.tf @@ -0,0 +1,57 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +########################## +# project-creation +########################## +module "landing-project-creation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + billing_account = var.billing_account + parent = var.parent + + name = join( + "-", + [ + var.landing_project_name, + var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex + ] + ) + auto_create_network = false + services = [ + "pubsub.googleapis.com", + "storage-component.googleapis.com", + ] + + iam_additive = {} +} + +########################## +# IAM +########################## +module "set-tf-data-admin-service-account-on-landing" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + + name = module.landing-project-creation.project_id + project_create = false + + iam = { + "roles/editor" = [ + "serviceAccount:${module.master-service-account.email}" + ] + } + + depends_on = [ + module.master-service-account, + ] +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_variables.tf new file mode 100644 index 000000000..e581b46e1 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_variables.tf @@ -0,0 +1,20 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "landing_project_name" { + description = "Project name" + type = string + default = "landing" +} + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_project.tf new file mode 100644 index 000000000..a5f4fa1d7 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_project.tf @@ -0,0 +1,60 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +########################## +# project-creation +########################## +module "transformation-project-creation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + billing_account = var.billing_account + parent = var.parent + + name = join( + "-", + [ + var.transformation_project_name, + var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex + ] + ) + auto_create_network = false + services = [ + "cloudbuild.googleapis.com", + "compute.googleapis.com", + "dataflow.googleapis.com", + "servicenetworking.googleapis.com", + "storage-component.googleapis.com", + ] + + iam_additive = {} +} + +########################## +# IAM +########################## +module "set-tf-data-admin-service-account-on-transformation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + + name = module.transformation-project-creation.project_id + project_create = false + + iam = { + "roles/editor" = [ + "serviceAccount:${module.master-service-account.email}" + ] + } + + depends_on = [ + module.master-service-account, + ] +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_variables.tf new file mode 100644 index 000000000..f7908cca4 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_variables.tf @@ -0,0 +1,20 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "transformation_project_name" { + description = "Project name" + type = string + default = "transformation" +} + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_project.tf new file mode 100644 index 000000000..58bf0a9eb --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_project.tf @@ -0,0 +1,59 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +########################## +# project-creation +########################## +module "dwh-project-creation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + billing_account = var.billing_account + parent = var.parent + + name = join( + "-", + [ + var.dwh_project_name, + var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex + ] + ) + auto_create_network = false + services = [ + "bigquery.googleapis.com", + "bigquerystorage.googleapis.com", + "bigqueryreservation.googleapis.com", + "storage-component.googleapis.com", + ] + + iam_additive = {} +} + +########################## +# IAM +########################## +module "set-tf-data-admin-service-account-on-dwh" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + + name = module.dwh-project-creation.project_id + project_create = false + + iam = { + "roles/editor" = [ + "serviceAccount:${module.master-service-account.email}" + ] + } + + depends_on = [ + module.master-service-account, + ] +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_variables.tf new file mode 100644 index 000000000..4c833ee4e --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_variables.tf @@ -0,0 +1,20 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "dwh_project_name" { + description = "Project name" + type = string + default = "dwh" +} + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_project.tf new file mode 100644 index 000000000..3fdaa2e67 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_project.tf @@ -0,0 +1,62 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +########################## +# project-creation +########################## +module "datamart-project-creation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + billing_account = var.billing_account + parent = var.parent + + name = join( + "-", + [ + var.datamart_project_name, + var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex + ] + ) + auto_create_network = false + services = [ + "bigtable.googleapis.com", + "bigtableadmin.googleapis.com", + "bigquery.googleapis.com", + "bigquerystorage.googleapis.com", + "bigqueryreservation.googleapis.com", + "storage-component.googleapis.com", + ] + + iam_additive = {} +} + +########################## +# IAM +########################## +module "set-tf-data-admin-service-account-on-datamart" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + + name = module.datamart-project-creation.project_id + project_create = false + + iam = { + "roles/editor" = [ + "serviceAccount:${module.master-service-account.email}" + ] + } + + depends_on = [ + module.master-service-account, + ] +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_variables.tf new file mode 100644 index 000000000..d104f1217 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_variables.tf @@ -0,0 +1,20 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "datamart_project_name" { + description = "Project name" + type = string + default = "datamart" +} + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/README.md b/data-solutions/data-platform-foundations/infra/tf-phase1/README.md new file mode 100644 index 000000000..3faa07603 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/README.md @@ -0,0 +1,87 @@ +# Data Platform Foundations - Phase 1 + +## General + +This is the first part deploying the Data Platform foundations. In this part we will create the infrastructure needed for the foundational build. This includes projects and service accounts. + +Since this example is intended for the data infra engineers we do expect that an initial organization / folder and service account with owner privileges will be pre-created and provided as variables. + +This example assume the next items were already created and provided: + +- Organization / folder +- Terraform runner Service account with owner permissions on the above organization / folder + +This example will create the next projects: + +- Common services +- Landing +- Orchestration & Transformation +- DWH +- Datamart + +A master service account named projects-editor-sa will be created under common services project and will be granted editor permissions on all the projects in scope. + +![Data Foundation - Phase 1](../../img/Data_Foundation-phase1.png) + +## Running the example + +To create the infrastructure: + +- Specify your variables in a `terraform.tvars` + +```tfm +billing_account = "BILLING ACCOUNT ID." +parent = "Parent folder or organization in 'folders/folder_id' or 'organizations/org_id' format." +``` + +- Place the service account key in the terraform folder +- Go through the following steps to create resources: + +```bash +terraform init +terraform apply +``` + +Once done testing, you can clean up resources by running: + +```bash +terraform destroy +``` + + +## Requirements + +| Name | Version | +|------|---------| +| terraform | >= 0.13 | + +## Providers + +| Name | Version | +|------|---------| +| random | n/a | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| billing\_account | Billing account id. | `string` | n/a | ✓ | +| data\_service\_account\_name | Name for the projects editor service account. | `string` | `"projects-editor-sa"` | | +| datamart\_project\_name | Project name | `string` | `"datamart"` | | +| dwh\_project\_name | Project name | `string` | `"dwh"` | | +| landing\_project\_name | Project name | `string` | `"landing"` | | +| parent | Parent folder or organization in 'folders/folder\_id' or 'organizations/org\_id' format. | `string` | n/a | ✓ | +| projects\_suffix | Project suffix to make resources unique. If no suffix is provided a random suffix will be created | `string` | `null` | | +| services\_project\_name | Project name | `string` | `"services"` | | +| transformation\_project\_name | Project name | `string` | `"transformation"` | | + +## Outputs + +| Name | Description | +|------|-------------| +| datamart-project | Datamart project created. | +| dwh-project | DWH project created. | +| landing-project | Landing project created. | +| services-project | Services project created. | +| transformation-project | Transformation project created. | + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/main.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/main.tf new file mode 100644 index 000000000..774a21927 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/main.tf @@ -0,0 +1,23 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + module_version = "4.2.0" +} + +resource "random_id" "suffix" { + byte_length = 4 +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf new file mode 100644 index 000000000..94b53ffdb --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf @@ -0,0 +1,40 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "services-project" { + description = "Services project created." + value = module.services-project-creation +} + +output "landing-project" { + description = "Landing project created." + value = module.landing-project-creation +} + +output "transformation-project" { + description = "Transformation project created." + value = module.transformation-project-creation +} + +output "dwh-project" { + description = "DWH project created." + value = module.dwh-project-creation +} + +output "datamart-project" { + description = "Datamart project created." + value = module.datamart-project-creation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/versions.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/versions.tf new file mode 100644 index 000000000..ab35a81c8 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/versions.tf @@ -0,0 +1,17 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +terraform { + required_version = ">= 0.13" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/01_services.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/01_services.tf new file mode 100644 index 000000000..adc18088a --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/01_services.tf @@ -0,0 +1,40 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# Project # +############################################################################### +module "project-id-services" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + name = var.services_project_id + project_create = false +} + +############################################################################### +# IAM # +############################################################################### +module "services-default-service-accounts" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" + project_id = var.services_project_id + + name = var.services_service_account + + iam_project_roles = { + "${var.services_project_id}" = [ + "roles/editor", + ] + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/01_services_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/01_services_variables.tf new file mode 100644 index 000000000..f6f2d2e10 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/01_services_variables.tf @@ -0,0 +1,29 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# services # +############################################################################### +variable "services_project_id" { + description = "services project ID." + type = string +} + +variable "services_service_account" { + description = "services service accounts list." + type = string + default = "sa-services" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing.tf new file mode 100644 index 000000000..6d4d10569 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing.tf @@ -0,0 +1,86 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + landing_pubsub = merge({ + for k, v in var.landing_pubsub : + k => { + name = v.name + subscriptions = v.subscriptions + subscription_iam = merge({ + for s_k, s_v in v.subscription_iam : + s_k => merge(s_v, { "roles/pubsub.subscriber" : ["serviceAccount:${module.transformation-default-service-accounts.email}"] }) + }) + } + }) +} + +############################################################################### +# Project # +############################################################################### +module "project-id-landing" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + name = var.landing_project_id + project_create = false +} + +############################################################################### +# IAM # +############################################################################### +module "landing-default-service-accounts" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" + project_id = var.landing_project_id + + name = var.landing_service_account + + iam_project_roles = { + "${var.landing_project_id}" = [ + "roles/pubsub.publisher", + ] + } +} + +############################################################################### +# GCS # +############################################################################### +module "bucket-landing" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/gcs?ref=v4.2.0" + project_id = var.landing_project_id + prefix = var.landing_project_id + iam = { + "roles/storage.objectCreator" = ["serviceAccount:${module.landing-default-service-accounts.email}"], + "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], + } + + for_each = var.landing_buckets + + name = each.value.name + location = each.value.location +} + +############################################################################### +# Pub/Sub # +############################################################################### +module "pubsub-landing" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/pubsub?ref=v4.2.0" + project_id = var.landing_project_id + + for_each = local.landing_pubsub + + name = each.value.name + subscriptions = each.value.subscriptions + subscription_iam = each.value.subscription_iam +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf new file mode 100644 index 000000000..f4d594088 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf @@ -0,0 +1,82 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# landing # +############################################################################### +variable "landing_project_id" { + description = "landing project ID." + type = string +} + +variable "landing_service_account" { + description = "landing service accounts list." + type = string + default = "sa-landing" +} + +variable "landing_buckets" { + description = "List of landing buckets to create" + type = map(any) + default = { + raw-data = { + name = "raw-data" + location = "EU" + }, + data-schema = { + name = "data-schema" + location = "EU" + }, + } +} + +variable "landing_pubsub" { + description = "List of landing buckets to create" + type = map(any) + default = { + landing_1 = { + name = "landing-1" + subscriptions = { + sub1 = { + labels = {}, + options = { + ack_deadline_seconds = null + message_retention_duration = null + retain_acked_messages = false + expiration_policy_ttl = null + } + }, + sub2 = { + labels = {}, + options = { + ack_deadline_seconds = null + message_retention_duration = null + retain_acked_messages = false + expiration_policy_ttl = null + } + }, + } + subscription_iam = { + sub1 = { + "roles/pubsub.subscriber" = [] + } + sub2 = { + "roles/pubsub.subscriber" = [] + } + } + } + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation.tf new file mode 100644 index 000000000..47dbcd131 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation.tf @@ -0,0 +1,76 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# Project # +############################################################################### +module "project-id-transformation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + name = var.transformation_project_id + project_create = false +} + +############################################################################### +# IAM # +############################################################################### +module "transformation-default-service-accounts" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" + project_id = var.transformation_project_id + + name = var.transformation_service_account + + iam_project_roles = { + "${var.transformation_project_id}" = [ + "roles/logging.logWriter", + "roles/monitoring.metricWriter", + "roles/dataflow.admin", + "roles/iam.serviceAccountUser", + "roles/bigquery.dataOwner", + "roles/bigquery.jobUser", + "roles/dataflow.worker", + "roles/bigquery.metadataViewer", + "roles/storage.objectViewer", + ] + } +} + +############################################################################### +# Network # +############################################################################### +module "vpc-transformation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/net-vpc?ref=v4.2.0" + + project_id = var.transformation_project_id + name = var.transformation_vpc_name + subnets = var.transformation_subnets +} + +############################################################################### +# GCS # +############################################################################### +module "bucket-transformation" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/gcs?ref=v4.2.0" + project_id = var.transformation_project_id + prefix = var.transformation_project_id + + for_each = var.transformation_buckets + + name = each.value.name + location = each.value.location + iam = { + "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf new file mode 100644 index 000000000..4a3992678 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf @@ -0,0 +1,63 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# Orchestration and Transformation # +############################################################################### +variable "transformation_project_id" { + description = "Orchestration and Transformation project ID." + type = string +} + +variable "transformation_service_account" { + description = "transformation service accounts list." + type = string + default = "sa-transformation" +} + +variable "transformation_vpc_name" { + description = "Name of the VPC created in the transformation Project." + type = string + default = "transformation-vpc" +} + +variable "transformation_subnets" { + description = "List of subnets to create in the transformation Project." + type = list(any) + default = [ + { + name = "transformation-subnet", + ip_cidr_range = "10.1.0.0/20", + secondary_ip_range = {}, + region = "europe-west3" + }, + ] +} + +variable "transformation_buckets" { + description = "List of transformation buckets to create" + type = map(any) + default = { + temp = { + name = "temp" + location = "EU" + }, + templates = { + name = "templates" + location = "EU" + }, + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh.tf new file mode 100644 index 000000000..5a4341637 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh.tf @@ -0,0 +1,59 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# Project # +############################################################################### +module "project-id-dwh" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + name = var.dwh_project_id + project_create = false +} + +############################################################################### +# IAM # +############################################################################### +module "dwh-default-service-accounts" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" + project_id = var.dwh_project_id + + name = var.dwh_service_account +} + +############################################################################### +# Bigquery # +############################################################################### +module "bigquery-datasets-dwh" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/bigquery-dataset?ref=v4.2.0" + project_id = var.dwh_project_id + + for_each = var.dwh_bq_datasets + + id = each.value.id + location = each.value.location + + access = { + owner = { role = "OWNER", type = "user" } + reader = { role = "READER", type = "user" } + } + + access_identities = { + owner = module.transformation-default-service-accounts.email + reader = module.dwh-default-service-accounts.email + } + + +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf new file mode 100644 index 000000000..e69f7eed6 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf @@ -0,0 +1,40 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# DWH # +############################################################################### +variable "dwh_project_id" { + description = "dwh project ID." + type = string +} + +variable "dwh_service_account" { + description = "dwh service accounts list." + type = string + default = "sa-dwh" +} + +variable "dwh_bq_datasets" { + description = "DWH Bigquery datasets" + type = map(any) + default = { + bq_raw_dataset = { + id = "bq_raw_dataset" + location = "EU", + } + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart.tf new file mode 100644 index 000000000..241a4dcd1 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart.tf @@ -0,0 +1,65 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# Project # +############################################################################### +module "project-id-datamart" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" + name = var.datamart_project_id + project_create = false +} + +############################################################################### +# IAM # +############################################################################### +module "datamart-default-service-accounts" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" + project_id = var.datamart_project_id + + name = var.datamart_service_account + + iam_project_roles = { + "${var.datamart_project_id}" = [ + "roles/editor", + ] + } +} + +############################################################################### +# Bigquery # +############################################################################### +data "google_service_account" "datamart" { + account_id = var.datamart_service_account + project = var.datamart_project_id +} + +module "bigquery-datasets-datamart" { + source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/bigquery-dataset?ref=v4.2.0" + project_id = var.datamart_project_id + + for_each = var.datamart_bq_datasets + + id = each.value.id + location = each.value.location + + access = { + owner = { role = "OWNER", type = "user" } + } + access_identities = { + owner = module.datamart-default-service-accounts.email + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf new file mode 100644 index 000000000..f10aab248 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf @@ -0,0 +1,40 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +############################################################################### +# Datamart # +############################################################################### +variable "datamart_project_id" { + description = "datamart project ID." + type = string +} + +variable "datamart_service_account" { + description = "datamart service accounts list." + type = string + default = "sa-datamart" +} + +variable "datamart_bq_datasets" { + description = "Datamart Bigquery datasets" + type = map(any) + default = { + bq_datamart_dataset = { + id = "bq_datamart_dataset" + location = "EU", + } + } +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/README.md b/data-solutions/data-platform-foundations/infra/tf-phase2/README.md new file mode 100644 index 000000000..96b276a60 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/README.md @@ -0,0 +1,93 @@ +# Data Platform Foundations - Phase 2 + +## General + +Now that we have all the needed project, we will create all the needed assets to store and process the data. + +![Data Foundation - Phase 2](../../img/Data_Foundation-phase2.png) + +This example will create the next resources per project: + +- Common +- Landing + - [x] GCS + - [x] Pub/Sub +- Orchestration & Transformation + - [x] Dataflow +- DWH + - [x] Bigquery (L0/1/2) + - [x] GCS +- Datamart + - [x] Bigquery (views/table) + - [x] GCS + - [ ] BigTable + +## Running the example + +To create the infrastructure: + +- Specify your variables in a `terraform.tvars` + +```tfm +services_project_id = "SERVICES-PROJECT_ID" +landing_project_id = "LANDING-PROJECT_ID" +transformation_project_id = "TRANSFORMATION-PROJECT_ID" +dwh_project_id = "DWH-PROJECT_ID" +datamart_project_id = "DATAMART-PROJECT_ID" +``` + +- Place the data_service_account_name service account (the service account was created in phase 1) key in the terraform folder +- Go through the following steps to create resources: + +```bash +terraform init +terraform apply +``` + +Once done testing, you can clean up resources by running: + +```bash +terraform destroy +``` + + +## Requirements + +| Name | Version | +|------|---------| +| terraform | >= 0.13 | + +## Providers + +| Name | Version | +|------|---------| +| google | n/a | + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| datamart\_bq\_datasets | Datamart Bigquery datasets | `map(any)` |

{
"bq_datamart_dataset": {
"id": "bq_datamart_dataset",
"location": "EU"
}
}
| | +| datamart\_project\_id | datamart project ID. | `string` | n/a | ✓ | +| datamart\_service\_account | datamart service accounts list. | `string` | `"sa-datamart"` | | +| dwh\_bq\_datasets | DWH Bigquery datasets | `map(any)` |
{
"bq_raw_dataset": {
"id": "bq_raw_dataset",
"location": "EU"
}
}
| | +| dwh\_project\_id | dwh project ID. | `string` | n/a | ✓ | +| dwh\_service\_account | dwh service accounts list. | `string` | `"sa-dwh"` | | +| landing\_buckets | List of landing buckets to create | `map(any)` |
{
"data-schema": {
"location": "EU",
"name": "data-schema"
},
"raw-data": {
"location": "EU",
"name": "raw-data"
}
}
| | +| landing\_project\_id | landing project ID. | `string` | n/a | ✓ | +| landing\_pubsub | List of landing buckets to create | `map(any)` |
{
"landing_1": {
"name": "landing-1",
"subscription_iam": {
"sub1": {
"roles/pubsub.subscriber": []
},
"sub2": {
"roles/pubsub.subscriber": []
}
},
"subscriptions": {
"sub1": {
"labels": {},
"options": {
"ack_deadline_seconds": null,
"expiration_policy_ttl": null,
"message_retention_duration": null,
"retain_acked_messages": true
}
},
"sub2": {
"labels": {},
"options": {
"ack_deadline_seconds": null,
"expiration_policy_ttl": null,
"message_retention_duration": null,
"retain_acked_messages": true
}
}
}
}
}
| | +| landing\_service\_account | landing service accounts list. | `string` | `"sa-landing"` | | +| services\_project\_id | services project ID. | `string` | n/a | ✓ | +| services\_service\_account | services service accounts list. | `string` | `"sa-services"` | | +| transformation\_buckets | List of transformation buckets to create | `map(any)` |
{
"temp": {
"location": "EU",
"name": "temp"
},
"templates": {
"location": "EU",
"name": "templates"
}
}
| | +| transformation\_project\_id | Orchestration and Transformation project ID. | `string` | n/a | ✓ | +| transformation\_service\_account | transformation service accounts list. | `string` | `"sa-transformation"` | | +| transformation\_subnets | List of subnets to create in the transformation Project. | `list(any)` |
[
{
"ip_cidr_range": "10.1.0.0/20",
"name": "transformation-subnet",
"region": "europe-west3",
"secondary_ip_range": {}
}
]
| | +| transformation\_vpc\_name | Name of the VPC created in the transformation Project. | `string` | `"transformation-vpc"` | | + +## Outputs + +| Name | Description | +|------|-------------| +| vpc-transformation-output | Transformation VPC details | + diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/main.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/main.tf new file mode 100644 index 000000000..e375e0ae3 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/main.tf @@ -0,0 +1,19 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + module_version = "4.2.0" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf new file mode 100644 index 000000000..1543163ec --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "vpc-transformation-output" { + description = "Transformation VPC details" + value = module.vpc-transformation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/versions.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/versions.tf new file mode 100644 index 000000000..a9701d5ba --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/versions.tf @@ -0,0 +1,17 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +terraform { + required_version = ">= 0.13" +} \ No newline at end of file diff --git a/data-solutions/data-platform-foundations/manageing_multiple_environments.md b/data-solutions/data-platform-foundations/manageing_multiple_environments.md new file mode 100644 index 000000000..c6ea0893d --- /dev/null +++ b/data-solutions/data-platform-foundations/manageing_multiple_environments.md @@ -0,0 +1,27 @@ +# Manageing Multiple Environments + +Terraform is a great tool for provisioning immutable infrastructure. +There are several ways to get Terraform to provision different environments using one repo. Here I’m going to use the most basic and naive method - the State separation. +State separation signals more mature usage of Terraform but with additional maturity comes additional complexity. +There are two primary methods to separate state between environments: directories and workspaces. I’m going to use the directory method. + +For this example I’ll assume we have 3 environments: + +- Dev +- QA +- Prod + +```bash +export data_platform_folder="dpm" + +mkdir ${data_platform_folder} +cd ${data_platform_folder} + +git clone https://github.com/yorambenyaacov/cloud-foundation-fabric.git dev + +git clone https://github.com/yorambenyaacov/cloud-foundation-fabric.git prod + +git clone https://github.com/yorambenyaacov/cloud-foundation-fabric.git qa +``` + +Now you have a directory per environment in which you can do all the needed configurations (tfvars files) and provision it. From 33f3a9834d788244ce5c1a16f35947554bd4983d Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Tue, 18 May 2021 20:00:45 +0300 Subject: [PATCH 02/19] Add Data Platform Foundations description to the data-solutions README file --- data-solutions/README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/data-solutions/README.md b/data-solutions/README.md index 18e438251..33e22153d 100644 --- a/data-solutions/README.md +++ b/data-solutions/README.md @@ -14,3 +14,10 @@ They are meant to be used as minimal but complete starting points to create actu ### Cloud Storage to Bigquery with Cloud Dataflow
This [example](./gcs-to-bq-with-dataflow/) implements [Cloud Storage](https://cloud.google.com/kms/docs/cmek) to Bigquery data import using Cloud Dataflow. All resources use CMEK hosted in Cloud KMS running in a centralized project. The example shows the basic resources and permissions for the typical use case to read, transform and import data from Cloud Storage to Bigquery. +
+ +### Data Platform Foundations + + +This [example](./data-platform-foundations/) implements a **robust and flexible** Data Foundation on GCP that provides **opinionated defaults** while allowing customers to **build and scale** out additional data pipelines **quickly and reliably**. +
From 256bbcec61f9005b24c32aea8bc70cf7679ffb97 Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Tue, 18 May 2021 20:02:13 +0300 Subject: [PATCH 03/19] Link text update --- data-solutions/data-platform-foundations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-solutions/data-platform-foundations/README.md b/data-solutions/data-platform-foundations/README.md index 269e506a5..41934d468 100644 --- a/data-solutions/data-platform-foundations/README.md +++ b/data-solutions/data-platform-foundations/README.md @@ -27,7 +27,7 @@ This example assume the next items were already created and provided: Building the platform is composed of 4 steps: -1) [(Optional) Managed resources and services](./manageing_multiple_environments.md) +1) [(Optional) Manageing Multiple Environments](./manageing_multiple_environments.md) 1) [Data Platform Foundations - Phase 1: Building the projects](./infra/tf-phase1/README.md) 1) [Data Platform Foundations - Phase 2: Deploy assets](./infra/tf-phase2/README.md) 1) [(Optional) Manual pipeline Example](./data-pipeline/README.md) From 8610ec84a7a80fd5388246b19c5c82f3cfb03595 Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Tue, 18 May 2021 20:03:04 +0300 Subject: [PATCH 04/19] Documents list reordering --- data-solutions/data-platform-foundations/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data-solutions/data-platform-foundations/README.md b/data-solutions/data-platform-foundations/README.md index 41934d468..cdaaff615 100644 --- a/data-solutions/data-platform-foundations/README.md +++ b/data-solutions/data-platform-foundations/README.md @@ -27,10 +27,10 @@ This example assume the next items were already created and provided: Building the platform is composed of 4 steps: -1) [(Optional) Manageing Multiple Environments](./manageing_multiple_environments.md) 1) [Data Platform Foundations - Phase 1: Building the projects](./infra/tf-phase1/README.md) 1) [Data Platform Foundations - Phase 2: Deploy assets](./infra/tf-phase2/README.md) 1) [(Optional) Manual pipeline Example](./data-pipeline/README.md) +1) [(Optional) Manageing Multiple Environments](./manageing_multiple_environments.md) ## TODO list From 097e4da81830bbea2ce8910a5bff4b6e20ecd10e Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Sun, 23 May 2021 13:46:47 +0300 Subject: [PATCH 05/19] Renaming and reordering the files --- .../infra/tf-phase1/README.md | 57 +++++++++++++++++-- ...atamart_project.tf => datamart_project.tf} | 0 .../tf-phase1/datamart_project_output.tf | 20 +++++++ ...ables.tf => datamart_project_variables.tf} | 0 .../{04_dwh_project.tf => dwh_project.tf} | 0 .../infra/tf-phase1/dwh_project_output.tf | 20 +++++++ ..._variables.tf => dwh_project_variables.tf} | 0 ..._landing_project.tf => landing_project.tf} | 0 .../infra/tf-phase1/landing_project_output.tf | 20 +++++++ ...iables.tf => landing_project_variables.tf} | 0 .../infra/tf-phase1/outputs.tf | 25 -------- ...ervices_project.tf => services_project.tf} | 0 .../tf-phase1/services_project_output.tf | 20 +++++++ ...ables.tf => services_project_variables.tf} | 12 ++-- ...n_project.tf => transformation_project.tf} | 0 .../transformation_project_output.tf | 18 ++++++ ...tf => transformation_project_variables.tf} | 0 .../{00_generic_variables.tf => variables.tf} | 0 .../infra/tf-phase2/README.md | 28 ++++++++- .../{05_datamart.tf => datamart_project.tf} | 0 .../tf-phase2/datamart_project_output.tf | 15 +++++ ...ables.tf => datamart_project_variables.tf} | 22 +++---- .../tf-phase2/{04_dwh.tf => dwh_project.tf} | 0 .../infra/tf-phase2/dwh_project_output.tf | 15 +++++ ..._variables.tf => dwh_project_variables.tf} | 22 +++---- .../{02_landing.tf => landing_project.tf} | 0 .../infra/tf-phase2/landing_project_output.tf | 15 +++++ ...iables.tf => landing_project_variables.tf} | 22 +++---- .../infra/tf-phase2/outputs.tf | 5 -- .../{01_services.tf => services_project.tf} | 0 .../tf-phase2/services_project_output.tf | 15 +++++ ...ables.tf => services_project_variables.tf} | 0 ...formation.tf => transformation_project.tf} | 0 .../transformation_project_output.tf | 20 +++++++ ...tf => transformation_project_variables.tf} | 38 ++++++------- .../infra/tf-phase2/variables.tf | 14 +++++ 36 files changed, 329 insertions(+), 94 deletions(-) rename data-solutions/data-platform-foundations/infra/tf-phase1/{05_datamart_project.tf => datamart_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase1/{05_datamart_variables.tf => datamart_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase1/{04_dwh_project.tf => dwh_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase1/{04_dwh_variables.tf => dwh_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase1/{02_landing_project.tf => landing_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase1/{02_landing_variables.tf => landing_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase1/{01_services_project.tf => services_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/services_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase1/{01_services_variables.tf => services_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase1/{03_transformation_project.tf => transformation_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase1/{03_transformation_variables.tf => transformation_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase1/{00_generic_variables.tf => variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase2/{05_datamart.tf => datamart_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase2/{05_datamart_variables.tf => datamart_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase2/{04_dwh.tf => dwh_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase2/{04_dwh_variables.tf => dwh_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase2/{02_landing.tf => landing_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase2/{02_landing_variables.tf => landing_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase2/{01_services.tf => services_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/services_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase2/{01_services_variables.tf => services_project_variables.tf} (100%) rename data-solutions/data-platform-foundations/infra/tf-phase2/{03_transformation.tf => transformation_project.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_output.tf rename data-solutions/data-platform-foundations/infra/tf-phase2/{03_transformation_variables.tf => transformation_project_variables.tf} (100%) create mode 100644 data-solutions/data-platform-foundations/infra/tf-phase2/variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/README.md b/data-solutions/data-platform-foundations/infra/tf-phase1/README.md index 3faa07603..b29eb0596 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/README.md +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/README.md @@ -63,25 +63,74 @@ terraform destroy ## Inputs +### General inputs + | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| | billing\_account | Billing account id. | `string` | n/a | ✓ | -| data\_service\_account\_name | Name for the projects editor service account. | `string` | `"projects-editor-sa"` | | -| datamart\_project\_name | Project name | `string` | `"datamart"` | | -| dwh\_project\_name | Project name | `string` | `"dwh"` | | -| landing\_project\_name | Project name | `string` | `"landing"` | | | parent | Parent folder or organization in 'folders/folder\_id' or 'organizations/org\_id' format. | `string` | n/a | ✓ | | projects\_suffix | Project suffix to make resources unique. If no suffix is provided a random suffix will be created | `string` | `null` | | + +### Datamart project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| datamart\_project\_name | Project name | `string` | `"datamart"` | | + +### DWH project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| dwh\_project\_name | Project name | `string` | `"dwh"` | | + +### Landing project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| landing\_project\_name | Project name | `string` | `"landing"` | | + +### Services project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| data\_service\_account\_name | Name for the projects editor service account. | `string` | `"projects-editor-sa"` | | | services\_project\_name | Project name | `string` | `"services"` | | + +### Transformation project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| | transformation\_project\_name | Project name | `string` | `"transformation"` | | ## Outputs +### Datamart project outputs + | Name | Description | |------|-------------| | datamart-project | Datamart project created. | + +### DWH project outputs + +| Name | Description | +|------|-------------| | dwh-project | DWH project created. | + +### Landing project outputs + +| Name | Description | +|------|-------------| | landing-project | Landing project created. | + +### Services project outputs + +| Name | Description | +|------|-------------| | services-project | Services project created. | + +### Transformation project outputs + +| Name | Description | +|------|-------------| | transformation-project | Transformation project created. | diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_project.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_output.tf new file mode 100644 index 000000000..d9168fdf6 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_output.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "datamart-project" { + description = "Datamart project created." + value = module.datamart-project-creation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/05_datamart_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_project.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_output.tf new file mode 100644 index 000000000..e410ca576 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_output.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "dwh-project" { + description = "DWH project created." + value = module.dwh-project-creation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/04_dwh_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_project.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_output.tf new file mode 100644 index 000000000..604b4bcc3 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_output.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "landing-project" { + description = "Landing project created." + value = module.landing-project-creation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/02_landing_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf index 94b53ffdb..85ba995e5 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf @@ -13,28 +13,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -output "services-project" { - description = "Services project created." - value = module.services-project-creation -} - -output "landing-project" { - description = "Landing project created." - value = module.landing-project-creation -} - -output "transformation-project" { - description = "Transformation project created." - value = module.transformation-project-creation -} - -output "dwh-project" { - description = "DWH project created." - value = module.dwh-project-creation -} - -output "datamart-project" { - description = "Datamart project created." - value = module.datamart-project-creation -} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/01_services_project.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_output.tf new file mode 100644 index 000000000..190fc5169 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_output.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "services-project" { + description = "Services project created." + value = module.services-project-creation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/services_project_variables.tf index 1ea45f57a..98882a511 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/01_services_variables.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_variables.tf @@ -12,14 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. -variable "services_project_name" { - description = "Project name" - type = string - default = "services" -} - variable "data_service_account_name" { description = "Name for the projects editor service account." type = string default = "projects-editor-sa" } + +variable "services_project_name" { + description = "Project name" + type = string + default = "services" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_project.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_output.tf new file mode 100644 index 000000000..08bf8500a --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_output.tf @@ -0,0 +1,18 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +output "transformation-project" { + description = "Transformation project created." + value = module.transformation-project-creation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/03_transformation_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/00_generic_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/00_generic_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/README.md b/data-solutions/data-platform-foundations/infra/tf-phase2/README.md index 96b276a60..27594d190 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/README.md +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/README.md @@ -65,20 +65,42 @@ terraform destroy ## Inputs +### Services project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| +| services\_project\_id | services project ID. | `string` | n/a | ✓ | +| services\_service\_account | services service accounts list. | `string` | `"sa-services"` | | + +### Datamart project inputs + | Name | Description | Type | Default | Required | |------|-------------|------|---------|:--------:| | datamart\_bq\_datasets | Datamart Bigquery datasets | `map(any)` |
{
"bq_datamart_dataset": {
"id": "bq_datamart_dataset",
"location": "EU"
}
}
| | | datamart\_project\_id | datamart project ID. | `string` | n/a | ✓ | | datamart\_service\_account | datamart service accounts list. | `string` | `"sa-datamart"` | | + +### DWH project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| | dwh\_bq\_datasets | DWH Bigquery datasets | `map(any)` |
{
"bq_raw_dataset": {
"id": "bq_raw_dataset",
"location": "EU"
}
}
| | | dwh\_project\_id | dwh project ID. | `string` | n/a | ✓ | | dwh\_service\_account | dwh service accounts list. | `string` | `"sa-dwh"` | | + +### Landing project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| | landing\_buckets | List of landing buckets to create | `map(any)` |
{
"data-schema": {
"location": "EU",
"name": "data-schema"
},
"raw-data": {
"location": "EU",
"name": "raw-data"
}
}
| | | landing\_project\_id | landing project ID. | `string` | n/a | ✓ | | landing\_pubsub | List of landing buckets to create | `map(any)` |
{
"landing_1": {
"name": "landing-1",
"subscription_iam": {
"sub1": {
"roles/pubsub.subscriber": []
},
"sub2": {
"roles/pubsub.subscriber": []
}
},
"subscriptions": {
"sub1": {
"labels": {},
"options": {
"ack_deadline_seconds": null,
"expiration_policy_ttl": null,
"message_retention_duration": null,
"retain_acked_messages": true
}
},
"sub2": {
"labels": {},
"options": {
"ack_deadline_seconds": null,
"expiration_policy_ttl": null,
"message_retention_duration": null,
"retain_acked_messages": true
}
}
}
}
}
| | | landing\_service\_account | landing service accounts list. | `string` | `"sa-landing"` | | -| services\_project\_id | services project ID. | `string` | n/a | ✓ | -| services\_service\_account | services service accounts list. | `string` | `"sa-services"` | | + +### Transformation project inputs + +| Name | Description | Type | Default | Required | +|------|-------------|------|---------|:--------:| | transformation\_buckets | List of transformation buckets to create | `map(any)` |
{
"temp": {
"location": "EU",
"name": "temp"
},
"templates": {
"location": "EU",
"name": "templates"
}
}
| | | transformation\_project\_id | Orchestration and Transformation project ID. | `string` | n/a | ✓ | | transformation\_service\_account | transformation service accounts list. | `string` | `"sa-transformation"` | | @@ -87,6 +109,8 @@ terraform destroy ## Outputs +### Transformation project outputs + | Name | Description | |------|-------------| | vpc-transformation-output | Transformation VPC details | diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_output.tf new file mode 100644 index 000000000..85ba995e5 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_output.tf @@ -0,0 +1,15 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_variables.tf index f10aab248..41ccbab8c 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/05_datamart_variables.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_variables.tf @@ -17,17 +17,6 @@ ############################################################################### # Datamart # ############################################################################### -variable "datamart_project_id" { - description = "datamart project ID." - type = string -} - -variable "datamart_service_account" { - description = "datamart service accounts list." - type = string - default = "sa-datamart" -} - variable "datamart_bq_datasets" { description = "Datamart Bigquery datasets" type = map(any) @@ -38,3 +27,14 @@ variable "datamart_bq_datasets" { } } } + +variable "datamart_project_id" { + description = "datamart project ID." + type = string +} + +variable "datamart_service_account" { + description = "datamart service accounts list." + type = string + default = "sa-datamart" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_output.tf new file mode 100644 index 000000000..85ba995e5 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_output.tf @@ -0,0 +1,15 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_variables.tf index e69f7eed6..0b29da69d 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/04_dwh_variables.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_variables.tf @@ -17,17 +17,6 @@ ############################################################################### # DWH # ############################################################################### -variable "dwh_project_id" { - description = "dwh project ID." - type = string -} - -variable "dwh_service_account" { - description = "dwh service accounts list." - type = string - default = "sa-dwh" -} - variable "dwh_bq_datasets" { description = "DWH Bigquery datasets" type = map(any) @@ -38,3 +27,14 @@ variable "dwh_bq_datasets" { } } } + +variable "dwh_project_id" { + description = "dwh project ID." + type = string +} + +variable "dwh_service_account" { + description = "dwh service accounts list." + type = string + default = "sa-dwh" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/02_landing.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/landing_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_output.tf new file mode 100644 index 000000000..85ba995e5 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_output.tf @@ -0,0 +1,15 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_variables.tf index f4d594088..f4e8dd6a7 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/02_landing_variables.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_variables.tf @@ -17,17 +17,6 @@ ############################################################################### # landing # ############################################################################### -variable "landing_project_id" { - description = "landing project ID." - type = string -} - -variable "landing_service_account" { - description = "landing service accounts list." - type = string - default = "sa-landing" -} - variable "landing_buckets" { description = "List of landing buckets to create" type = map(any) @@ -43,6 +32,11 @@ variable "landing_buckets" { } } +variable "landing_project_id" { + description = "landing project ID." + type = string +} + variable "landing_pubsub" { description = "List of landing buckets to create" type = map(any) @@ -80,3 +74,9 @@ variable "landing_pubsub" { } } } + +variable "landing_service_account" { + description = "landing service accounts list." + type = string + default = "sa-landing" +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf index 1543163ec..85ba995e5 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf @@ -13,8 +13,3 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -output "vpc-transformation-output" { - description = "Transformation VPC details" - value = module.vpc-transformation -} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/01_services.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/services_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/01_services.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/services_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/services_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/services_project_output.tf new file mode 100644 index 000000000..85ba995e5 --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/services_project_output.tf @@ -0,0 +1,15 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/01_services_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/services_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/01_services_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/services_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_output.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_output.tf new file mode 100644 index 000000000..1543163ec --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_output.tf @@ -0,0 +1,20 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +output "vpc-transformation-output" { + description = "Transformation VPC details" + value = module.vpc-transformation +} diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf rename to data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_variables.tf index 4a3992678..f3904859d 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/03_transformation_variables.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_variables.tf @@ -17,6 +17,21 @@ ############################################################################### # Orchestration and Transformation # ############################################################################### +variable "transformation_buckets" { + description = "List of transformation buckets to create" + type = map(any) + default = { + temp = { + name = "temp" + location = "EU" + }, + templates = { + name = "templates" + location = "EU" + }, + } +} + variable "transformation_project_id" { description = "Orchestration and Transformation project ID." type = string @@ -28,12 +43,6 @@ variable "transformation_service_account" { default = "sa-transformation" } -variable "transformation_vpc_name" { - description = "Name of the VPC created in the transformation Project." - type = string - default = "transformation-vpc" -} - variable "transformation_subnets" { description = "List of subnets to create in the transformation Project." type = list(any) @@ -47,17 +56,8 @@ variable "transformation_subnets" { ] } -variable "transformation_buckets" { - description = "List of transformation buckets to create" - type = map(any) - default = { - temp = { - name = "temp" - location = "EU" - }, - templates = { - name = "templates" - location = "EU" - }, - } +variable "transformation_vpc_name" { + description = "Name of the VPC created in the transformation Project." + type = string + default = "transformation-vpc" } diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase2/variables.tf new file mode 100644 index 000000000..eb0557f3c --- /dev/null +++ b/data-solutions/data-platform-foundations/infra/tf-phase2/variables.tf @@ -0,0 +1,14 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + From fd60b8328a32d4f956bf67d45fd69a3e1e6e944d Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Mon, 24 May 2021 21:45:54 +0300 Subject: [PATCH 06/19] projects prefix added --- .../infra/tf-phase1/datamart_project.tf | 1 + .../infra/tf-phase1/dwh_project.tf | 1 + .../infra/tf-phase1/landing_project.tf | 1 + .../infra/tf-phase1/services_project.tf | 1 + .../infra/tf-phase1/transformation_project.tf | 1 + .../data-platform-foundations/infra/tf-phase1/variables.tf | 7 ++++++- 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf index 3fdaa2e67..3e7ed65eb 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf @@ -20,6 +20,7 @@ module "datamart-project-creation" { source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" billing_account = var.billing_account parent = var.parent + prefix = var.projects_prefix name = join( "-", diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf index 58bf0a9eb..6f51590e2 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf @@ -19,6 +19,7 @@ module "dwh-project-creation" { source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" billing_account = var.billing_account parent = var.parent + prefix = var.projects_prefix name = join( "-", diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf index ad97839df..37fd57f98 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf @@ -19,6 +19,7 @@ module "landing-project-creation" { source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" billing_account = var.billing_account parent = var.parent + prefix = var.projects_prefix name = join( "-", diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf index d8a66e024..a6985c7cd 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf @@ -19,6 +19,7 @@ module "services-project-creation" { source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" billing_account = var.billing_account parent = var.parent + prefix = var.projects_prefix name = join( "-", diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf index a5f4fa1d7..111abd7e2 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf @@ -19,6 +19,7 @@ module "transformation-project-creation" { source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" billing_account = var.billing_account parent = var.parent + prefix = var.projects_prefix name = join( "-", diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf b/data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf index d227b0b40..a00889067 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf +++ b/data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf @@ -22,9 +22,14 @@ variable "parent" { type = string } +variable "projects_prefix" { + description = "Prefix used to generate project id and name" + type = string + default = null +} + variable "projects_suffix" { description = "Project suffix to make resources unique. If no suffix is provided a random suffix will be created" type = string default = null } - From 99bfd4da98900a336c622555b47972d1239976cf Mon Sep 17 00:00:00 2001 From: Ludovico Magnocavallo Date: Wed, 26 May 2021 08:15:38 +0200 Subject: [PATCH 07/19] Update README.md --- .../data-platform-foundations/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/data-solutions/data-platform-foundations/README.md b/data-solutions/data-platform-foundations/README.md index cdaaff615..a01e4a6bf 100644 --- a/data-solutions/data-platform-foundations/README.md +++ b/data-solutions/data-platform-foundations/README.md @@ -2,7 +2,7 @@ ## General -The goal of this project is to Build a **robust and flexible** Data Foundation on GCP that provides **opinionated defaults** while allowing customers to **build and scale** out additional data pipelines **quickly and reliably**. +The goal of this project is to Build a **robust and flexible** Data Foundation on GCP that provides **opinionated defaults**, while allowing customers to **build and scale** out additional data pipelines **quickly and reliably**. There are three provisioning workflows to enable an end to end Foundational Data Platform along with Data Pipelines on top of it. This is represented in the diagram below. @@ -18,19 +18,19 @@ In this example we will create the infrastructure needed for the foundational bu Since this example is intended for the data infra engineers we do expect that an initial organization / folder and service account with owner privileges will be pre-created and provided as variables. -This example assume the next items were already created and provided: +This example assumes that the following resources were already created and provided: -- Organization / folder -- Terraform runner Service account with owner permissions on the above organization / folder +- Root node (organization or folder) +- Service account with owner permissions on the root node, used to apply Terraform code ## Building the Platform -Building the platform is composed of 4 steps: +Building the platform is composed of 2 foundational, and 2 optional steps: -1) [Data Platform Foundations - Phase 1: Building the projects](./infra/tf-phase1/README.md) -1) [Data Platform Foundations - Phase 2: Deploy assets](./infra/tf-phase2/README.md) -1) [(Optional) Manual pipeline Example](./data-pipeline/README.md) -1) [(Optional) Manageing Multiple Environments](./manageing_multiple_environments.md) +- [Foundations 1 - project creation](./infra/tf-phase1/README.md) +- [Foundations 2 - assets deployment](./infra/tf-phase2/README.md) +- [Optional - manual pipeline example](./data-pipeline/README.md) +- [Optional - managing multiple environments](./manageing_multiple_environments.md) ## TODO list From 34dd1f565cda59214389e0d31fc40bc6a46a6623 Mon Sep 17 00:00:00 2001 From: Ludovico Magnocavallo Date: Sun, 30 May 2021 20:04:56 +0200 Subject: [PATCH 08/19] Data Foundations: reorder first level README and folder structure (#251) * reorder first level README and folder structure * Link fix Co-authored-by: Yoram Ben-Yaacov --- .../data-platform-foundations/README.md | 56 +++++++++++------- .../{infra/tf-phase2 => datasource}/README.md | 2 +- .../datamart_project.tf | 0 .../datamart_project_output.tf | 0 .../datamart_project_variables.tf | 0 .../diagram.png} | Bin .../tf-phase2 => datasource}/dwh_project.tf | 0 .../dwh_project_output.tf | 0 .../dwh_project_variables.tf | 0 .../landing_project.tf | 0 .../landing_project_output.tf | 0 .../landing_project_variables.tf | 0 .../{infra/tf-phase2 => datasource}/main.tf | 0 .../tf-phase1 => datasource}/outputs.tf | 0 .../services_project.tf | 0 .../services_project_output.tf | 0 .../services_project_variables.tf | 0 .../transformation_project.tf | 0 .../transformation_project_output.tf | 0 .../transformation_project_variables.tf | 0 .../tf-phase2 => datasource}/variables.tf | 0 .../tf-phase2 => datasource}/versions.tf | 0 .../tf-phase1 => environment}/README.md | 2 +- .../datamart_project.tf | 0 .../datamart_project_output.tf | 0 .../datamart_project_variables.tf | 0 .../diagram.png} | Bin .../tf-phase1 => environment}/dwh_project.tf | 0 .../dwh_project_output.tf | 0 .../dwh_project_variables.tf | 0 .../landing_project.tf | 0 .../landing_project_output.tf | 0 .../landing_project_variables.tf | 0 .../{infra/tf-phase1 => environment}/main.tf | 0 .../tf-phase2 => environment}/outputs.tf | 0 .../services_project.tf | 0 .../services_project_output.tf | 0 .../services_project_variables.tf | 0 .../transformation_project.tf | 0 .../transformation_project_output.tf | 0 .../transformation_project_variables.tf | 0 .../tf-phase1 => environment}/variables.tf | 0 .../tf-phase1 => environment}/versions.tf | 0 ...Foundation_Multiple_project_Single_VPC.png | Bin 36756 -> 0 bytes .../img/three_main_workflows.png | Bin 49219 -> 0 bytes .../manageing_multiple_environments.md | 27 --------- .../{data-pipeline => pipeline}/README.md | 0 .../gcs_to_bigquery.md | 0 .../pubsub_to_bigquery.md | 0 .../resource/raw_data.json | 0 50 files changed, 36 insertions(+), 51 deletions(-) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/README.md (98%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/datamart_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/datamart_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/datamart_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{img/Data_Foundation-phase2.png => datasource/diagram.png} (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/dwh_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/dwh_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/dwh_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/landing_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/landing_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/landing_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/main.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => datasource}/outputs.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/services_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/services_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/services_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/transformation_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/transformation_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/transformation_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => datasource}/versions.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/README.md (98%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/datamart_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/datamart_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/datamart_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{img/Data_Foundation-phase1.png => environment/diagram.png} (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/dwh_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/dwh_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/dwh_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/landing_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/landing_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/landing_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/main.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase2 => environment}/outputs.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/services_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/services_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/services_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/transformation_project.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/transformation_project_output.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/transformation_project_variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/variables.tf (100%) rename data-solutions/data-platform-foundations/{infra/tf-phase1 => environment}/versions.tf (100%) delete mode 100644 data-solutions/data-platform-foundations/img/Data_Foundation_Multiple_project_Single_VPC.png delete mode 100644 data-solutions/data-platform-foundations/img/three_main_workflows.png delete mode 100644 data-solutions/data-platform-foundations/manageing_multiple_environments.md rename data-solutions/data-platform-foundations/{data-pipeline => pipeline}/README.md (100%) rename data-solutions/data-platform-foundations/{data-pipeline => pipeline}/gcs_to_bigquery.md (100%) rename data-solutions/data-platform-foundations/{data-pipeline => pipeline}/pubsub_to_bigquery.md (100%) rename data-solutions/data-platform-foundations/{data-pipeline => pipeline}/resource/raw_data.json (100%) diff --git a/data-solutions/data-platform-foundations/README.md b/data-solutions/data-platform-foundations/README.md index a01e4a6bf..31ef42e75 100644 --- a/data-solutions/data-platform-foundations/README.md +++ b/data-solutions/data-platform-foundations/README.md @@ -1,38 +1,50 @@ -# Data Platform Foundations +# Data Foundation Platform -## General +The goal of this example is to Build a robust and flexible Data Foundation on GCP, providing opinionated defaults while still allowing customers to quickly and reliably build and scale out additional data pipelines. -The goal of this project is to Build a **robust and flexible** Data Foundation on GCP that provides **opinionated defaults**, while allowing customers to **build and scale** out additional data pipelines **quickly and reliably**. +The example is composed of three separate provisioning workflows, which are deisgned to be plugged together and create end to end Data Foundations, that support multiple data pipelines on top. -There are three provisioning workflows to enable an end to end Foundational Data Platform along with Data Pipelines on top of it. This is represented in the diagram below. +- **[Environment Setup](./environment/)** + *(once per environment)* + - projects + - VPC configuration + - Composer environment and identity + - shared buckets and datasets +- **[Data Source Setup](./datasource)** + *(once per data source)* + - landing and archive bucket + - internal and external identities + - domain specific datasets +- **[Pipeline Setup](./pipeline)** + *(once per pipeline)* + - pipeline-specific tables and views + - pipeline code + - Composer DAG -![Three Main Workflows](./img/three_main_workflows.png) +The resulting GCP architecture is outlined in this diagram +![Target architecture](./datasource/diagram.png) -## Target architecture +A demo pipeline is also part of this example: it can be built and run on top of the foundational infrastructure to quickly verify or test the setup. -![Target architecture](./img/Data_Foundation-phase2.png) +## Prerequisites -In this example we will create the infrastructure needed for the foundational build and run a demo pipeline. +In order to bring up this example, you will need -## Before you begine +- a folder or organization where new projects will be created +- a billing account that will be associated to new projects +- an identity (user or service account) with owner permissions on the folder or org, and billing user permissions on the billing account -Since this example is intended for the data infra engineers we do expect that an initial organization / folder and service account with owner privileges will be pre-created and provided as variables. +## Bringing up the platform -This example assumes that the following resources were already created and provided: +The end-to-end example is composed of 2 foundational, and 1-n optional steps: -- Root node (organization or folder) -- Service account with owner permissions on the root node, used to apply Terraform code +- [environment setup](./environment/) +- [data source setup](./datasource/) +- (Optional) [pipeline setup](./pipeline/) -## Building the Platform +The environment setup is designed to manage a single environment. Various strategies like workspaces, branching, or even separate clones can be used to support multiple environments. -Building the platform is composed of 2 foundational, and 2 optional steps: - -- [Foundations 1 - project creation](./infra/tf-phase1/README.md) -- [Foundations 2 - assets deployment](./infra/tf-phase2/README.md) -- [Optional - manual pipeline example](./data-pipeline/README.md) -- [Optional - managing multiple environments](./manageing_multiple_environments.md) - -## TODO list +## TODO | Description | Priority (1:High - 5:Low ) | Status | Remarks | |-------------|----------|:------:|---------| diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/README.md b/data-solutions/data-platform-foundations/datasource/README.md similarity index 98% rename from data-solutions/data-platform-foundations/infra/tf-phase2/README.md rename to data-solutions/data-platform-foundations/datasource/README.md index 27594d190..0950b559f 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase2/README.md +++ b/data-solutions/data-platform-foundations/datasource/README.md @@ -4,7 +4,7 @@ Now that we have all the needed project, we will create all the needed assets to store and process the data. -![Data Foundation - Phase 2](../../img/Data_Foundation-phase2.png) +![Data Foundation - Phase 2](./diagram.png) This example will create the next resources per project: diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project.tf b/data-solutions/data-platform-foundations/datasource/datamart_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project.tf rename to data-solutions/data-platform-foundations/datasource/datamart_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_output.tf b/data-solutions/data-platform-foundations/datasource/datamart_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_output.tf rename to data-solutions/data-platform-foundations/datasource/datamart_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_variables.tf b/data-solutions/data-platform-foundations/datasource/datamart_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/datamart_project_variables.tf rename to data-solutions/data-platform-foundations/datasource/datamart_project_variables.tf diff --git a/data-solutions/data-platform-foundations/img/Data_Foundation-phase2.png b/data-solutions/data-platform-foundations/datasource/diagram.png similarity index 100% rename from data-solutions/data-platform-foundations/img/Data_Foundation-phase2.png rename to data-solutions/data-platform-foundations/datasource/diagram.png diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project.tf b/data-solutions/data-platform-foundations/datasource/dwh_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project.tf rename to data-solutions/data-platform-foundations/datasource/dwh_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_output.tf b/data-solutions/data-platform-foundations/datasource/dwh_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_output.tf rename to data-solutions/data-platform-foundations/datasource/dwh_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_variables.tf b/data-solutions/data-platform-foundations/datasource/dwh_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/dwh_project_variables.tf rename to data-solutions/data-platform-foundations/datasource/dwh_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project.tf b/data-solutions/data-platform-foundations/datasource/landing_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/landing_project.tf rename to data-solutions/data-platform-foundations/datasource/landing_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_output.tf b/data-solutions/data-platform-foundations/datasource/landing_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_output.tf rename to data-solutions/data-platform-foundations/datasource/landing_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_variables.tf b/data-solutions/data-platform-foundations/datasource/landing_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/landing_project_variables.tf rename to data-solutions/data-platform-foundations/datasource/landing_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/main.tf b/data-solutions/data-platform-foundations/datasource/main.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/main.tf rename to data-solutions/data-platform-foundations/datasource/main.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf b/data-solutions/data-platform-foundations/datasource/outputs.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/outputs.tf rename to data-solutions/data-platform-foundations/datasource/outputs.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/services_project.tf b/data-solutions/data-platform-foundations/datasource/services_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/services_project.tf rename to data-solutions/data-platform-foundations/datasource/services_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/services_project_output.tf b/data-solutions/data-platform-foundations/datasource/services_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/services_project_output.tf rename to data-solutions/data-platform-foundations/datasource/services_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/services_project_variables.tf b/data-solutions/data-platform-foundations/datasource/services_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/services_project_variables.tf rename to data-solutions/data-platform-foundations/datasource/services_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project.tf b/data-solutions/data-platform-foundations/datasource/transformation_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project.tf rename to data-solutions/data-platform-foundations/datasource/transformation_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_output.tf b/data-solutions/data-platform-foundations/datasource/transformation_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_output.tf rename to data-solutions/data-platform-foundations/datasource/transformation_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_variables.tf b/data-solutions/data-platform-foundations/datasource/transformation_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/transformation_project_variables.tf rename to data-solutions/data-platform-foundations/datasource/transformation_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/variables.tf b/data-solutions/data-platform-foundations/datasource/variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/variables.tf rename to data-solutions/data-platform-foundations/datasource/variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/versions.tf b/data-solutions/data-platform-foundations/datasource/versions.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/versions.tf rename to data-solutions/data-platform-foundations/datasource/versions.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/README.md b/data-solutions/data-platform-foundations/environment/README.md similarity index 98% rename from data-solutions/data-platform-foundations/infra/tf-phase1/README.md rename to data-solutions/data-platform-foundations/environment/README.md index b29eb0596..03ade0683 100644 --- a/data-solutions/data-platform-foundations/infra/tf-phase1/README.md +++ b/data-solutions/data-platform-foundations/environment/README.md @@ -21,7 +21,7 @@ This example will create the next projects: A master service account named projects-editor-sa will be created under common services project and will be granted editor permissions on all the projects in scope. -![Data Foundation - Phase 1](../../img/Data_Foundation-phase1.png) +![Data Foundation - Phase 1](./diagram.png) ## Running the example diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf b/data-solutions/data-platform-foundations/environment/datamart_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project.tf rename to data-solutions/data-platform-foundations/environment/datamart_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_output.tf b/data-solutions/data-platform-foundations/environment/datamart_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_output.tf rename to data-solutions/data-platform-foundations/environment/datamart_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_variables.tf b/data-solutions/data-platform-foundations/environment/datamart_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/datamart_project_variables.tf rename to data-solutions/data-platform-foundations/environment/datamart_project_variables.tf diff --git a/data-solutions/data-platform-foundations/img/Data_Foundation-phase1.png b/data-solutions/data-platform-foundations/environment/diagram.png similarity index 100% rename from data-solutions/data-platform-foundations/img/Data_Foundation-phase1.png rename to data-solutions/data-platform-foundations/environment/diagram.png diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf b/data-solutions/data-platform-foundations/environment/dwh_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project.tf rename to data-solutions/data-platform-foundations/environment/dwh_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_output.tf b/data-solutions/data-platform-foundations/environment/dwh_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_output.tf rename to data-solutions/data-platform-foundations/environment/dwh_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_variables.tf b/data-solutions/data-platform-foundations/environment/dwh_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/dwh_project_variables.tf rename to data-solutions/data-platform-foundations/environment/dwh_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf b/data-solutions/data-platform-foundations/environment/landing_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/landing_project.tf rename to data-solutions/data-platform-foundations/environment/landing_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_output.tf b/data-solutions/data-platform-foundations/environment/landing_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_output.tf rename to data-solutions/data-platform-foundations/environment/landing_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_variables.tf b/data-solutions/data-platform-foundations/environment/landing_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/landing_project_variables.tf rename to data-solutions/data-platform-foundations/environment/landing_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/main.tf b/data-solutions/data-platform-foundations/environment/main.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/main.tf rename to data-solutions/data-platform-foundations/environment/main.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf b/data-solutions/data-platform-foundations/environment/outputs.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase2/outputs.tf rename to data-solutions/data-platform-foundations/environment/outputs.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf b/data-solutions/data-platform-foundations/environment/services_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/services_project.tf rename to data-solutions/data-platform-foundations/environment/services_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_output.tf b/data-solutions/data-platform-foundations/environment/services_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/services_project_output.tf rename to data-solutions/data-platform-foundations/environment/services_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/services_project_variables.tf b/data-solutions/data-platform-foundations/environment/services_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/services_project_variables.tf rename to data-solutions/data-platform-foundations/environment/services_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf b/data-solutions/data-platform-foundations/environment/transformation_project.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project.tf rename to data-solutions/data-platform-foundations/environment/transformation_project.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_output.tf b/data-solutions/data-platform-foundations/environment/transformation_project_output.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_output.tf rename to data-solutions/data-platform-foundations/environment/transformation_project_output.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_variables.tf b/data-solutions/data-platform-foundations/environment/transformation_project_variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/transformation_project_variables.tf rename to data-solutions/data-platform-foundations/environment/transformation_project_variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf b/data-solutions/data-platform-foundations/environment/variables.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/variables.tf rename to data-solutions/data-platform-foundations/environment/variables.tf diff --git a/data-solutions/data-platform-foundations/infra/tf-phase1/versions.tf b/data-solutions/data-platform-foundations/environment/versions.tf similarity index 100% rename from data-solutions/data-platform-foundations/infra/tf-phase1/versions.tf rename to data-solutions/data-platform-foundations/environment/versions.tf diff --git a/data-solutions/data-platform-foundations/img/Data_Foundation_Multiple_project_Single_VPC.png b/data-solutions/data-platform-foundations/img/Data_Foundation_Multiple_project_Single_VPC.png deleted file mode 100644 index d96c90e209e856d22b6cba2b21dbd718806538d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36756 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 Ee;4zIS^xk5 diff --git a/data-solutions/data-platform-foundations/img/three_main_workflows.png b/data-solutions/data-platform-foundations/img/three_main_workflows.png deleted file mode 100644 index a6b20fdb7c2ddfa982261e72995b8469e86fad07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49219 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 Hclo~or7(3( diff --git a/data-solutions/data-platform-foundations/manageing_multiple_environments.md b/data-solutions/data-platform-foundations/manageing_multiple_environments.md deleted file mode 100644 index c6ea0893d..000000000 --- a/data-solutions/data-platform-foundations/manageing_multiple_environments.md +++ /dev/null @@ -1,27 +0,0 @@ -# Manageing Multiple Environments - -Terraform is a great tool for provisioning immutable infrastructure. -There are several ways to get Terraform to provision different environments using one repo. Here I’m going to use the most basic and naive method - the State separation. -State separation signals more mature usage of Terraform but with additional maturity comes additional complexity. -There are two primary methods to separate state between environments: directories and workspaces. I’m going to use the directory method. - -For this example I’ll assume we have 3 environments: - -- Dev -- QA -- Prod - -```bash -export data_platform_folder="dpm" - -mkdir ${data_platform_folder} -cd ${data_platform_folder} - -git clone https://github.com/yorambenyaacov/cloud-foundation-fabric.git dev - -git clone https://github.com/yorambenyaacov/cloud-foundation-fabric.git prod - -git clone https://github.com/yorambenyaacov/cloud-foundation-fabric.git qa -``` - -Now you have a directory per environment in which you can do all the needed configurations (tfvars files) and provision it. diff --git a/data-solutions/data-platform-foundations/data-pipeline/README.md b/data-solutions/data-platform-foundations/pipeline/README.md similarity index 100% rename from data-solutions/data-platform-foundations/data-pipeline/README.md rename to data-solutions/data-platform-foundations/pipeline/README.md diff --git a/data-solutions/data-platform-foundations/data-pipeline/gcs_to_bigquery.md b/data-solutions/data-platform-foundations/pipeline/gcs_to_bigquery.md similarity index 100% rename from data-solutions/data-platform-foundations/data-pipeline/gcs_to_bigquery.md rename to data-solutions/data-platform-foundations/pipeline/gcs_to_bigquery.md diff --git a/data-solutions/data-platform-foundations/data-pipeline/pubsub_to_bigquery.md b/data-solutions/data-platform-foundations/pipeline/pubsub_to_bigquery.md similarity index 100% rename from data-solutions/data-platform-foundations/data-pipeline/pubsub_to_bigquery.md rename to data-solutions/data-platform-foundations/pipeline/pubsub_to_bigquery.md diff --git a/data-solutions/data-platform-foundations/data-pipeline/resource/raw_data.json b/data-solutions/data-platform-foundations/pipeline/resource/raw_data.json similarity index 100% rename from data-solutions/data-platform-foundations/data-pipeline/resource/raw_data.json rename to data-solutions/data-platform-foundations/pipeline/resource/raw_data.json From 1074546510bce409f4ae3850e2b2ebdf47a169af Mon Sep 17 00:00:00 2001 From: Ludovico Magnocavallo Date: Sat, 5 Jun 2021 16:05:39 +0200 Subject: [PATCH 09/19] refactor environment --- .../environment/README.md | 131 +++--------------- .../environment/datamart_project.tf | 63 --------- .../environment/datamart_project_output.tf | 20 --- .../environment/datamart_project_variables.tf | 20 --- .../environment/dwh_project.tf | 60 -------- .../environment/dwh_project_output.tf | 20 --- .../environment/dwh_project_variables.tf | 20 --- .../environment/landing_project.tf | 58 -------- .../environment/landing_project_output.tf | 20 --- .../environment/landing_project_variables.tf | 20 --- .../environment/main.tf | 100 ++++++++++++- .../environment/outputs.tf | 11 ++ .../environment/services_project.tf | 71 ---------- .../environment/services_project_output.tf | 20 --- .../environment/services_project_variables.tf | 25 ---- .../environment/transformation_project.tf | 61 -------- .../transformation_project_output.tf | 18 --- .../transformation_project_variables.tf | 20 --- .../environment/variables.tf | 46 ++++-- 19 files changed, 162 insertions(+), 642 deletions(-) delete mode 100644 data-solutions/data-platform-foundations/environment/datamart_project.tf delete mode 100644 data-solutions/data-platform-foundations/environment/datamart_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/environment/datamart_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/environment/dwh_project.tf delete mode 100644 data-solutions/data-platform-foundations/environment/dwh_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/environment/dwh_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/environment/landing_project.tf delete mode 100644 data-solutions/data-platform-foundations/environment/landing_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/environment/landing_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/environment/services_project.tf delete mode 100644 data-solutions/data-platform-foundations/environment/services_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/environment/services_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/environment/transformation_project.tf delete mode 100644 data-solutions/data-platform-foundations/environment/transformation_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/environment/transformation_project_variables.tf diff --git a/data-solutions/data-platform-foundations/environment/README.md b/data-solutions/data-platform-foundations/environment/README.md index 03ade0683..824df21a1 100644 --- a/data-solutions/data-platform-foundations/environment/README.md +++ b/data-solutions/data-platform-foundations/environment/README.md @@ -1,17 +1,8 @@ -# Data Platform Foundations - Phase 1 +# Data Platform Foundations - Environment (Step 1) -## General +This is the first step needed to deploy Data Platform Foundations, which creates projects and service accounts. Please refer to the [top-level Data Platform README](../README.md) for prerequisites. -This is the first part deploying the Data Platform foundations. In this part we will create the infrastructure needed for the foundational build. This includes projects and service accounts. - -Since this example is intended for the data infra engineers we do expect that an initial organization / folder and service account with owner privileges will be pre-created and provided as variables. - -This example assume the next items were already created and provided: - -- Organization / folder -- Terraform runner Service account with owner permissions on the above organization / folder - -This example will create the next projects: +The projects that will be created are: - Common services - Landing @@ -19,118 +10,38 @@ This example will create the next projects: - DWH - Datamart -A master service account named projects-editor-sa will be created under common services project and will be granted editor permissions on all the projects in scope. - -![Data Foundation - Phase 1](./diagram.png) +A master service account named `projects-editor-sa` will be created under the common services project, and it will be granted editor permissions on all the projects in scope. ## Running the example To create the infrastructure: -- Specify your variables in a `terraform.tvars` +- specify your variables in a `terraform.tvars` ```tfm -billing_account = "BILLING ACCOUNT ID." -parent = "Parent folder or organization in 'folders/folder_id' or 'organizations/org_id' format." +billing_account = "1234-1234-1234" +parent = "folders/12345678" ``` -- Place the service account key in the terraform folder -- Go through the following steps to create resources: +- make sure you have the right authentication setup (application default credentials, or a service account key) +- run `terraform init` and `terraform apply` -```bash -terraform init -terraform apply -``` - -Once done testing, you can clean up resources by running: - -```bash -terraform destroy -``` +Once done testing, you can clean up resources by running `terraform destroy` -## Requirements +## Variables -| Name | Version | -|------|---------| -| terraform | >= 0.13 | - -## Providers - -| Name | Version | -|------|---------| -| random | n/a | - -## Inputs - -### General inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| billing\_account | Billing account id. | `string` | n/a | ✓ | -| parent | Parent folder or organization in 'folders/folder\_id' or 'organizations/org\_id' format. | `string` | n/a | ✓ | -| projects\_suffix | Project suffix to make resources unique. If no suffix is provided a random suffix will be created | `string` | `null` | | - -### Datamart project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| datamart\_project\_name | Project name | `string` | `"datamart"` | | - -### DWH project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| dwh\_project\_name | Project name | `string` | `"dwh"` | | - -### Landing project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| landing\_project\_name | Project name | `string` | `"landing"` | | - -### Services project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| data\_service\_account\_name | Name for the projects editor service account. | `string` | `"projects-editor-sa"` | | -| services\_project\_name | Project name | `string` | `"services"` | | - -### Transformation project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| transformation\_project\_name | Project name | `string` | `"transformation"` | | +| name | description | type | required | default | +|---|---|:---: |:---:|:---:| +| billing_account_id | Billing account id. | string | ✓ | | +| root_node | Parent folder or organization in 'folders/folder_id' or 'organizations/org_id' format. | string | ✓ | | +| *prefix* | Prefix used to generate project id and name. | string | | null | +| *project_names* | Override this variable if you need non-standard names. | object({...}) | | ... | +| *service_account_names* | Override this variable if you need non-standard names. | object({...}) | | ... | ## Outputs -### Datamart project outputs - -| Name | Description | -|------|-------------| -| datamart-project | Datamart project created. | - -### DWH project outputs - -| Name | Description | -|------|-------------| -| dwh-project | DWH project created. | - -### Landing project outputs - -| Name | Description | -|------|-------------| -| landing-project | Landing project created. | - -### Services project outputs - -| Name | Description | -|------|-------------| -| services-project | Services project created. | - -### Transformation project outputs - -| Name | Description | -|------|-------------| -| transformation-project | Transformation project created. | +| name | description | sensitive | +|---|---|:---:| +| project_ids | Project ids for created projects. | | diff --git a/data-solutions/data-platform-foundations/environment/datamart_project.tf b/data-solutions/data-platform-foundations/environment/datamart_project.tf deleted file mode 100644 index 3e7ed65eb..000000000 --- a/data-solutions/data-platform-foundations/environment/datamart_project.tf +++ /dev/null @@ -1,63 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -########################## -# project-creation -########################## -module "datamart-project-creation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - billing_account = var.billing_account - parent = var.parent - prefix = var.projects_prefix - - name = join( - "-", - [ - var.datamart_project_name, - var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex - ] - ) - auto_create_network = false - services = [ - "bigtable.googleapis.com", - "bigtableadmin.googleapis.com", - "bigquery.googleapis.com", - "bigquerystorage.googleapis.com", - "bigqueryreservation.googleapis.com", - "storage-component.googleapis.com", - ] - - iam_additive = {} -} - -########################## -# IAM -########################## -module "set-tf-data-admin-service-account-on-datamart" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - - name = module.datamart-project-creation.project_id - project_create = false - - iam = { - "roles/editor" = [ - "serviceAccount:${module.master-service-account.email}" - ] - } - - depends_on = [ - module.master-service-account, - ] -} diff --git a/data-solutions/data-platform-foundations/environment/datamart_project_output.tf b/data-solutions/data-platform-foundations/environment/datamart_project_output.tf deleted file mode 100644 index d9168fdf6..000000000 --- a/data-solutions/data-platform-foundations/environment/datamart_project_output.tf +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -output "datamart-project" { - description = "Datamart project created." - value = module.datamart-project-creation -} diff --git a/data-solutions/data-platform-foundations/environment/datamart_project_variables.tf b/data-solutions/data-platform-foundations/environment/datamart_project_variables.tf deleted file mode 100644 index d104f1217..000000000 --- a/data-solutions/data-platform-foundations/environment/datamart_project_variables.tf +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "datamart_project_name" { - description = "Project name" - type = string - default = "datamart" -} - diff --git a/data-solutions/data-platform-foundations/environment/dwh_project.tf b/data-solutions/data-platform-foundations/environment/dwh_project.tf deleted file mode 100644 index 6f51590e2..000000000 --- a/data-solutions/data-platform-foundations/environment/dwh_project.tf +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -########################## -# project-creation -########################## -module "dwh-project-creation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - billing_account = var.billing_account - parent = var.parent - prefix = var.projects_prefix - - name = join( - "-", - [ - var.dwh_project_name, - var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex - ] - ) - auto_create_network = false - services = [ - "bigquery.googleapis.com", - "bigquerystorage.googleapis.com", - "bigqueryreservation.googleapis.com", - "storage-component.googleapis.com", - ] - - iam_additive = {} -} - -########################## -# IAM -########################## -module "set-tf-data-admin-service-account-on-dwh" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - - name = module.dwh-project-creation.project_id - project_create = false - - iam = { - "roles/editor" = [ - "serviceAccount:${module.master-service-account.email}" - ] - } - - depends_on = [ - module.master-service-account, - ] -} diff --git a/data-solutions/data-platform-foundations/environment/dwh_project_output.tf b/data-solutions/data-platform-foundations/environment/dwh_project_output.tf deleted file mode 100644 index e410ca576..000000000 --- a/data-solutions/data-platform-foundations/environment/dwh_project_output.tf +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -output "dwh-project" { - description = "DWH project created." - value = module.dwh-project-creation -} diff --git a/data-solutions/data-platform-foundations/environment/dwh_project_variables.tf b/data-solutions/data-platform-foundations/environment/dwh_project_variables.tf deleted file mode 100644 index 4c833ee4e..000000000 --- a/data-solutions/data-platform-foundations/environment/dwh_project_variables.tf +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "dwh_project_name" { - description = "Project name" - type = string - default = "dwh" -} - diff --git a/data-solutions/data-platform-foundations/environment/landing_project.tf b/data-solutions/data-platform-foundations/environment/landing_project.tf deleted file mode 100644 index 37fd57f98..000000000 --- a/data-solutions/data-platform-foundations/environment/landing_project.tf +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -########################## -# project-creation -########################## -module "landing-project-creation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - billing_account = var.billing_account - parent = var.parent - prefix = var.projects_prefix - - name = join( - "-", - [ - var.landing_project_name, - var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex - ] - ) - auto_create_network = false - services = [ - "pubsub.googleapis.com", - "storage-component.googleapis.com", - ] - - iam_additive = {} -} - -########################## -# IAM -########################## -module "set-tf-data-admin-service-account-on-landing" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - - name = module.landing-project-creation.project_id - project_create = false - - iam = { - "roles/editor" = [ - "serviceAccount:${module.master-service-account.email}" - ] - } - - depends_on = [ - module.master-service-account, - ] -} diff --git a/data-solutions/data-platform-foundations/environment/landing_project_output.tf b/data-solutions/data-platform-foundations/environment/landing_project_output.tf deleted file mode 100644 index 604b4bcc3..000000000 --- a/data-solutions/data-platform-foundations/environment/landing_project_output.tf +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -output "landing-project" { - description = "Landing project created." - value = module.landing-project-creation -} diff --git a/data-solutions/data-platform-foundations/environment/landing_project_variables.tf b/data-solutions/data-platform-foundations/environment/landing_project_variables.tf deleted file mode 100644 index e581b46e1..000000000 --- a/data-solutions/data-platform-foundations/environment/landing_project_variables.tf +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "landing_project_name" { - description = "Project name" - type = string - default = "landing" -} - diff --git a/data-solutions/data-platform-foundations/environment/main.tf b/data-solutions/data-platform-foundations/environment/main.tf index 774a21927..49be4a50d 100644 --- a/data-solutions/data-platform-foundations/environment/main.tf +++ b/data-solutions/data-platform-foundations/environment/main.tf @@ -14,10 +14,102 @@ * limitations under the License. */ -locals { - module_version = "4.2.0" +############################################################################### +# projects # +############################################################################### + +module "project-datamart" { + source = "../../../modules/project" + parent = var.root_node + billing_account = var.billing_account_id + prefix = var.prefix + name = var.project_names.datamart + services = [ + "bigtable.googleapis.com", + "bigtableadmin.googleapis.com", + "bigquery.googleapis.com", + "bigquerystorage.googleapis.com", + "bigqueryreservation.googleapis.com", + "storage-component.googleapis.com", + ] + iam = { + "roles/editor" = [module.sa-services-main.iam_email] + } } -resource "random_id" "suffix" { - byte_length = 4 +module "project-dwh" { + source = "../../../modules/project" + parent = var.root_node + billing_account = var.billing_account_id + prefix = var.prefix + name = var.project_names.dwh + services = [ + "bigquery.googleapis.com", + "bigquerystorage.googleapis.com", + "bigqueryreservation.googleapis.com", + "storage-component.googleapis.com", + ] + iam = { + "roles/editor" = [module.sa-services-main.iam_email] + } +} + +module "project-landing" { + source = "../../../modules/project" + parent = var.root_node + billing_account = var.billing_account_id + prefix = var.prefix + name = var.project_names.landing + services = [ + "pubsub.googleapis.com", + "storage-component.googleapis.com", + ] + iam = { + "roles/editor" = [module.sa-services-main.iam_email] + } +} + +module "project-services" { + source = "../../../modules/project" + parent = var.root_node + billing_account = var.billing_account_id + prefix = var.prefix + name = var.project_names.services + services = [ + "storage-component.googleapis.com", + "sourcerepo.googleapis.com", + "stackdriver.googleapis.com", + "cloudasset.googleapis.com", + ] + iam = { + "roles/editor" = [module.sa-services-main.iam_email] + } +} + +module "project-transformation" { + source = "../../../modules/project" + parent = var.root_node + billing_account = var.billing_account_id + prefix = var.prefix + name = var.project_names.transformation + services = [ + "cloudbuild.googleapis.com", + "compute.googleapis.com", + "dataflow.googleapis.com", + "servicenetworking.googleapis.com", + "storage-component.googleapis.com", + ] + iam = { + "roles/editor" = [module.sa-services-main.iam_email] + } +} + +############################################################################### +# service accounts # +############################################################################### + +module "sa-services-main" { + source = "../../../modules/iam-service-account" + project_id = module.project-services.project_id + name = var.service_account_names.main } diff --git a/data-solutions/data-platform-foundations/environment/outputs.tf b/data-solutions/data-platform-foundations/environment/outputs.tf index 85ba995e5..0919bdd0e 100644 --- a/data-solutions/data-platform-foundations/environment/outputs.tf +++ b/data-solutions/data-platform-foundations/environment/outputs.tf @@ -13,3 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +output "project_ids" { + description = "Project ids for created projects." + value = { + datamart = module.project-datamart.project_id + dwh = module.project-dwh.project_id + landing = module.project-landing.project_id + services = module.project-services.project_id + transformation = module.project-transformation.project_id + } +} diff --git a/data-solutions/data-platform-foundations/environment/services_project.tf b/data-solutions/data-platform-foundations/environment/services_project.tf deleted file mode 100644 index a6985c7cd..000000000 --- a/data-solutions/data-platform-foundations/environment/services_project.tf +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -########################## -# project-creation -########################## -module "services-project-creation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - billing_account = var.billing_account - parent = var.parent - prefix = var.projects_prefix - - name = join( - "-", - [ - var.services_project_name, - var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex - ] - ) - auto_create_network = false - services = [ - "storage-component.googleapis.com", - "sourcerepo.googleapis.com", - "stackdriver.googleapis.com", - "cloudasset.googleapis.com", - ] - - iam_additive = {} -} - -########################## -# IAM -########################## -module "master-service-account" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" - - project_id = module.services-project-creation.project_id - name = var.data_service_account_name - - depends_on = [ - module.services-project-creation - ] -} - -module "set-tf-data-admin-service-account-on-services" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - - name = module.services-project-creation.project_id - project_create = false - - iam = { - "roles/editor" = [ - "serviceAccount:${module.master-service-account.email}" - ] - } - - depends_on = [ - module.master-service-account, - ] -} diff --git a/data-solutions/data-platform-foundations/environment/services_project_output.tf b/data-solutions/data-platform-foundations/environment/services_project_output.tf deleted file mode 100644 index 190fc5169..000000000 --- a/data-solutions/data-platform-foundations/environment/services_project_output.tf +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -output "services-project" { - description = "Services project created." - value = module.services-project-creation -} diff --git a/data-solutions/data-platform-foundations/environment/services_project_variables.tf b/data-solutions/data-platform-foundations/environment/services_project_variables.tf deleted file mode 100644 index 98882a511..000000000 --- a/data-solutions/data-platform-foundations/environment/services_project_variables.tf +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "data_service_account_name" { - description = "Name for the projects editor service account." - type = string - default = "projects-editor-sa" -} - -variable "services_project_name" { - description = "Project name" - type = string - default = "services" -} diff --git a/data-solutions/data-platform-foundations/environment/transformation_project.tf b/data-solutions/data-platform-foundations/environment/transformation_project.tf deleted file mode 100644 index 111abd7e2..000000000 --- a/data-solutions/data-platform-foundations/environment/transformation_project.tf +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -########################## -# project-creation -########################## -module "transformation-project-creation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - billing_account = var.billing_account - parent = var.parent - prefix = var.projects_prefix - - name = join( - "-", - [ - var.transformation_project_name, - var.projects_suffix != null ? var.projects_suffix : random_id.suffix.hex - ] - ) - auto_create_network = false - services = [ - "cloudbuild.googleapis.com", - "compute.googleapis.com", - "dataflow.googleapis.com", - "servicenetworking.googleapis.com", - "storage-component.googleapis.com", - ] - - iam_additive = {} -} - -########################## -# IAM -########################## -module "set-tf-data-admin-service-account-on-transformation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - - name = module.transformation-project-creation.project_id - project_create = false - - iam = { - "roles/editor" = [ - "serviceAccount:${module.master-service-account.email}" - ] - } - - depends_on = [ - module.master-service-account, - ] -} diff --git a/data-solutions/data-platform-foundations/environment/transformation_project_output.tf b/data-solutions/data-platform-foundations/environment/transformation_project_output.tf deleted file mode 100644 index 08bf8500a..000000000 --- a/data-solutions/data-platform-foundations/environment/transformation_project_output.tf +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -output "transformation-project" { - description = "Transformation project created." - value = module.transformation-project-creation -} diff --git a/data-solutions/data-platform-foundations/environment/transformation_project_variables.tf b/data-solutions/data-platform-foundations/environment/transformation_project_variables.tf deleted file mode 100644 index f7908cca4..000000000 --- a/data-solutions/data-platform-foundations/environment/transformation_project_variables.tf +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -variable "transformation_project_name" { - description = "Project name" - type = string - default = "transformation" -} - diff --git a/data-solutions/data-platform-foundations/environment/variables.tf b/data-solutions/data-platform-foundations/environment/variables.tf index a00889067..596a4340d 100644 --- a/data-solutions/data-platform-foundations/environment/variables.tf +++ b/data-solutions/data-platform-foundations/environment/variables.tf @@ -12,24 +12,46 @@ # See the License for the specific language governing permissions and # limitations under the License. -variable "billing_account" { +variable "billing_account_id" { description = "Billing account id." type = string } -variable "parent" { +variable "prefix" { + description = "Prefix used to generate project id and name." + type = string + default = null +} + +variable "project_names" { + description = "Override this variable if you need non-standard names." + type = object({ + datamart = string + dwh = string + landing = string + services = string + transformation = string + }) + default = { + datamart = "datamart" + dwh = "datawh" + landing = "landing" + services = "services" + transformation = "transformation" + } +} + +variable "root_node" { description = "Parent folder or organization in 'folders/folder_id' or 'organizations/org_id' format." type = string } -variable "projects_prefix" { - description = "Prefix used to generate project id and name" - type = string - default = null -} - -variable "projects_suffix" { - description = "Project suffix to make resources unique. If no suffix is provided a random suffix will be created" - type = string - default = null +variable "service_account_names" { + description = "Override this variable if you need non-standard names." + type = object({ + main = string + }) + default = { + main = "data-platform-main" + } } From fc987a9a5d6784ae88ee87b1b4c30d498b9fed86 Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Thu, 10 Jun 2021 10:58:40 +0300 Subject: [PATCH 10/19] Merged all components into one main file. (#259) * Merged all components into one main file. * rename datasource folder to resources * resources output added for: * datamart-bigquery-datasets-list * dwh-bigquery-datasets-list * landing-bucket-names * landing-pubsub-list * transformation-bucket-names * Change the project ID with a link to the module * add support for IAM roles to the datasets created * Removed unused local variable module_version * Moved from access and access_identities to IAM. * Update README.md Co-authored-by: lcaggio --- .../data-platform-foundations/README.md | 6 +- .../datasource/README.md | 117 --------- .../datasource/datamart_project.tf | 65 ----- .../datasource/datamart_project_output.tf | 15 -- .../datasource/datamart_project_variables.tf | 40 --- .../datasource/dwh_project.tf | 59 ----- .../datasource/dwh_project_output.tf | 15 -- .../datasource/dwh_project_variables.tf | 40 --- .../datasource/landing_project.tf | 86 ------- .../datasource/landing_project_output.tf | 15 -- .../datasource/landing_project_variables.tf | 82 ------- .../datasource/main.tf | 19 -- .../datasource/outputs.tf | 15 -- .../datasource/services_project.tf | 40 --- .../datasource/services_project_output.tf | 15 -- .../datasource/services_project_variables.tf | 29 --- .../datasource/transformation_project.tf | 76 ------ .../transformation_project_output.tf | 20 -- .../transformation_project_variables.tf | 63 ----- .../datasource/variables.tf | 14 -- .../resources/README.md | 82 +++++++ .../{datasource => resources}/diagram.png | Bin .../resources/main.tf | 230 ++++++++++++++++++ .../resources/outputs.tf | 83 +++++++ .../resources/variables.tf | 168 +++++++++++++ .../{datasource => resources}/versions.tf | 0 26 files changed, 566 insertions(+), 828 deletions(-) delete mode 100644 data-solutions/data-platform-foundations/datasource/README.md delete mode 100644 data-solutions/data-platform-foundations/datasource/datamart_project.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/datamart_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/datamart_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/dwh_project.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/dwh_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/dwh_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/landing_project.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/landing_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/landing_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/main.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/outputs.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/services_project.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/services_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/services_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/transformation_project.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/transformation_project_output.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/transformation_project_variables.tf delete mode 100644 data-solutions/data-platform-foundations/datasource/variables.tf create mode 100644 data-solutions/data-platform-foundations/resources/README.md rename data-solutions/data-platform-foundations/{datasource => resources}/diagram.png (100%) create mode 100644 data-solutions/data-platform-foundations/resources/main.tf create mode 100644 data-solutions/data-platform-foundations/resources/outputs.tf create mode 100644 data-solutions/data-platform-foundations/resources/variables.tf rename data-solutions/data-platform-foundations/{datasource => resources}/versions.tf (100%) diff --git a/data-solutions/data-platform-foundations/README.md b/data-solutions/data-platform-foundations/README.md index 31ef42e75..f76f050cd 100644 --- a/data-solutions/data-platform-foundations/README.md +++ b/data-solutions/data-platform-foundations/README.md @@ -10,7 +10,7 @@ The example is composed of three separate provisioning workflows, which are deis - VPC configuration - Composer environment and identity - shared buckets and datasets -- **[Data Source Setup](./datasource)** +- **[Data Source Setup](./resources)** *(once per data source)* - landing and archive bucket - internal and external identities @@ -22,7 +22,7 @@ The example is composed of three separate provisioning workflows, which are deis - Composer DAG The resulting GCP architecture is outlined in this diagram -![Target architecture](./datasource/diagram.png) +![Target architecture](./resources/diagram.png) A demo pipeline is also part of this example: it can be built and run on top of the foundational infrastructure to quickly verify or test the setup. @@ -39,7 +39,7 @@ In order to bring up this example, you will need The end-to-end example is composed of 2 foundational, and 1-n optional steps: - [environment setup](./environment/) -- [data source setup](./datasource/) +- [data source setup](./resources/) - (Optional) [pipeline setup](./pipeline/) The environment setup is designed to manage a single environment. Various strategies like workspaces, branching, or even separate clones can be used to support multiple environments. diff --git a/data-solutions/data-platform-foundations/datasource/README.md b/data-solutions/data-platform-foundations/datasource/README.md deleted file mode 100644 index 0950b559f..000000000 --- a/data-solutions/data-platform-foundations/datasource/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# Data Platform Foundations - Phase 2 - -## General - -Now that we have all the needed project, we will create all the needed assets to store and process the data. - -![Data Foundation - Phase 2](./diagram.png) - -This example will create the next resources per project: - -- Common -- Landing - - [x] GCS - - [x] Pub/Sub -- Orchestration & Transformation - - [x] Dataflow -- DWH - - [x] Bigquery (L0/1/2) - - [x] GCS -- Datamart - - [x] Bigquery (views/table) - - [x] GCS - - [ ] BigTable - -## Running the example - -To create the infrastructure: - -- Specify your variables in a `terraform.tvars` - -```tfm -services_project_id = "SERVICES-PROJECT_ID" -landing_project_id = "LANDING-PROJECT_ID" -transformation_project_id = "TRANSFORMATION-PROJECT_ID" -dwh_project_id = "DWH-PROJECT_ID" -datamart_project_id = "DATAMART-PROJECT_ID" -``` - -- Place the data_service_account_name service account (the service account was created in phase 1) key in the terraform folder -- Go through the following steps to create resources: - -```bash -terraform init -terraform apply -``` - -Once done testing, you can clean up resources by running: - -```bash -terraform destroy -``` - - -## Requirements - -| Name | Version | -|------|---------| -| terraform | >= 0.13 | - -## Providers - -| Name | Version | -|------|---------| -| google | n/a | - -## Inputs - -### Services project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| services\_project\_id | services project ID. | `string` | n/a | ✓ | -| services\_service\_account | services service accounts list. | `string` | `"sa-services"` | | - -### Datamart project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| datamart\_bq\_datasets | Datamart Bigquery datasets | `map(any)` |

{
"bq_datamart_dataset": {
"id": "bq_datamart_dataset",
"location": "EU"
}
}
| | -| datamart\_project\_id | datamart project ID. | `string` | n/a | ✓ | -| datamart\_service\_account | datamart service accounts list. | `string` | `"sa-datamart"` | | - -### DWH project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| dwh\_bq\_datasets | DWH Bigquery datasets | `map(any)` |
{
"bq_raw_dataset": {
"id": "bq_raw_dataset",
"location": "EU"
}
}
| | -| dwh\_project\_id | dwh project ID. | `string` | n/a | ✓ | -| dwh\_service\_account | dwh service accounts list. | `string` | `"sa-dwh"` | | - -### Landing project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| landing\_buckets | List of landing buckets to create | `map(any)` |
{
"data-schema": {
"location": "EU",
"name": "data-schema"
},
"raw-data": {
"location": "EU",
"name": "raw-data"
}
}
| | -| landing\_project\_id | landing project ID. | `string` | n/a | ✓ | -| landing\_pubsub | List of landing buckets to create | `map(any)` |
{
"landing_1": {
"name": "landing-1",
"subscription_iam": {
"sub1": {
"roles/pubsub.subscriber": []
},
"sub2": {
"roles/pubsub.subscriber": []
}
},
"subscriptions": {
"sub1": {
"labels": {},
"options": {
"ack_deadline_seconds": null,
"expiration_policy_ttl": null,
"message_retention_duration": null,
"retain_acked_messages": true
}
},
"sub2": {
"labels": {},
"options": {
"ack_deadline_seconds": null,
"expiration_policy_ttl": null,
"message_retention_duration": null,
"retain_acked_messages": true
}
}
}
}
}
| | -| landing\_service\_account | landing service accounts list. | `string` | `"sa-landing"` | | - -### Transformation project inputs - -| Name | Description | Type | Default | Required | -|------|-------------|------|---------|:--------:| -| transformation\_buckets | List of transformation buckets to create | `map(any)` |
{
"temp": {
"location": "EU",
"name": "temp"
},
"templates": {
"location": "EU",
"name": "templates"
}
}
| | -| transformation\_project\_id | Orchestration and Transformation project ID. | `string` | n/a | ✓ | -| transformation\_service\_account | transformation service accounts list. | `string` | `"sa-transformation"` | | -| transformation\_subnets | List of subnets to create in the transformation Project. | `list(any)` |
[
{
"ip_cidr_range": "10.1.0.0/20",
"name": "transformation-subnet",
"region": "europe-west3",
"secondary_ip_range": {}
}
]
| | -| transformation\_vpc\_name | Name of the VPC created in the transformation Project. | `string` | `"transformation-vpc"` | | - -## Outputs - -### Transformation project outputs - -| Name | Description | -|------|-------------| -| vpc-transformation-output | Transformation VPC details | - diff --git a/data-solutions/data-platform-foundations/datasource/datamart_project.tf b/data-solutions/data-platform-foundations/datasource/datamart_project.tf deleted file mode 100644 index 241a4dcd1..000000000 --- a/data-solutions/data-platform-foundations/datasource/datamart_project.tf +++ /dev/null @@ -1,65 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# Project # -############################################################################### -module "project-id-datamart" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - name = var.datamart_project_id - project_create = false -} - -############################################################################### -# IAM # -############################################################################### -module "datamart-default-service-accounts" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" - project_id = var.datamart_project_id - - name = var.datamart_service_account - - iam_project_roles = { - "${var.datamart_project_id}" = [ - "roles/editor", - ] - } -} - -############################################################################### -# Bigquery # -############################################################################### -data "google_service_account" "datamart" { - account_id = var.datamart_service_account - project = var.datamart_project_id -} - -module "bigquery-datasets-datamart" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/bigquery-dataset?ref=v4.2.0" - project_id = var.datamart_project_id - - for_each = var.datamart_bq_datasets - - id = each.value.id - location = each.value.location - - access = { - owner = { role = "OWNER", type = "user" } - } - access_identities = { - owner = module.datamart-default-service-accounts.email - } -} diff --git a/data-solutions/data-platform-foundations/datasource/datamart_project_output.tf b/data-solutions/data-platform-foundations/datasource/datamart_project_output.tf deleted file mode 100644 index 85ba995e5..000000000 --- a/data-solutions/data-platform-foundations/datasource/datamart_project_output.tf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/data-solutions/data-platform-foundations/datasource/datamart_project_variables.tf b/data-solutions/data-platform-foundations/datasource/datamart_project_variables.tf deleted file mode 100644 index 41ccbab8c..000000000 --- a/data-solutions/data-platform-foundations/datasource/datamart_project_variables.tf +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# Datamart # -############################################################################### -variable "datamart_bq_datasets" { - description = "Datamart Bigquery datasets" - type = map(any) - default = { - bq_datamart_dataset = { - id = "bq_datamart_dataset" - location = "EU", - } - } -} - -variable "datamart_project_id" { - description = "datamart project ID." - type = string -} - -variable "datamart_service_account" { - description = "datamart service accounts list." - type = string - default = "sa-datamart" -} diff --git a/data-solutions/data-platform-foundations/datasource/dwh_project.tf b/data-solutions/data-platform-foundations/datasource/dwh_project.tf deleted file mode 100644 index 5a4341637..000000000 --- a/data-solutions/data-platform-foundations/datasource/dwh_project.tf +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# Project # -############################################################################### -module "project-id-dwh" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - name = var.dwh_project_id - project_create = false -} - -############################################################################### -# IAM # -############################################################################### -module "dwh-default-service-accounts" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" - project_id = var.dwh_project_id - - name = var.dwh_service_account -} - -############################################################################### -# Bigquery # -############################################################################### -module "bigquery-datasets-dwh" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/bigquery-dataset?ref=v4.2.0" - project_id = var.dwh_project_id - - for_each = var.dwh_bq_datasets - - id = each.value.id - location = each.value.location - - access = { - owner = { role = "OWNER", type = "user" } - reader = { role = "READER", type = "user" } - } - - access_identities = { - owner = module.transformation-default-service-accounts.email - reader = module.dwh-default-service-accounts.email - } - - -} diff --git a/data-solutions/data-platform-foundations/datasource/dwh_project_output.tf b/data-solutions/data-platform-foundations/datasource/dwh_project_output.tf deleted file mode 100644 index 85ba995e5..000000000 --- a/data-solutions/data-platform-foundations/datasource/dwh_project_output.tf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/data-solutions/data-platform-foundations/datasource/dwh_project_variables.tf b/data-solutions/data-platform-foundations/datasource/dwh_project_variables.tf deleted file mode 100644 index 0b29da69d..000000000 --- a/data-solutions/data-platform-foundations/datasource/dwh_project_variables.tf +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# DWH # -############################################################################### -variable "dwh_bq_datasets" { - description = "DWH Bigquery datasets" - type = map(any) - default = { - bq_raw_dataset = { - id = "bq_raw_dataset" - location = "EU", - } - } -} - -variable "dwh_project_id" { - description = "dwh project ID." - type = string -} - -variable "dwh_service_account" { - description = "dwh service accounts list." - type = string - default = "sa-dwh" -} diff --git a/data-solutions/data-platform-foundations/datasource/landing_project.tf b/data-solutions/data-platform-foundations/datasource/landing_project.tf deleted file mode 100644 index 6d4d10569..000000000 --- a/data-solutions/data-platform-foundations/datasource/landing_project.tf +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - landing_pubsub = merge({ - for k, v in var.landing_pubsub : - k => { - name = v.name - subscriptions = v.subscriptions - subscription_iam = merge({ - for s_k, s_v in v.subscription_iam : - s_k => merge(s_v, { "roles/pubsub.subscriber" : ["serviceAccount:${module.transformation-default-service-accounts.email}"] }) - }) - } - }) -} - -############################################################################### -# Project # -############################################################################### -module "project-id-landing" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - name = var.landing_project_id - project_create = false -} - -############################################################################### -# IAM # -############################################################################### -module "landing-default-service-accounts" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" - project_id = var.landing_project_id - - name = var.landing_service_account - - iam_project_roles = { - "${var.landing_project_id}" = [ - "roles/pubsub.publisher", - ] - } -} - -############################################################################### -# GCS # -############################################################################### -module "bucket-landing" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/gcs?ref=v4.2.0" - project_id = var.landing_project_id - prefix = var.landing_project_id - iam = { - "roles/storage.objectCreator" = ["serviceAccount:${module.landing-default-service-accounts.email}"], - "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], - } - - for_each = var.landing_buckets - - name = each.value.name - location = each.value.location -} - -############################################################################### -# Pub/Sub # -############################################################################### -module "pubsub-landing" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/pubsub?ref=v4.2.0" - project_id = var.landing_project_id - - for_each = local.landing_pubsub - - name = each.value.name - subscriptions = each.value.subscriptions - subscription_iam = each.value.subscription_iam -} diff --git a/data-solutions/data-platform-foundations/datasource/landing_project_output.tf b/data-solutions/data-platform-foundations/datasource/landing_project_output.tf deleted file mode 100644 index 85ba995e5..000000000 --- a/data-solutions/data-platform-foundations/datasource/landing_project_output.tf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/data-solutions/data-platform-foundations/datasource/landing_project_variables.tf b/data-solutions/data-platform-foundations/datasource/landing_project_variables.tf deleted file mode 100644 index f4e8dd6a7..000000000 --- a/data-solutions/data-platform-foundations/datasource/landing_project_variables.tf +++ /dev/null @@ -1,82 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# landing # -############################################################################### -variable "landing_buckets" { - description = "List of landing buckets to create" - type = map(any) - default = { - raw-data = { - name = "raw-data" - location = "EU" - }, - data-schema = { - name = "data-schema" - location = "EU" - }, - } -} - -variable "landing_project_id" { - description = "landing project ID." - type = string -} - -variable "landing_pubsub" { - description = "List of landing buckets to create" - type = map(any) - default = { - landing_1 = { - name = "landing-1" - subscriptions = { - sub1 = { - labels = {}, - options = { - ack_deadline_seconds = null - message_retention_duration = null - retain_acked_messages = false - expiration_policy_ttl = null - } - }, - sub2 = { - labels = {}, - options = { - ack_deadline_seconds = null - message_retention_duration = null - retain_acked_messages = false - expiration_policy_ttl = null - } - }, - } - subscription_iam = { - sub1 = { - "roles/pubsub.subscriber" = [] - } - sub2 = { - "roles/pubsub.subscriber" = [] - } - } - } - } -} - -variable "landing_service_account" { - description = "landing service accounts list." - type = string - default = "sa-landing" -} diff --git a/data-solutions/data-platform-foundations/datasource/main.tf b/data-solutions/data-platform-foundations/datasource/main.tf deleted file mode 100644 index e375e0ae3..000000000 --- a/data-solutions/data-platform-foundations/datasource/main.tf +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -locals { - module_version = "4.2.0" -} diff --git a/data-solutions/data-platform-foundations/datasource/outputs.tf b/data-solutions/data-platform-foundations/datasource/outputs.tf deleted file mode 100644 index 85ba995e5..000000000 --- a/data-solutions/data-platform-foundations/datasource/outputs.tf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/data-solutions/data-platform-foundations/datasource/services_project.tf b/data-solutions/data-platform-foundations/datasource/services_project.tf deleted file mode 100644 index adc18088a..000000000 --- a/data-solutions/data-platform-foundations/datasource/services_project.tf +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# Project # -############################################################################### -module "project-id-services" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - name = var.services_project_id - project_create = false -} - -############################################################################### -# IAM # -############################################################################### -module "services-default-service-accounts" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" - project_id = var.services_project_id - - name = var.services_service_account - - iam_project_roles = { - "${var.services_project_id}" = [ - "roles/editor", - ] - } -} diff --git a/data-solutions/data-platform-foundations/datasource/services_project_output.tf b/data-solutions/data-platform-foundations/datasource/services_project_output.tf deleted file mode 100644 index 85ba995e5..000000000 --- a/data-solutions/data-platform-foundations/datasource/services_project_output.tf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ diff --git a/data-solutions/data-platform-foundations/datasource/services_project_variables.tf b/data-solutions/data-platform-foundations/datasource/services_project_variables.tf deleted file mode 100644 index f6f2d2e10..000000000 --- a/data-solutions/data-platform-foundations/datasource/services_project_variables.tf +++ /dev/null @@ -1,29 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# services # -############################################################################### -variable "services_project_id" { - description = "services project ID." - type = string -} - -variable "services_service_account" { - description = "services service accounts list." - type = string - default = "sa-services" -} diff --git a/data-solutions/data-platform-foundations/datasource/transformation_project.tf b/data-solutions/data-platform-foundations/datasource/transformation_project.tf deleted file mode 100644 index 47dbcd131..000000000 --- a/data-solutions/data-platform-foundations/datasource/transformation_project.tf +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# Project # -############################################################################### -module "project-id-transformation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/project?ref=v4.2.0" - name = var.transformation_project_id - project_create = false -} - -############################################################################### -# IAM # -############################################################################### -module "transformation-default-service-accounts" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/iam-service-account?ref=v4.2.0" - project_id = var.transformation_project_id - - name = var.transformation_service_account - - iam_project_roles = { - "${var.transformation_project_id}" = [ - "roles/logging.logWriter", - "roles/monitoring.metricWriter", - "roles/dataflow.admin", - "roles/iam.serviceAccountUser", - "roles/bigquery.dataOwner", - "roles/bigquery.jobUser", - "roles/dataflow.worker", - "roles/bigquery.metadataViewer", - "roles/storage.objectViewer", - ] - } -} - -############################################################################### -# Network # -############################################################################### -module "vpc-transformation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/net-vpc?ref=v4.2.0" - - project_id = var.transformation_project_id - name = var.transformation_vpc_name - subnets = var.transformation_subnets -} - -############################################################################### -# GCS # -############################################################################### -module "bucket-transformation" { - source = "github.com/terraform-google-modules/cloud-foundation-fabric//modules/gcs?ref=v4.2.0" - project_id = var.transformation_project_id - prefix = var.transformation_project_id - - for_each = var.transformation_buckets - - name = each.value.name - location = each.value.location - iam = { - "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], - } -} diff --git a/data-solutions/data-platform-foundations/datasource/transformation_project_output.tf b/data-solutions/data-platform-foundations/datasource/transformation_project_output.tf deleted file mode 100644 index 1543163ec..000000000 --- a/data-solutions/data-platform-foundations/datasource/transformation_project_output.tf +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -output "vpc-transformation-output" { - description = "Transformation VPC details" - value = module.vpc-transformation -} diff --git a/data-solutions/data-platform-foundations/datasource/transformation_project_variables.tf b/data-solutions/data-platform-foundations/datasource/transformation_project_variables.tf deleted file mode 100644 index f3904859d..000000000 --- a/data-solutions/data-platform-foundations/datasource/transformation_project_variables.tf +++ /dev/null @@ -1,63 +0,0 @@ -/** - * Copyright 2020 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -############################################################################### -# Orchestration and Transformation # -############################################################################### -variable "transformation_buckets" { - description = "List of transformation buckets to create" - type = map(any) - default = { - temp = { - name = "temp" - location = "EU" - }, - templates = { - name = "templates" - location = "EU" - }, - } -} - -variable "transformation_project_id" { - description = "Orchestration and Transformation project ID." - type = string -} - -variable "transformation_service_account" { - description = "transformation service accounts list." - type = string - default = "sa-transformation" -} - -variable "transformation_subnets" { - description = "List of subnets to create in the transformation Project." - type = list(any) - default = [ - { - name = "transformation-subnet", - ip_cidr_range = "10.1.0.0/20", - secondary_ip_range = {}, - region = "europe-west3" - }, - ] -} - -variable "transformation_vpc_name" { - description = "Name of the VPC created in the transformation Project." - type = string - default = "transformation-vpc" -} diff --git a/data-solutions/data-platform-foundations/datasource/variables.tf b/data-solutions/data-platform-foundations/datasource/variables.tf deleted file mode 100644 index eb0557f3c..000000000 --- a/data-solutions/data-platform-foundations/datasource/variables.tf +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - diff --git a/data-solutions/data-platform-foundations/resources/README.md b/data-solutions/data-platform-foundations/resources/README.md new file mode 100644 index 000000000..0cc74f5f3 --- /dev/null +++ b/data-solutions/data-platform-foundations/resources/README.md @@ -0,0 +1,82 @@ +# Data Platform Foundations - Phase 2 + +## General + +This is the second step needed to deploy Data Platform Foundations, which creates resources needed to store and process the data in projects created in the [environment step](./../environment/). Please refer to [top-level Data Platform README](../README.md) for prerequisites and how to run the first step. + +![Data Foundation - Phase 2](./diagram.png) + +This example will create the next resources per project: + +- Common +- Landing + - [x] GCS + - [x] Pub/Sub +- Orchestration & Transformation + - [x] Dataflow +- DWH + - [x] Bigquery (L0/1/2) + - [x] GCS +- Datamart + - [x] Bigquery (views/table) + - [x] GCS + - [ ] BigTable + +## Running the example + +You can run Teraform script with the Service Account created in the first step. + +To create the infrastructure: + +- Specify your variables in a `terraform.tvars` + +```tfm +project_ids = { + datamart = "DATAMART-PROJECT_ID" + dwh = "DWH-PROJECT_ID" + landing = "LANDING-PROJECT_ID" + services = "SERVICES-PROJECT_ID" + transformation = "TRANSFORMATION-PROJECT_ID" +} +``` + +- Place the data_service_account_name service account (the service account was created in phase 1) key in the terraform folder +- Go through the following steps to create resources: + +```bash +terraform init +terraform apply +``` + +Once done testing, you can clean up resources by running: + +```bash +terraform destroy +``` + + +## Variables + +| Name | Description | Type | Required | Default| +|------|-------------|------|:--------:|:--------:| +|
[datamart\_bq\_datasets](#Variables\_datamart\_bq\_datasets) | Datamart Bigquery datasets | `object({...})` | | `...` | +| [dwh\_bq\_datasets](#Variables\_dwh\_bq\_datasets) | DWH Bigquery datasets | `object({...})` | | `...` | +| [landing\_buckets](#Variables\_landing\_buckets) | List of landing buckets to create | `object({...})` | | `...` | +| [landing\_pubsub](#Variables\_landing\_pubsub) | List of landing pubsub topics and subscriptions to create | `object({...})` | | `...` | +| [landing\_service\_account](#Variables\_landing\_service\_account) | landing service accounts list. | `string` | | `sa-landing` | +| [project\_ids](#Variables\_project\_ids) | Project IDs. | `object({...})` | ✓ | n/a | +| [project\_service\_account](#Variables\_project\_service\_account) | Project service accounts list. | `object({...})` | | `...` | +| [transformation\_buckets](#Variables\_transformation\_buckets) | List of transformation buckets to create | `object({...})` | | `...` | +| [transformation\_subnets](#Variables\_transformation\_subnets) | List of subnets to create in the transformation Project. | `object({...})` | | `...` | +| [transformation\_vpc\_name](#Variables\_transformation\_vpc\_name) | Name of the VPC created in the transformation Project. | `string` | | `transformation-vpc` | + +## Outputs + +| Name | Description | +|------|-------------| +| [datamart-bigquery-datasets-list](#output\_datamart-bigquery-datasets-list) | List of bigquery datasets created for the datamart project | +| [dwh-bigquery-datasets-list](#output\_dwh-bigquery-datasets-list) | List of bigquery datasets created for the dwh project | +| [landing-bucket-names](#output\_landing-bucket-names) | List of buckets created for the landing project | +| [landing-pubsub-list](#output\_landing-pubsub-list) | List of pubsub topics and subscriptions created for the landing project | +| [transformation-bucket-names](#output\_transformation-bucket-names) | List of buckets created for the transformation project | +| [transformation-vpc-info](#output\_transformation-vpc-info) | Transformation VPC details | diff --git a/data-solutions/data-platform-foundations/datasource/diagram.png b/data-solutions/data-platform-foundations/resources/diagram.png similarity index 100% rename from data-solutions/data-platform-foundations/datasource/diagram.png rename to data-solutions/data-platform-foundations/resources/diagram.png diff --git a/data-solutions/data-platform-foundations/resources/main.tf b/data-solutions/data-platform-foundations/resources/main.tf new file mode 100644 index 000000000..79ec2b0b4 --- /dev/null +++ b/data-solutions/data-platform-foundations/resources/main.tf @@ -0,0 +1,230 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +locals { + landing_pubsub = merge({ + for k, v in var.landing_pubsub : + k => { + name = v.name + subscriptions = v.subscriptions + subscription_iam = merge({ + for s_k, s_v in v.subscription_iam : + s_k => merge(s_v, { "roles/pubsub.subscriber" : ["serviceAccount:${module.transformation-default-service-accounts.email}"] }) + }) + } + }) + + datamart_bq_datasets = merge({ + for k, v in var.datamart_bq_datasets : + k => { + id = v.id + location = v.location + iam = merge({ + for s_k, s_v in v.iam : + s_k => s_k == "roles/bigquery.dataOwner" ? concat(s_v, ["serviceAccount:${module.datamart-default-service-accounts.email}"]) : s_v + }) + } + }) + + dwh_bq_datasets = merge({ + for k, v in var.dwh_bq_datasets : + k => { + id = v.id + location = v.location + iam = merge({ + for s_k, s_v in v.iam : + s_k => s_k == "roles/bigquery.dataOwner" ? concat(s_v, ["serviceAccount:${module.dwh-default-service-accounts.email}", "serviceAccount:${module.transformation-default-service-accounts.email}"]) : s_v + }) + } + }) +} + +############################################################################### +# Projects # +############################################################################### +module "project-datamart" { + source = "../../../modules/project" + name = var.project_ids.datamart + project_create = false +} + +module "project-dwh" { + source = "../../../modules/project" + name = var.project_ids.dwh + project_create = false +} + +module "project-landing" { + source = "../../../modules/project" + name = var.project_ids.landing + project_create = false +} + +module "project-services" { + source = "../../../modules/project" + name = var.project_ids.services + project_create = false +} + +module "project-transformation" { + source = "../../../modules/project" + name = var.project_ids.transformation + project_create = false +} + +############################################################################### +# IAM # +############################################################################### + +module "datamart-default-service-accounts" { + source = "../../../modules/iam-service-account" + project_id = module.project-datamart.project_id + name = var.project_service_account.datamart + + iam_project_roles = { + "${module.project-datamart.project_id}" = [ + "roles/editor", + ] + } +} + +module "dwh-default-service-accounts" { + source = "../../../modules/iam-service-account" + project_id = module.project-dwh.project_id + name = var.project_service_account.dwh +} + +module "landing-default-service-accounts" { + source = "../../../modules/iam-service-account" + project_id = module.project-landing.project_id + name = var.project_service_account.landing + + iam_project_roles = { + "${module.project-landing.project_id}" = [ + "roles/pubsub.publisher", + ] + } +} + +module "services-default-service-accounts" { + source = "../../../modules/iam-service-account" + project_id = module.project-services.project_id + name = var.project_service_account.services + + iam_project_roles = { + "${module.project-services.project_id}" = [ + "roles/editor", + ] + } +} + +module "transformation-default-service-accounts" { + source = "../../../modules/iam-service-account" + project_id = module.project-transformation.project_id + name = var.project_service_account.transformation + + iam_project_roles = { + "${module.project-transformation.project_id}" = [ + "roles/logging.logWriter", + "roles/monitoring.metricWriter", + "roles/dataflow.admin", + "roles/iam.serviceAccountUser", + "roles/bigquery.dataOwner", + "roles/bigquery.jobUser", + "roles/dataflow.worker", + "roles/bigquery.metadataViewer", + "roles/storage.objectViewer", + ] + } +} + +############################################################################### +# GCS # +############################################################################### + +module "bucket-landing" { + source = "../../../modules/gcs" + project_id = module.project-landing.project_id + prefix = var.project_ids.landing + iam = { + "roles/storage.objectCreator" = ["serviceAccount:${module.landing-default-service-accounts.email}"], + "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], + } + + for_each = var.landing_buckets + name = each.value.name + location = each.value.location +} + +module "bucket-transformation" { + source = "../../../modules/gcs" + project_id = module.project-transformation.project_id + prefix = var.project_ids.transformation + + for_each = var.transformation_buckets + name = each.value.name + location = each.value.location + iam = { + "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], + } +} + +############################################################################### +# Bigquery # +############################################################################### + +module "bigquery-datasets-datamart" { + source = "../../../modules/bigquery-dataset" + project_id = module.project-datamart.project_id + + for_each = local.datamart_bq_datasets + id = each.value.id + location = each.value.location + iam = each.value.iam +} + +module "bigquery-datasets-dwh" { + source = "../../../modules/bigquery-dataset" + project_id = module.project-dwh.project_id + + for_each = local.dwh_bq_datasets + id = each.value.id + location = each.value.location + iam = each.value.iam +} + +############################################################################### +# Network # +############################################################################### +module "vpc-transformation" { + source = "../../../modules/net-vpc" + project_id = module.project-transformation.project_id + name = var.transformation_vpc_name + subnets = var.transformation_subnets +} + +############################################################################### +# Pub/Sub # +############################################################################### +module "pubsub-landing" { + source = "../../../modules/pubsub" + project_id = module.project-landing.project_id + + for_each = local.landing_pubsub + name = each.value.name + subscriptions = each.value.subscriptions + subscription_iam = each.value.subscription_iam +} diff --git a/data-solutions/data-platform-foundations/resources/outputs.tf b/data-solutions/data-platform-foundations/resources/outputs.tf new file mode 100644 index 000000000..e0f51e81b --- /dev/null +++ b/data-solutions/data-platform-foundations/resources/outputs.tf @@ -0,0 +1,83 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +############################################################################### +# Network # +############################################################################### + +output "transformation-vpc-info" { + description = "Transformation VPC details" + value = { + name = module.vpc-transformation.name + subnets = { + for s in module.vpc-transformation.subnets : s.name => { + gateway_address = s.gateway_address + ip_cidr_range = s.ip_cidr_range + private_ip_google_access = s.private_ip_google_access + region = s.region + } + } + } +} + +############################################################################### +# GCS # +############################################################################### + +output "landing-bucket-names" { + description = "List of buckets created for the landing project" + value = [for k, bucket in module.bucket-landing : "${bucket.name}"] +} + +output "transformation-bucket-names" { + description = "List of buckets created for the transformation project" + value = [for k, bucket in module.bucket-transformation : "${bucket.name}"] +} + +############################################################################### +# Bigquery # +############################################################################### + +output "dwh-bigquery-datasets-list" { + description = "List of bigquery datasets created for the dwh project" + value = [for k, datasets in module.bigquery-datasets-dwh : "${datasets.dataset_id}"] +} + +output "datamart-bigquery-datasets-list" { + description = "List of bigquery datasets created for the datamart project" + value = [for k, datasets in module.bigquery-datasets-datamart : "${datasets.dataset_id}"] +} + +############################################################################### +# Pub/Sub # +############################################################################### + +output "landing-pubsub-list" { + description = "List of pubsub topics and subscriptions created for the landing project" + value = { + for t in module.pubsub-landing : t.topic.name => { + name = t.topic.name + id = t.topic.id + subscriptions = { + for s in t.subscriptions : s.name => { + name = s.name + id = s.id + } + } + } + } +} diff --git a/data-solutions/data-platform-foundations/resources/variables.tf b/data-solutions/data-platform-foundations/resources/variables.tf new file mode 100644 index 000000000..3f599b5d4 --- /dev/null +++ b/data-solutions/data-platform-foundations/resources/variables.tf @@ -0,0 +1,168 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +variable "datamart_bq_datasets" { + description = "Datamart Bigquery datasets" + type = map(any) + default = { + bq_datamart_dataset = { + id = "bq_datamart_dataset" + location = "EU" + iam = { + "roles/bigquery.dataOwner" = [] + "roles/bigquery.dataEditor" = [] + "roles/bigquery.dataViewer" = [] + } + } + } +} + +variable "dwh_bq_datasets" { + description = "DWH Bigquery datasets" + type = map(any) + default = { + bq_raw_dataset = { + id = "bq_raw_dataset" + location = "EU" + iam = { + "roles/bigquery.dataOwner" = [] + "roles/bigquery.dataEditor" = [] + "roles/bigquery.dataViewer" = [] + } + } + } +} + +variable "landing_buckets" { + description = "List of landing buckets to create" + type = map(any) + default = { + raw-data = { + name = "raw-data" + location = "EU" + }, + data-schema = { + name = "data-schema" + location = "EU" + }, + } +} + +variable "landing_pubsub" { + description = "List of landing pubsub topics and subscriptions to create" + type = map(any) + default = { + landing_1 = { + name = "landing-1" + subscriptions = { + sub1 = { + labels = {}, + options = { + ack_deadline_seconds = null + message_retention_duration = null + retain_acked_messages = false + expiration_policy_ttl = null + } + }, + sub2 = { + labels = {}, + options = { + ack_deadline_seconds = null + message_retention_duration = null + retain_acked_messages = false + expiration_policy_ttl = null + } + }, + } + subscription_iam = { + sub1 = { + "roles/pubsub.subscriber" = [] + } + sub2 = { + "roles/pubsub.subscriber" = [] + } + } + } + } +} + +variable "landing_service_account" { + description = "landing service accounts list." + type = string + default = "sa-landing" +} + +variable "project_ids" { + description = "Project IDs." + type = object({ + datamart = string + dwh = string + landing = string + services = string + transformation = string + }) +} + + +variable "project_service_account" { + description = "Project service accounts list." + type = object({ + datamart = string + dwh = string + landing = string + services = string + transformation = string + }) + default = { + datamart = "sa-datamart" + dwh = "sa-datawh" + landing = "sa-landing" + services = "sa-services" + transformation = "sa-transformation" + } +} + +variable "transformation_buckets" { + description = "List of transformation buckets to create" + type = map(any) + default = { + temp = { + name = "temp" + location = "EU" + }, + templates = { + name = "templates" + location = "EU" + }, + } +} + +variable "transformation_subnets" { + description = "List of subnets to create in the transformation Project." + type = list(any) + default = [ + { + name = "transformation-subnet", + ip_cidr_range = "10.1.0.0/20", + secondary_ip_range = {}, + region = "europe-west3" + }, + ] +} + +variable "transformation_vpc_name" { + description = "Name of the VPC created in the transformation Project." + type = string + default = "transformation-vpc" +} diff --git a/data-solutions/data-platform-foundations/datasource/versions.tf b/data-solutions/data-platform-foundations/resources/versions.tf similarity index 100% rename from data-solutions/data-platform-foundations/datasource/versions.tf rename to data-solutions/data-platform-foundations/resources/versions.tf From abca48873760f519a2050814b02a01c17f5cbd62 Mon Sep 17 00:00:00 2001 From: Ludovico Magnocavallo Date: Thu, 10 Jun 2021 17:04:27 +0200 Subject: [PATCH 11/19] refactor resources --- data-solutions/README.md | 2 +- .../environment/README.md | 9 +- .../environment/outputs.tf | 5 + .../resources/README.md | 78 +++---- .../resources/main.tf | 207 ++++++------------ .../resources/outputs.tf | 91 +++----- .../resources/variables.tf | 111 +++++----- 7 files changed, 207 insertions(+), 296 deletions(-) diff --git a/data-solutions/README.md b/data-solutions/README.md index 33e22153d..af35f8df8 100644 --- a/data-solutions/README.md +++ b/data-solutions/README.md @@ -19,5 +19,5 @@ All resources use CMEK hosted in Cloud KMS running in a centralized project. The ### Data Platform Foundations -This [example](./data-platform-foundations/) implements a **robust and flexible** Data Foundation on GCP that provides **opinionated defaults** while allowing customers to **build and scale** out additional data pipelines **quickly and reliably**. +This [example](./data-platform-foundations/) implements a robust and flexible Data Foundation on GCP that provides opinionated defaults, allowing customers to build and scale out additional data pipelines quickly and reliably.
diff --git a/data-solutions/data-platform-foundations/environment/README.md b/data-solutions/data-platform-foundations/environment/README.md index 824df21a1..e4885932c 100644 --- a/data-solutions/data-platform-foundations/environment/README.md +++ b/data-solutions/data-platform-foundations/environment/README.md @@ -10,7 +10,11 @@ The projects that will be created are: - DWH - Datamart -A master service account named `projects-editor-sa` will be created under the common services project, and it will be granted editor permissions on all the projects in scope. +A main service account named `projects-editor-sa` will be created under the common services project, and it will be granted editor permissions on all the projects in scope. + +This is a high level diagram of the created resources: + +![Environment - Phase 1](./diagram.png) ## Running the example @@ -26,7 +30,7 @@ parent = "folders/12345678" - make sure you have the right authentication setup (application default credentials, or a service account key) - run `terraform init` and `terraform apply` -Once done testing, you can clean up resources by running `terraform destroy` +Once done testing, you can clean up resources by running `terraform destroy`. ## Variables @@ -44,4 +48,5 @@ Once done testing, you can clean up resources by running `terraform destroy` | name | description | sensitive | |---|---|:---:| | project_ids | Project ids for created projects. | | +| service_account | Main service account. | | diff --git a/data-solutions/data-platform-foundations/environment/outputs.tf b/data-solutions/data-platform-foundations/environment/outputs.tf index 0919bdd0e..b13d8fe07 100644 --- a/data-solutions/data-platform-foundations/environment/outputs.tf +++ b/data-solutions/data-platform-foundations/environment/outputs.tf @@ -24,3 +24,8 @@ output "project_ids" { transformation = module.project-transformation.project_id } } + +output "service_account" { + description = "Main service account." + value = module.sa-services-main.email +} diff --git a/data-solutions/data-platform-foundations/resources/README.md b/data-solutions/data-platform-foundations/resources/README.md index 0cc74f5f3..01c0f96e9 100644 --- a/data-solutions/data-platform-foundations/resources/README.md +++ b/data-solutions/data-platform-foundations/resources/README.md @@ -1,12 +1,10 @@ -# Data Platform Foundations - Phase 2 +# Data Platform Foundations - Resources (Step 2) -## General - -This is the second step needed to deploy Data Platform Foundations, which creates resources needed to store and process the data in projects created in the [environment step](./../environment/). Please refer to [top-level Data Platform README](../README.md) for prerequisites and how to run the first step. +This is the second step needed to deploy Data Platform Foundations, which creates resources needed to store and process the data, in the projects created in the [previous step](./../environment/). Please refer to the [top-level README](../README.md) for prerequisites and how to run the first step. ![Data Foundation - Phase 2](./diagram.png) -This example will create the next resources per project: +The resources that will be create in each project are: - Common - Landing @@ -24,59 +22,49 @@ This example will create the next resources per project: ## Running the example -You can run Teraform script with the Service Account created in the first step. - -To create the infrastructure: +To create the resources, you can leverage the service account created in the previous step: - Specify your variables in a `terraform.tvars` ```tfm project_ids = { - datamart = "DATAMART-PROJECT_ID" - dwh = "DWH-PROJECT_ID" - landing = "LANDING-PROJECT_ID" - services = "SERVICES-PROJECT_ID" - transformation = "TRANSFORMATION-PROJECT_ID" + datamart = "datamart-project_id" + dwh = "dwh-project_id" + landing = "landing-project_id" + services = "services-project_id" + transformation = "transformation-project_id" } ``` -- Place the data_service_account_name service account (the service account was created in phase 1) key in the terraform folder -- Go through the following steps to create resources: +- make sure you have the right authentication setup (application default credentials, or a service account key) +- run `terraform init` and `terraform apply` -```bash -terraform init -terraform apply -``` - -Once done testing, you can clean up resources by running: - -```bash -terraform destroy -``` +Once done testing, you can clean up resources by running `terraform destroy`. ## Variables -| Name | Description | Type | Required | Default| -|------|-------------|------|:--------:|:--------:| -| [datamart\_bq\_datasets](#Variables\_datamart\_bq\_datasets) | Datamart Bigquery datasets | `object({...})` | | `...` | -| [dwh\_bq\_datasets](#Variables\_dwh\_bq\_datasets) | DWH Bigquery datasets | `object({...})` | | `...` | -| [landing\_buckets](#Variables\_landing\_buckets) | List of landing buckets to create | `object({...})` | | `...` | -| [landing\_pubsub](#Variables\_landing\_pubsub) | List of landing pubsub topics and subscriptions to create | `object({...})` | | `...` | -| [landing\_service\_account](#Variables\_landing\_service\_account) | landing service accounts list. | `string` | | `sa-landing` | -| [project\_ids](#Variables\_project\_ids) | Project IDs. | `object({...})` | ✓ | n/a | -| [project\_service\_account](#Variables\_project\_service\_account) | Project service accounts list. | `object({...})` | | `...` | -| [transformation\_buckets](#Variables\_transformation\_buckets) | List of transformation buckets to create | `object({...})` | | `...` | -| [transformation\_subnets](#Variables\_transformation\_subnets) | List of subnets to create in the transformation Project. | `object({...})` | | `...` | -| [transformation\_vpc\_name](#Variables\_transformation\_vpc\_name) | Name of the VPC created in the transformation Project. | `string` | | `transformation-vpc` | +| name | description | type | required | default | +|---|---|:---: |:---:|:---:| +| project_ids | Project IDs. | object({...}) | ✓ | | +| *datamart_bq_datasets* | Datamart Bigquery datasets | map(object({...})) | | ... | +| *dwh_bq_datasets* | DWH Bigquery datasets | map(object({...})) | | ... | +| *landing_buckets* | List of landing buckets to create | map(object({...})) | | ... | +| *landing_pubsub* | List of landing pubsub topics and subscriptions to create | map(map(object({...}))) | | ... | +| *landing_service_account* | landing service accounts list. | string | | sa-landing | +| *service_account_names* | Project service accounts list. | object({...}) | | ... | +| *transformation_buckets* | List of transformation buckets to create | map(object({...})) | | ... | +| *transformation_subnets* | List of subnets to create in the transformation Project. | list(object({...})) | | ... | +| *transformation_vpc_name* | Name of the VPC created in the transformation Project. | string | | transformation-vpc | ## Outputs -| Name | Description | -|------|-------------| -| [datamart-bigquery-datasets-list](#output\_datamart-bigquery-datasets-list) | List of bigquery datasets created for the datamart project | -| [dwh-bigquery-datasets-list](#output\_dwh-bigquery-datasets-list) | List of bigquery datasets created for the dwh project | -| [landing-bucket-names](#output\_landing-bucket-names) | List of buckets created for the landing project | -| [landing-pubsub-list](#output\_landing-pubsub-list) | List of pubsub topics and subscriptions created for the landing project | -| [transformation-bucket-names](#output\_transformation-bucket-names) | List of buckets created for the transformation project | -| [transformation-vpc-info](#output\_transformation-vpc-info) | Transformation VPC details | +| name | description | sensitive | +|---|---|:---:| +| datamart-datasets | List of bigquery datasets created for the datamart project. | | +| dwh-datasets | List of bigquery datasets created for the dwh project. | | +| landing-buckets | List of buckets created for the landing project. | | +| landing-pubsub | List of pubsub topics and subscriptions created for the landing project. | | +| transformation-buckets | List of buckets created for the transformation project. | | +| transformation-vpc | Transformation VPC details | | + diff --git a/data-solutions/data-platform-foundations/resources/main.tf b/data-solutions/data-platform-foundations/resources/main.tf index 79ec2b0b4..19816cbcb 100644 --- a/data-solutions/data-platform-foundations/resources/main.tf +++ b/data-solutions/data-platform-foundations/resources/main.tf @@ -14,130 +14,49 @@ * limitations under the License. */ -locals { - landing_pubsub = merge({ - for k, v in var.landing_pubsub : - k => { - name = v.name - subscriptions = v.subscriptions - subscription_iam = merge({ - for s_k, s_v in v.subscription_iam : - s_k => merge(s_v, { "roles/pubsub.subscriber" : ["serviceAccount:${module.transformation-default-service-accounts.email}"] }) - }) - } - }) - - datamart_bq_datasets = merge({ - for k, v in var.datamart_bq_datasets : - k => { - id = v.id - location = v.location - iam = merge({ - for s_k, s_v in v.iam : - s_k => s_k == "roles/bigquery.dataOwner" ? concat(s_v, ["serviceAccount:${module.datamart-default-service-accounts.email}"]) : s_v - }) - } - }) - - dwh_bq_datasets = merge({ - for k, v in var.dwh_bq_datasets : - k => { - id = v.id - location = v.location - iam = merge({ - for s_k, s_v in v.iam : - s_k => s_k == "roles/bigquery.dataOwner" ? concat(s_v, ["serviceAccount:${module.dwh-default-service-accounts.email}", "serviceAccount:${module.transformation-default-service-accounts.email}"]) : s_v - }) - } - }) -} - -############################################################################### -# Projects # -############################################################################### -module "project-datamart" { - source = "../../../modules/project" - name = var.project_ids.datamart - project_create = false -} - -module "project-dwh" { - source = "../../../modules/project" - name = var.project_ids.dwh - project_create = false -} - -module "project-landing" { - source = "../../../modules/project" - name = var.project_ids.landing - project_create = false -} - -module "project-services" { - source = "../../../modules/project" - name = var.project_ids.services - project_create = false -} - -module "project-transformation" { - source = "../../../modules/project" - name = var.project_ids.transformation - project_create = false -} - ############################################################################### # IAM # ############################################################################### -module "datamart-default-service-accounts" { +module "datamart-sa" { source = "../../../modules/iam-service-account" - project_id = module.project-datamart.project_id - name = var.project_service_account.datamart - + project_id = var.project_ids.datamart + name = var.service_account_names.datamart iam_project_roles = { - "${module.project-datamart.project_id}" = [ - "roles/editor", - ] + "${var.project_ids.datamart}" = ["roles/editor"] } } -module "dwh-default-service-accounts" { +module "dwh-sa" { source = "../../../modules/iam-service-account" - project_id = module.project-dwh.project_id - name = var.project_service_account.dwh + project_id = var.project_ids.dwh + name = var.service_account_names.dwh } -module "landing-default-service-accounts" { +module "landing-sa" { source = "../../../modules/iam-service-account" - project_id = module.project-landing.project_id - name = var.project_service_account.landing - + project_id = var.project_ids.landing + name = var.service_account_names.landing iam_project_roles = { - "${module.project-landing.project_id}" = [ - "roles/pubsub.publisher", - ] + "${var.project_ids.landing}" = ["roles/pubsub.publisher"] } } -module "services-default-service-accounts" { +module "services-sa" { source = "../../../modules/iam-service-account" - project_id = module.project-services.project_id - name = var.project_service_account.services - + project_id = var.project_ids.services + name = var.service_account_names.services iam_project_roles = { - "${module.project-services.project_id}" = [ - "roles/editor", - ] + "${var.project_ids.services}" = ["roles/editor"] } } -module "transformation-default-service-accounts" { +module "transformation-sa" { source = "../../../modules/iam-service-account" - project_id = module.project-transformation.project_id - name = var.project_service_account.transformation - + project_id = var.project_ids.transformation + name = var.service_account_names.transformation iam_project_roles = { - "${module.project-transformation.project_id}" = [ + "${var.project_ids.transformation}" = [ "roles/logging.logWriter", "roles/monitoring.metricWriter", "roles/dataflow.admin", @@ -155,30 +74,28 @@ module "transformation-default-service-accounts" { # GCS # ############################################################################### -module "bucket-landing" { +module "landing-buckets" { source = "../../../modules/gcs" - project_id = module.project-landing.project_id + for_each = var.landing_buckets + project_id = var.project_ids.landing prefix = var.project_ids.landing + name = each.value.name + location = each.value.location iam = { - "roles/storage.objectCreator" = ["serviceAccount:${module.landing-default-service-accounts.email}"], - "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], + "roles/storage.objectCreator" = [module.landing-sa.iam_email] + "roles/storage.admin" = [module.transformation-sa.iam_email] } - - for_each = var.landing_buckets - name = each.value.name - location = each.value.location } -module "bucket-transformation" { +module "transformation-buckets" { source = "../../../modules/gcs" - project_id = module.project-transformation.project_id + for_each = var.transformation_buckets + project_id = var.project_ids.transformation prefix = var.project_ids.transformation - - for_each = var.transformation_buckets - name = each.value.name - location = each.value.location + name = each.value.name + location = each.value.location iam = { - "roles/storage.admin" = ["serviceAccount:${module.transformation-default-service-accounts.email}"], + "roles/storage.admin" = [module.transformation-sa.iam_email] } } @@ -186,24 +103,34 @@ module "bucket-transformation" { # Bigquery # ############################################################################### -module "bigquery-datasets-datamart" { +module "datamart-bq" { source = "../../../modules/bigquery-dataset" - project_id = module.project-datamart.project_id - - for_each = local.datamart_bq_datasets - id = each.value.id - location = each.value.location - iam = each.value.iam + for_each = var.datamart_bq_datasets + project_id = var.project_ids.datamart + id = each.key + location = each.value.location + iam = { + for k, v in each.value.iam : k => ( + k == "roles/bigquery.dataOwner" + ? concat(v, [module.datamart-sa.iam_email]) + : v + ) + } } -module "bigquery-datasets-dwh" { +module "dwh-bq" { source = "../../../modules/bigquery-dataset" - project_id = module.project-dwh.project_id - - for_each = local.dwh_bq_datasets - id = each.value.id - location = each.value.location - iam = each.value.iam + for_each = var.dwh_bq_datasets + project_id = var.project_ids.dwh + id = each.key + location = each.value.location + iam = { + for k, v in each.value.iam : k => ( + k == "roles/bigquery.dataOwner" + ? concat(v, [module.dwh-sa.iam_email]) + : v + ) + } } ############################################################################### @@ -211,7 +138,7 @@ module "bigquery-datasets-dwh" { ############################################################################### module "vpc-transformation" { source = "../../../modules/net-vpc" - project_id = module.project-transformation.project_id + project_id = var.project_ids.transformation name = var.transformation_vpc_name subnets = var.transformation_subnets } @@ -219,12 +146,18 @@ module "vpc-transformation" { ############################################################################### # Pub/Sub # ############################################################################### -module "pubsub-landing" { - source = "../../../modules/pubsub" - project_id = module.project-landing.project_id - for_each = local.landing_pubsub - name = each.value.name - subscriptions = each.value.subscriptions - subscription_iam = each.value.subscription_iam +module "landing-pubsub" { + source = "../../../modules/pubsub" + for_each = var.landing_pubsub + project_id = var.project_ids.landing + name = each.key + subscriptions = { + for k, v in each.value : k => { labels = v.labels, options = v.options } + } + subscription_iam = { + for k, v in each.value : k => merge(v.iam, { + "roles/pubsub.subscriber" = [module.transformation-sa.iam_email] + }) + } } diff --git a/data-solutions/data-platform-foundations/resources/outputs.tf b/data-solutions/data-platform-foundations/resources/outputs.tf index e0f51e81b..3023587d9 100644 --- a/data-solutions/data-platform-foundations/resources/outputs.tf +++ b/data-solutions/data-platform-foundations/resources/outputs.tf @@ -14,69 +14,46 @@ * limitations under the License. */ +output "datamart-datasets" { + description = "List of bigquery datasets created for the datamart project." + value = [ + for k, datasets in module.datamart-bq : datasets.dataset_id + ] +} -############################################################################### -# Network # -############################################################################### +output "dwh-datasets" { + description = "List of bigquery datasets created for the dwh project." + value = [for k, datasets in module.dwh-bq : datasets.dataset_id] +} -output "transformation-vpc-info" { +output "landing-buckets" { + description = "List of buckets created for the landing project." + value = [for k, bucket in module.landing-buckets : bucket.name] +} + +output "landing-pubsub" { + description = "List of pubsub topics and subscriptions created for the landing project." + value = { + for t in module.landing-pubsub : t.topic.name => { + id = t.topic.id + subscriptions = { for s in t.subscriptions : s.name => s.id } + } + } +} + +output "transformation-buckets" { + description = "List of buckets created for the transformation project." + value = [for k, bucket in module.transformation-buckets : bucket.name] +} + +output "transformation-vpc" { description = "Transformation VPC details" value = { name = module.vpc-transformation.name subnets = { - for s in module.vpc-transformation.subnets : s.name => { - gateway_address = s.gateway_address - ip_cidr_range = s.ip_cidr_range - private_ip_google_access = s.private_ip_google_access - region = s.region - } - } - } -} - -############################################################################### -# GCS # -############################################################################### - -output "landing-bucket-names" { - description = "List of buckets created for the landing project" - value = [for k, bucket in module.bucket-landing : "${bucket.name}"] -} - -output "transformation-bucket-names" { - description = "List of buckets created for the transformation project" - value = [for k, bucket in module.bucket-transformation : "${bucket.name}"] -} - -############################################################################### -# Bigquery # -############################################################################### - -output "dwh-bigquery-datasets-list" { - description = "List of bigquery datasets created for the dwh project" - value = [for k, datasets in module.bigquery-datasets-dwh : "${datasets.dataset_id}"] -} - -output "datamart-bigquery-datasets-list" { - description = "List of bigquery datasets created for the datamart project" - value = [for k, datasets in module.bigquery-datasets-datamart : "${datasets.dataset_id}"] -} - -############################################################################### -# Pub/Sub # -############################################################################### - -output "landing-pubsub-list" { - description = "List of pubsub topics and subscriptions created for the landing project" - value = { - for t in module.pubsub-landing : t.topic.name => { - name = t.topic.name - id = t.topic.id - subscriptions = { - for s in t.subscriptions : s.name => { - name = s.name - id = s.id - } + for k, s in module.vpc-transformation.subnets : k => { + ip_cidr_range = s.ip_cidr_range + region = s.region } } } diff --git a/data-solutions/data-platform-foundations/resources/variables.tf b/data-solutions/data-platform-foundations/resources/variables.tf index 3f599b5d4..bd139724f 100644 --- a/data-solutions/data-platform-foundations/resources/variables.tf +++ b/data-solutions/data-platform-foundations/resources/variables.tf @@ -14,15 +14,17 @@ variable "datamart_bq_datasets" { description = "Datamart Bigquery datasets" - type = map(any) + type = map(object({ + iam = map(list(string)) + location = string + })) default = { bq_datamart_dataset = { - id = "bq_datamart_dataset" location = "EU" iam = { - "roles/bigquery.dataOwner" = [] - "roles/bigquery.dataEditor" = [] - "roles/bigquery.dataViewer" = [] + # "roles/bigquery.dataOwner" = [] + # "roles/bigquery.dataEditor" = [] + # "roles/bigquery.dataViewer" = [] } } } @@ -30,69 +32,62 @@ variable "datamart_bq_datasets" { variable "dwh_bq_datasets" { description = "DWH Bigquery datasets" - type = map(any) + type = map(object({ + location = string + iam = map(list(string)) + })) default = { bq_raw_dataset = { - id = "bq_raw_dataset" + iam = {} location = "EU" - iam = { - "roles/bigquery.dataOwner" = [] - "roles/bigquery.dataEditor" = [] - "roles/bigquery.dataViewer" = [] - } } } } variable "landing_buckets" { description = "List of landing buckets to create" - type = map(any) + type = map(object({ + location = string + name = string + })) default = { raw-data = { + location = "EU" name = "raw-data" - location = "EU" - }, + } data-schema = { - name = "data-schema" location = "EU" - }, + name = "data-schema" + } } } variable "landing_pubsub" { description = "List of landing pubsub topics and subscriptions to create" - type = map(any) + type = map(map(object({ + iam = map(list(string)) + labels = map(string) + options = object({ + ack_deadline_seconds = number + message_retention_duration = number + retain_acked_messages = bool + expiration_policy_ttl = number + }) + }))) default = { - landing_1 = { - name = "landing-1" - subscriptions = { - sub1 = { - labels = {}, - options = { - ack_deadline_seconds = null - message_retention_duration = null - retain_acked_messages = false - expiration_policy_ttl = null - } - }, - sub2 = { - labels = {}, - options = { - ack_deadline_seconds = null - message_retention_duration = null - retain_acked_messages = false - expiration_policy_ttl = null - } - }, - } - subscription_iam = { - sub1 = { - "roles/pubsub.subscriber" = [] - } - sub2 = { - "roles/pubsub.subscriber" = [] + landing-1 = { + sub1 = { + iam = { + # "roles/pubsub.subscriber" = [] } + labels = {} + options = null } + sub2 = { + iam = {} + labels = {}, + options = null + }, } } } @@ -115,7 +110,7 @@ variable "project_ids" { } -variable "project_service_account" { +variable "service_account_names" { description = "Project service accounts list." type = object({ datamart = string @@ -135,28 +130,36 @@ variable "project_service_account" { variable "transformation_buckets" { description = "List of transformation buckets to create" - type = map(any) + type = map(object({ + location = string + name = string + })) default = { temp = { - name = "temp" location = "EU" + name = "temp" }, templates = { - name = "templates" location = "EU" + name = "templates" }, } } variable "transformation_subnets" { description = "List of subnets to create in the transformation Project." - type = list(any) + type = list(object({ + ip_cidr_range = string + name = string + region = string + secondary_ip_range = map(string) + })) default = [ { - name = "transformation-subnet", - ip_cidr_range = "10.1.0.0/20", - secondary_ip_range = {}, + ip_cidr_range = "10.1.0.0/20" + name = "transformation-subnet" region = "europe-west3" + secondary_ip_range = {} }, ] } From d9bf58c7573df161c195aea1aaba7b107e64986a Mon Sep 17 00:00:00 2001 From: Yoram Ben-Yaacov Date: Fri, 11 Jun 2021 11:15:04 +0300 Subject: [PATCH 12/19] 1. Diagrams redo to make them similar to the ones for the other examples. 2. Link fix in the README file --- data-solutions/README.md | 3 ++- .../environment/README.md | 2 +- .../environment/diagram.png | Bin 23106 -> 281880 bytes .../resources/README.md | 2 +- .../resources/diagram.png | Bin 37496 -> 481113 bytes 5 files changed, 4 insertions(+), 3 deletions(-) diff --git a/data-solutions/README.md b/data-solutions/README.md index af35f8df8..f01ac8c33 100644 --- a/data-solutions/README.md +++ b/data-solutions/README.md @@ -18,6 +18,7 @@ All resources use CMEK hosted in Cloud KMS running in a centralized project. The ### Data Platform Foundations - + This [example](./data-platform-foundations/) implements a robust and flexible Data Foundation on GCP that provides opinionated defaults, allowing customers to build and scale out additional data pipelines quickly and reliably.
+ diff --git a/data-solutions/data-platform-foundations/environment/README.md b/data-solutions/data-platform-foundations/environment/README.md index e4885932c..9ab6bb16e 100644 --- a/data-solutions/data-platform-foundations/environment/README.md +++ b/data-solutions/data-platform-foundations/environment/README.md @@ -14,7 +14,7 @@ A main service account named `projects-editor-sa` will be created under the comm This is a high level diagram of the created resources: -![Environment - Phase 1](./diagram.png) +![Environment - Phase 1](./diagram.png "High-level Environment diagram") ## Running the example diff --git a/data-solutions/data-platform-foundations/environment/diagram.png b/data-solutions/data-platform-foundations/environment/diagram.png index b6ecc4a59b3ced342ee78b1a35b8f9ef27d82c30..eb9508d8e46bccc5f38583d2b4c0de0882f99fd1 100644 GIT binary patch literal 281880 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 kQXC5aQ+{BO*p!VAz9vV`NPEW8&8g8oD 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 j!^1KyC`QRfTyYeEb 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 yJT8x(ErOTHue<~<} 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