Step 1: Prepare your project

This page describes the steps to prepare your Google Cloud project before deploying Manufacturing Data Engine (MDE) using Terraform.

Overview

MDE is delivered as a packaged solution. A Terraform script deploys all the required components and the integration code into your Google Cloud project. This unlocks maximum flexibility for you to modify and extends the architecture based on your needs.

The deployment script automatically sets up and configures the solution, assuming prerequisites such as a Google Cloud project and permissions are in place. Some customers may have extensive, customized Google Cloud restrictions in place. If this is the case, extra work (via Google Cloud Consulting or a Systems Integration partner) may be required for the deployment to navigate around these restrictions.

1. Prepare your client environment

Your client environment needs to have the following CLI tools installed in their most updated version:

2. Prepare your Google Cloud project

Make sure your Google Cloud project has the following characteristics:

  • An active Cloud Billing account.
  • It's part of an organization with an active Cloud Identity or Workspace account.

  • Set up the default project to the MDE deployment project using the following command:

     gcloud  
    config  
     set 
      
    project  
     PROJECT_ID 
     
    

    Replace the following:

    • PROJECT_ID with the MDE deployment project ID.

3. Create service accounts

You will need two different Service Accounts in your Google Cloud project:

  • mde-df-worker@ PROJECT_ID .iam.gserviceaccount.com
  • mde-tf@ PROJECT_ID .iam.gserviceaccount.com .

Replace the following:

  • PROJECT_ID with the MDE deployment project ID.

A user in your org with the roles/iam.serviceAccountCreator role can create the mde-df-workerand mde-tfservice accounts with the following commands:

 gcloud  
iam  
service-accounts  
create  
mde-df-worker  
 \ 
--description = 
 "Manufacturing Data Engine Dataflow Worker Service Account" 
  
 \ 
--display-name = 
 "Manufacturing Data Engine Dataflow Worker Service Account" 
gcloud  
iam  
service-accounts  
create  
mde-tf  
 \ 
--description = 
 "Manufacturing Data Engine Terraform Service Account" 
  
 \ 
--display-name = 
 "Manufacturing Data Engine Terraform Service Account" 
 

Grant the mde-tfservice account, used by Terraform for deployments, the following roles:

  • roles/bigquery.admin
  • roles/bigtable.admin
  • roles/cloudsql.admin
  • roles/compute.instanceAdmin
  • roles/compute.loadBalancerAdmin
  • roles/compute.networkAdmin
  • roles/compute.securityAdmin
  • roles/container.admin
  • roles/container.developer
  • roles/dataflow.admin
  • roles/dns.admin
  • roles/iam.serviceAccountAdmin
  • roles/iam.serviceAccountUser
  • roles/pubsub.admin
  • roles/resourcemanager.projectIamAdmin
  • roles/secretmanager.admin
  • roles/secretmanager.secretVersionManager
  • roles/serviceusage.serviceUsageAdmin
  • roles/storage.admin
  • roles/monitoring.admin
  • roles/redis.admin
  • roles/file.editor

A user with the roles/iam.securityAdmin role or equivalent permissions can grant the required roles to the mde-tfservice account with the following commands:

  export 
  
 PROJECT_ID 
 = 
 $( 
gcloud  
config  
get-value  
project ) 
 export 
  
 SA_TERRAFORM 
 = 
 "mde-tf" 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/bigquery.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/dataflow.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/bigtable.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/cloudsql.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/compute.instanceAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/compute.loadBalancerAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/compute.networkAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/compute.securityAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/container.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/container.developer' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/dns.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/iam.serviceAccountAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/iam.serviceAccountUser' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/pubsub.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/resourcemanager.projectIamAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/secretmanager.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/secretmanager.secretVersionManager' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/serviceusage.serviceUsageAdmin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/storage.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/monitoring.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/redis.admin' 
gcloud  
projects  
add-iam-policy-binding  
 ${ 
 PROJECT_ID 
 } 
  
 \ 
--member = 
 "serviceAccount: 
 ${ 
 SA_TERRAFORM 
 } 
 @ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/file.editor' 
 

Allow your user account to impersonate the mde-tfservice account if you have the roles/iam.serviceAccountTokenCreator role.

A user with the roles/iam.serviceAccountAdmin role or equivalent permissions can grant your user account the role on the mde-tfservice account using the following command:

  export 
  
 USER_EMAIL 
 = 
 $( 
gcloud  
auth  
list  
--filter = 
status:ACTIVE  
--format = 
 "value(account)" 
 ) 
 export 
  
 PROJECT_ID 
 = 
 $( 
gcloud  
config  
get-value  
project ) 
gcloud  
iam  
service-accounts  
add-iam-policy-binding  
 \ 
--role  
roles/iam.serviceAccountTokenCreator  
 \ 
--member  
 "user: 
 ${ 
 USER_EMAIL 
 } 
 " 
  
 \ 
 "mde-tf" 
@ " 
 ${ 
 PROJECT_ID 
 } 
 " 
.iam.gserviceaccount.com 

6. Enable the Google Cloud APIs

Make sure Google Cloud APIs are enabled.

The following Google Cloud APIs must be enabled in order to execute Terraform scripts:

  • compute.googleapis.com
  • iamcredentials.googleapis.com
  • cloudresourcemanager.googleapis.com

A user with the roles/servicemanagement.serviceConsumer role or equivalent permissions can enable the APIs using the following command:

 gcloud  
services  
 enable 
  
 \ 
compute.googleapis.com  
 \ 
iamcredentials.googleapis.com  
 \ 
cloudresourcemanager.googleapis.com 

7. Prepare a Cloud Storage Bucket

Prepare a Cloud Storage Bucket to store Terraform state:

Terraform requires a Cloud Storage bucket to save Terraform state ( PROJECT_ID -tf ), and the mde-tfservice account must have read and write permissions on this bucket.

A user with the roles/storage.admin role or equivalent permissions can create the bucket and grant the mde-tfthe requisite permissions with the following command:

  export 
  
 PROJECT_ID 
 = 
 $( 
gcloud  
config  
get-value  
project ) 
gcloud  
storage  
buckets  
create  
 "gs:// 
 ${ 
 PROJECT_ID 
 } 
 -tf" 
gcloud  
storage  
buckets  
add-iam-policy-binding  
gs:// " 
 ${ 
 PROJECT_ID 
 } 
 -tf" 
  
 \ 
--member = 
 "serviceAccount:mde-tf@ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/storage.objectViewer' 
gcloud  
storage  
buckets  
add-iam-policy-binding  
gs:// " 
 ${ 
 PROJECT_ID 
 } 
 -tf" 
  
 \ 
--member = 
 "serviceAccount:mde-tf@ 
 ${ 
 PROJECT_ID 
 } 
 .iam.gserviceaccount.com" 
  
 \ 
--role = 
 'roles/storage.objectCreator' 
 
Design a Mobile Site
View Site in Mobile | Classic
Share by: