mmv1/products/compute/RegionNetworkEndpointGroup.yaml (313 lines of code) (raw):
# Copyright 2024 Google Inc.
# 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.
---
name: 'RegionNetworkEndpointGroup'
api_resource_type_kind: NetworkEndpointGroup
kind: 'compute#networkEndpointGroup'
description: |
A regional NEG that can support Serverless Products, proxying traffic to
external backends and providing traffic to the PSC port mapping endpoints.
When in use by a resource that can be updated, recreating a RegionNetworkEndpointGroup
will give a `resourceInUseByAnotherResource` error because Terraform will attempt to
delete the RegionNetworkEndpointGroup first, but an in-use RegionNetworkEndpointGroup
can't be deleted in the API. Use `lifecycle.create_before_destroy` to reorder the plan
and create the new resource first, allowing the deletion to go through successfully.
This is only recommended when strictly necessary, as the `create_before_destroy`
directive can be passed onto further dependencies, creating unexpected plans.
references:
guides:
'Serverless NEGs Official Documentation': 'https://cloud.google.com/load-balancing/docs/negs/serverless-neg-concepts'
'Internet NEGs Official Documentation': 'https://cloud.google.com/load-balancing/docs/negs/internet-neg-concepts'
api: 'https://cloud.google.com/compute/docs/reference/rest/beta/regionNetworkEndpointGroups'
docs:
base_url: 'projects/{{project}}/regions/{{region}}/networkEndpointGroups'
has_self_link: true
immutable: true
timeouts:
insert_minutes: 20
update_minutes: 20
delete_minutes: 20
async:
actions: ['create', 'delete', 'update']
type: 'OpAsync'
operation:
base_url: '{{op_id}}'
result:
resource_inside_response: false
collection_url_key: 'items'
custom_code:
sweeper:
url_substitutions:
- region: "us-central1"
- region: "europe-west4"
- region: "asia-northeast3"
examples:
- name: 'region_network_endpoint_group_functions'
primary_resource_id: 'function_neg'
vars:
neg_name: 'function-neg'
function_name: 'function-neg'
bucket_name: 'cloudfunctions-function-example-bucket'
zip_path: 'path/to/index.zip'
test_vars_overrides:
'zip_path': 'acctest.CreateZIPArchiveForCloudFunctionSource(t, "./test-fixtures/http_trigger.js")'
- name: 'region_network_endpoint_group_cloudrun'
primary_resource_id: 'cloudrun_neg'
vars:
neg_name: 'cloudrun-neg'
- name: 'region_network_endpoint_group_appengine'
primary_resource_id: 'appengine_neg'
vars:
neg_name: 'appengine-neg'
- name: 'region_network_endpoint_group_appengine_empty'
primary_resource_id: 'appengine_neg'
vars:
neg_name: 'appengine-neg'
- name: 'region_network_endpoint_group_psc'
primary_resource_id: 'psc_neg'
vars:
neg_name: 'psc-neg'
- name: 'region_network_endpoint_group_psc_service_attachment'
primary_resource_id: 'psc_neg_service_attachment'
vars:
neg_name: 'psc-neg'
network_name: 'psc-network'
subnetwork_name: 'psc-subnetwork'
psc_subnetwork_name: 'psc-subnetwork-nat'
backend_service_name: 'psc-backend'
forwarding_rule_name: 'psc-forwarding-rule'
service_attachment_name: 'psc-service-attachment'
health_check_name: 'psc-healthcheck'
- name: 'region_network_endpoint_group_internet_ip_port'
primary_resource_id: 'region_network_endpoint_group_internet_ip_port'
vars:
neg_name: 'ip-port-neg'
network_name: 'network'
- name: 'region_network_endpoint_group_internet_fqdn_port'
primary_resource_id: 'region_network_endpoint_group_internet_fqdn_port'
vars:
neg_name: 'ip-port-neg'
network_name: 'network'
- name: 'region_network_endpoint_group_portmap'
primary_resource_id: 'region_network_endpoint_group_portmap'
min_version: 'beta'
vars:
network_name: 'network'
subnetwork_name: 'subnetwork'
neg_name: 'portmap-neg'
parameters:
- name: 'region'
type: ResourceRef
description: |
A reference to the region where the regional NEGs reside.
required: true
custom_expand: 'templates/terraform/custom_expand/resourceref_with_validation.go.tmpl'
resource: 'Region'
imports: 'name'
properties:
- name: 'name'
type: String
description: |
Name of the resource; provided by the client when the resource is
created. The name must be 1-63 characters long, and comply with
RFC1035. Specifically, the name must be 1-63 characters long and match
the regular expression `[a-z]([-a-z0-9]*[a-z0-9])?` which means the
first character must be a lowercase letter, and all following
characters must be a dash, lowercase letter, or digit, except the last
character, which cannot be a dash.
required: true
validation:
function: 'verify.ValidateGCEName'
- name: 'description'
type: String
description: |
An optional description of this resource. Provide this property when
you create the resource.
- name: 'networkEndpointType'
type: Enum
description: |
Type of network endpoints in this network endpoint group. Defaults to SERVERLESS.
default_value: "SERVERLESS"
enum_values:
- 'SERVERLESS'
- 'PRIVATE_SERVICE_CONNECT'
- 'INTERNET_IP_PORT'
- 'INTERNET_FQDN_PORT'
- 'GCE_VM_IP_PORTMAP'
- name: 'pscTargetService'
type: String
description: |
This field is only used for PSC and INTERNET NEGs.
The target service url used to set up private service connection to
a Google API or a PSC Producer Service Attachment.
- name: 'network'
type: ResourceRef
description: |
This field is only used for PSC and INTERNET NEGs.
The URL of the network to which all network endpoints in the NEG belong. Uses
"default" project network if unspecified.
custom_expand: 'templates/terraform/custom_expand/resourceref_with_validation.go.tmpl'
resource: 'Network'
imports: 'selfLink'
- name: 'subnetwork'
type: ResourceRef
description: |
This field is only used for PSC NEGs.
Optional URL of the subnetwork to which all network endpoints in the NEG belong.
custom_expand: 'templates/terraform/custom_expand/resourceref_with_validation.go.tmpl'
resource: 'Subnetwork'
imports: 'selfLink'
- name: 'pscData'
type: NestedObject
description: |
This field is only used for PSC NEGs.
default_from_api: true
properties:
- name: 'producerPort'
type: String
ignore_read: true
description: |
The PSC producer port to use when consumer PSC NEG connects to a producer. If
this flag isn't specified for a PSC NEG with endpoint type
private-service-connect, then PSC NEG will be connected to a first port in the
available PSC producer port range.
- name: 'cloudRun'
type: NestedObject
description: |
This field is only used for SERVERLESS NEGs.
Only one of cloud_run, app_engine, cloud_function or serverless_deployment may be set.
conflicts:
- cloud_function
- app_engine
- serverless_deployment
properties:
- name: 'service'
type: String
description: |
Cloud Run service is the main resource of Cloud Run.
The service must be 1-63 characters long, and comply with RFC1035.
Example value: "run-service".
at_least_one_of:
- 'cloud_run.0.service'
- 'cloud_run.0.url_mask'
- name: 'tag'
type: String
description: |
Cloud Run tag represents the "named-revision" to provide
additional fine-grained traffic routing information.
The tag must be 1-63 characters long, and comply with RFC1035.
Example value: "revision-0010".
- name: 'urlMask'
type: String
description: |
A template to parse service and tag fields from a request URL.
URL mask allows for routing to multiple Run services without having
to create multiple network endpoint groups and backend services.
For example, request URLs "foo1.domain.com/bar1" and "foo1.domain.com/bar2"
an be backed by the same Serverless Network Endpoint Group (NEG) with
URL mask ".domain.com/". The URL mask will parse them to { service="bar1", tag="foo1" }
and { service="bar2", tag="foo2" } respectively.
at_least_one_of:
- 'cloud_run.0.service'
- 'cloud_run.0.url_mask'
- name: 'appEngine'
type: NestedObject
description: |
This field is only used for SERVERLESS NEGs.
Only one of cloud_run, app_engine, cloud_function or serverless_deployment may be set.
send_empty_value: true
allow_empty_object: true
conflicts:
- cloud_run
- cloud_function
- serverless_deployment
properties:
- name: 'service'
type: String
description: |
Optional serving service.
The service name must be 1-63 characters long, and comply with RFC1035.
Example value: "default", "my-service".
- name: 'version'
type: String
description: |
Optional serving version.
The version must be 1-63 characters long, and comply with RFC1035.
Example value: "v1", "v2".
- name: 'urlMask'
type: String
description: |
A template to parse service and version fields from a request URL.
URL mask allows for routing to multiple App Engine services without
having to create multiple Network Endpoint Groups and backend services.
For example, the request URLs "foo1-dot-appname.appspot.com/v1" and
"foo1-dot-appname.appspot.com/v2" can be backed by the same Serverless NEG with
URL mask "-dot-appname.appspot.com/". The URL mask will parse
them to { service = "foo1", version = "v1" } and { service = "foo1", version = "v2" } respectively.
- name: 'cloudFunction'
type: NestedObject
description: |
This field is only used for SERVERLESS NEGs.
Only one of cloud_run, app_engine, cloud_function or serverless_deployment may be set.
conflicts:
- cloud_run
- app_engine
- serverless_deployment
properties:
- name: 'function'
type: String
description: |
A user-defined name of the Cloud Function.
The function name is case-sensitive and must be 1-63 characters long.
Example value: "func1".
at_least_one_of:
- 'cloud_function.0.function'
- 'cloud_function.0.url_mask'
- name: 'urlMask'
type: String
description: |
A template to parse function field from a request URL. URL mask allows
for routing to multiple Cloud Functions without having to create
multiple Network Endpoint Groups and backend services.
For example, request URLs "mydomain.com/function1" and "mydomain.com/function2"
can be backed by the same Serverless NEG with URL mask "/". The URL mask
will parse them to { function = "function1" } and { function = "function2" } respectively.
at_least_one_of:
- 'cloud_function.0.function'
- 'cloud_function.0.url_mask'
- name: 'serverlessDeployment'
type: NestedObject
description: |
This field is only used for SERVERLESS NEGs.
Only one of cloudRun, appEngine, cloudFunction or serverlessDeployment may be set.
min_version: 'beta'
send_empty_value: true
allow_empty_object: true
conflicts:
- cloud_run
- cloud_function
- app_engine
properties:
- name: 'platform'
type: String
# Docs (https://cloud.google.com/compute/docs/reference/rest/beta/regionNetworkEndpointGroups) say support is offered for:
# API Gateway: apigateway.googleapis.com, App Engine: appengine.googleapis.com,
# Cloud Functions: cloudfunctions.googleapis.com, Cloud Run: run.googleapis.com
# However, only API Gateway is currently supported
description: |
The platform of the NEG backend target(s). Possible values:
API Gateway: apigateway.googleapis.com
required: true
- name: 'resource'
type: String
description: |
The user-defined name of the workload/instance. This value must be provided explicitly or in the urlMask.
The resource identified by this value is platform-specific and is as follows: API Gateway: The gateway ID, App Engine: The service name,
Cloud Functions: The function name, Cloud Run: The service name
- name: 'version'
type: String
description: |
The optional resource version. The version identified by this value is platform-specific and is follows:
API Gateway: Unused, App Engine: The service version, Cloud Functions: Unused, Cloud Run: The service tag
- name: 'urlMask'
type: String
description: |
A template to parse platform-specific fields from a request URL. URL mask allows for routing to multiple resources
on the same serverless platform without having to create multiple Network Endpoint Groups and backend resources.
The fields parsed by this template are platform-specific and are as follows: API Gateway: The gateway ID,
App Engine: The service and version, Cloud Functions: The function name, Cloud Run: The service and tag
required: false