cloud-foundation-fabric/fast/stages/1-resman
Ludovico Magnocavallo 7bd6e5d57b
Small fixes (#1425)
* fix serverless connector plugin outputs

* add internal and lb to allowed ingress org policy

* add validation condition on cloud run ingress settings

* tfdoc

* plugin tfdoc

* allow disabling googleapis routes with a single instruction in net-vpc

* fix variable def

* fix variable description

* fix cr variable validation

* fix usage of   create_googleapis_routes in examples and stages
2023-06-07 17:37:46 +00:00
..
data/org-policies Small fixes (#1425) 2023-06-07 17:37:46 +00:00
templates post PR message on init or validate failure (#1135) 2023-02-07 10:04:03 +01:00
IAM.md FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
README.md Add conditional org admin role to sandbox SA (#1385) 2023-05-21 10:48:41 +02:00
billing.tf Allow preventing creation of billing IAM roles in FAST, add instructions on delayed billing association (#1207) 2023-03-03 09:24:41 +01:00
branch-data-platform.tf Widen scope for prod project factory SA to dev (#1263) 2023-03-17 16:24:55 +00:00
branch-gke.tf Widen scope for prod project factory SA to dev (#1263) 2023-03-17 16:24:55 +00:00
branch-networking.tf Widen scope for prod project factory SA to dev (#1263) 2023-03-17 16:24:55 +00:00
branch-project-factory.tf Widen scope for prod project factory SA to dev (#1263) 2023-03-17 16:24:55 +00:00
branch-sandbox.tf fix(stages): only add sandbox SA when `sandbox` feature is enabled (#1391) 2023-05-24 05:17:35 +00:00
branch-security.tf fixed permissions for security stage SA (#1376) 2023-05-15 10:20:33 +00:00
branch-teams.tf Widen scope for prod project factory SA to dev (#1263) 2023-03-17 16:24:55 +00:00
cicd-data-platform.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
cicd-gke.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
cicd-networking.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
cicd-project-factory.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
cicd-security.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
diagram.png FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
diagram.svg FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
main.tf Allows groups from other orgs/domains (#1383) 2023-05-17 11:07:47 +02:00
organization.tf Allow preventing creation of billing IAM roles in FAST, add instructions on delayed billing association (#1207) 2023-03-03 09:24:41 +01:00
outputs-files.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
outputs-gcs.tf FAST multitenant bootstrap and resource management, rename org-level FAST stages (#1052) 2023-02-04 15:00:45 +01:00
outputs.tf fix stage links, fix stage 1 output file names (#1134) 2023-02-06 20:51:26 +01:00
services.yaml allow setting identities in egress policies (#1394) 2023-05-24 12:05:16 +02:00
variables.tf Allows groups from other orgs/domains (#1383) 2023-05-17 11:07:47 +02:00

README.md

Resource hierarchy

This stage performs two important tasks:

  • create the top-level hierarchy of folders, and the associated resources used later on to automate each part of the hierarchy (eg. Networking)
  • set organization policies on the organization, and any exception required on specific folders

The code is intentionally simple, as it's intended to provide a generic initial setup (Networking, Security, etc.), and then allow easy customizations to complete the implementation of the intended hierarchy design.

The following diagram is a high level reference of the resources created and managed here:

Resource-management diagram

Table of contents

Design overview and choices

Despite its simplicity, this stage implements the basics of a design that we've seen working well for a variety of customers, where the hierarchy is laid out following two conceptually different approaches:

  • core or shared resources are grouped in hierarchy branches that map to their type or purpose (e.g. Networking)
  • team or application resources are grouped in lower level hierarchy branches that map to management or operational considerations (e.g. which team manages a set of applications, or owns a subset of company data, etc.)

This split approach usually represents well functional and operational patterns, where core resources are centrally managed by individual teams (e.g. networking, security, fleets of similar VMS, etc.), while teams need more granularity to access managed services used by the applications they maintain.

The approach also adapts to different high level requirements:

  • it can be used either for single organizations containing multiple environments, or with multiple organizations dedicated to specific environments (e.g. prod/nonprod), as the environment split is implemented at the project or lower folder level
  • it adapts to complex scenarios, with different countries or corporate entities using the same GCP organization, as core services are typically shared, and/or an extra layer on top can be used as a drop-in to implement the country/entity separation

Additionally, a few critical benefits are directly provided by this design:

  • core services are clearly separated, with very few touchpoints where IAM and security policies need to be applied (typically their top-level folder)
  • adding a new set of core services (e.g. shared GKE clusters) is a trivial operation that does not break the existing design
  • grouping application resources and services using teams or business logic is a flexible approach, which maps well to typical operational or budget requirements
  • automation stages (e.g. Networking) can be segregated in a simple and effective way, by creating the required service accounts and buckets for each stage here, and applying a handful of IAM roles to the relevant folder

For a discussion on naming, please refer to the Bootstrap stage documentation, as the same approach is shared by all stages.

Multitenancy

Fully multitenant hierarchies inside the same organization are implemented via separate additional stages that need to be run once for each tenant, and require this stage as a prerequisite.

Workload Identity Federation and CI/CD

This stage also implements optional support for CI/CD, much in the same way as the bootstrap stage. The only difference is on Workload Identity Federation, which is only configured in bootstrap and made available here via stage interface variables (the automatically generated .tfvars files).

For details on how to configure CI/CD please refer to the relevant section in the bootstrap stage documentation.

How to run this stage

This stage is meant to be executed after the bootstrap stage has run, as it leverages the automation service account and bucket created there. The relevant user groups must also exist, but that's one of the requirements for the previous stage too, so if you ran that successfully, you're good to go.

It's of course possible to run this stage in isolation, but that's outside the scope of this document, and you would need to refer to the code for the bootstrap stage for the actual roles needed.

Before running this stage, you need to make sure you have the correct credentials and permissions, and localize variables by assigning values that match your configuration.

Provider and Terraform variables

As all other FAST stages, the mechanism used to pass variable values and pre-built provider files from one stage to the next is also leveraged here.

The commands to link or copy the provider and terraform variable files can be easily derived from the stage-links.sh script in the FAST root folder, passing it a single argument with the local output files folder (if configured) or the GCS output bucket in the automation project (derived from stage 0 outputs). The following examples demonstrate both cases, and the resulting commands that then need to be copy/pasted and run.

../../stage-links.sh ~/fast-config

# copy and paste the following commands for '1-resman'

ln -s ~/fast-config/providers/1-resman-providers.tf ./
ln -s ~/fast-config/tfvars/globals.auto.tfvars.json ./
ln -s ~/fast-config/tfvars/0-bootstrap.auto.tfvars.json ./
../../stage-links.sh gs://xxx-prod-iac-core-outputs-0

# copy and paste the following commands for '1-resman'

gcloud alpha storage cp gs://xxx-prod-iac-core-outputs-0/providers/1-resman-providers.tf ./
gcloud alpha storage cp gs://xxx-prod-iac-core-outputs-0/tfvars/globals.auto.tfvars.json ./
gcloud alpha storage cp gs://xxx-prod-iac-core-outputs-0/tfvars/0-bootstrap.auto.tfvars.json ./

Impersonating the automation service account

The preconfigured provider file uses impersonation to run with this stage's automation service account's credentials. The gcp-devops and organization-admins groups have the necessary IAM bindings in place to do that, so make sure the current user is a member of one of those groups.

Variable configuration

Variables in this stage -- like most other FAST stages -- are broadly divided into three separate sets:

  • variables which refer to global values for the whole organization (org id, billing account id, prefix, etc.), which are pre-populated via the globals.auto.tfvars.json file linked or copied above
  • variables which refer to resources managed by previous stage, which are prepopulated here via the 0-bootstrap.auto.tfvars.json file linked or copied above
  • and finally variables that optionally control this stage's behaviour and customizations, and can to be set in a custom terraform.tfvars file

The latter set is explained in the Customization sections below, and the full list can be found in the Variables table at the bottom of this document.

Note that the outputs_location variable is disabled by default, you need to explicitly set it in your terraform.tfvars file if you want output files to be generated by this stage. This is a sample terraform.tfvars that configures it, refer to the bootstrap stage documentation for more details:

outputs_location = "~/fast-config"

Running the stage

Once provider and variable values are in place and the correct user is configured, the stage can be run:

terraform init
terraform apply

Customizations

Team folders

This stage provides a single built-in customization that offers a minimal (but usable) implementation of the "application" or "business" grouping for resources discussed above. The team_folders variable allows you to specify a map of team name and groups, that will result in folders, automation service accounts, and IAM policies applied.

Consider the following example in a tfvars file:

team_folders = {
  team-a = {
    descriptive_name = "Team A"
    group_iam = {
      "team-a@gcp-pso-italy.net" = [
        "roles/viewer"
      ]
    }
    impersonation_groups = ["team-a-admins@gcp-pso-italy.net"]
  }
}

This will result in

  • a "Team A" folder under the "Teams" folder
  • one GCS bucket in the automation project
  • one service account in the automation project with the correct IAM policies on the folder and bucket
  • a IAM policy on the folder that assigns roles/viewer to the team-a group
  • a IAM policy on the service account that allows team-a to impersonate it

This allows to centralize the minimum set of resources to delegate control of each team's folder to a pipeline, and/or to the team group. This can be used as a starting point for scenarios that implement more complex requirements (e.g. environment folders per team, etc.).

Organization policies

Organization policies leverage -- with one exception -- the built-in factory implemented in the organization module, and configured via the yaml files in the data folder. To edit organization policies, check and edit the files there.

The one exception is Domain Restricted Sharing, which is made dynamic and implemented in code so as to auto-add the current organization's customer id. The organization_policy_configs variable allow to easily add ids from third party organizations if needed.

IAM

IAM roles can be easily edited in the relevant branch-xxx.tf file, following the best practice outlined in the bootstrap stage documentation of separating user-level and service-account level IAM policies in modules' iam_groups, iam, and iam_additive variables.

A full reference of IAM roles managed by this stage is available here.

Additional folders

Due to its simplicity, this stage lends itself easily to customizations: adding a new top-level branch (e.g. for shared GKE clusters) is as easy as cloning one of the branch-xxx.tf files, and changing names.

Files

name description modules resources
billing.tf Billing resources for external billing use cases. google_billing_account_iam_member
branch-data-platform.tf Data Platform stages resources. folder · gcs · iam-service-account google_organization_iam_member
branch-gke.tf GKE multitenant stage resources. folder · gcs · iam-service-account
branch-networking.tf Networking stage resources. folder · gcs · iam-service-account
branch-project-factory.tf Project factory stage resources. gcs · iam-service-account google_organization_iam_member
branch-sandbox.tf Sandbox stage resources. folder · gcs · iam-service-account google_organization_iam_member
branch-security.tf Security stage resources. folder · gcs · iam-service-account
branch-teams.tf Team stage resources. folder · gcs · iam-service-account
cicd-data-platform.tf CI/CD resources for the data platform branch. iam-service-account · source-repository
cicd-gke.tf CI/CD resources for the data platform branch. iam-service-account · source-repository
cicd-networking.tf CI/CD resources for the networking branch. iam-service-account · source-repository
cicd-project-factory.tf CI/CD resources for the teams branch. iam-service-account · source-repository
cicd-security.tf CI/CD resources for the security branch. iam-service-account · source-repository
main.tf Module-level locals and resources.
organization.tf Organization policies. organization
outputs-files.tf Output files persistence to local filesystem. local_file
outputs-gcs.tf Output files persistence to automation GCS bucket. google_storage_bucket_object
outputs.tf Module outputs.
variables.tf Module variables.

Variables

name description type required default producer
automation Automation resources created by the bootstrap stage. object({…}) 0-bootstrap
billing_account Billing account id. If billing account is not part of the same org set is_org_level to false. To disable handling of billing IAM roles set no_iam to true. object({…}) 0-bootstrap
organization Organization details. object({…}) 0-bootstrap
prefix Prefix used for resources that need unique names. Use 9 characters or less. string 0-bootstrap
cicd_repositories CI/CD repository configuration. Identity providers reference keys in the automation.federated_identity_providers variable. Set to null to disable, or set individual repositories to null if not needed. object({…}) null
custom_roles Custom roles defined at the org level, in key => id format. object({…}) null 0-bootstrap
data_dir Relative path for the folder storing configuration data. string "data"
fast_features Selective control for top-level FAST features. object({…}) {} 0-0-bootstrap
groups Group names or emails to grant organization-level permissions. If just the name is provided, the default organization domain is assumed. object({…}) {} 0-bootstrap
locations Optional locations for GCS, BigQuery, and logging buckets created here. object({…}) {…} 0-bootstrap
organization_policy_configs Organization policies customization. object({…}) null
outputs_location Enable writing provider, tfvars and CI/CD workflow files to local filesystem. Leave null to disable. string null
tag_names Customized names for resource management tags. object({…}) {…}
team_folders Team folders to be created. Format is described in a code comment. map(object({…})) null

Outputs

name description sensitive consumers
cicd_repositories WIF configuration for CI/CD repositories.
dataplatform Data for the Data Platform stage.
gke_multitenant Data for the GKE multitenant stage. 03-gke-multitenant
networking Data for the networking stage.
project_factories Data for the project factories stage.
providers Terraform provider files for this stage and dependent stages. 02-networking · 02-security · 03-dataplatform · xx-sandbox · xx-teams
sandbox Data for the sandbox stage. xx-sandbox
security Data for the networking stage. 02-security
teams Data for the teams stage.
tfvars Terraform variable files for the following stages.