Loading...
Loading...
Provisions, inspects, updates, and deletes Google Cloud Assured Workloads V1 compliant folders, CMEK settings, Sovereign Controls by Partners, and service usage restrictions. Use when creating, listing, describing, updating, or deleting an Assured Workloads workload for any compliance regime or data boundary (FedRAMP, DoD IL2/IL4/IL5, ITAR, CJIS, Healthcare, Sovereign Controls by Partners, or Regional Data Boundaries). Don't use for brownfield assessments or custom frameworks (use assuredworkloads-environment-assessor or assuredworkloads-frameworks-*), or non-compliant folders.
npx skill4agent add google/skills assured-workloads-basicsgcloudgoogle-cloud-assured-workloadsgoogle-api-python-clientgcloudscripts/validate_params.py--location=globalgcloud compliance-managerlistdescribescripts/manage_workload_updates.py --action=listcreaterestrict_allowed_resources.pyupdatemanage_workload_updates.py --action=applydeletefolders deleteprojects deletegcloudCLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:assured-workloads-basics)"ClientOptions(api_endpoint="{location}-assuredworkloads.googleapis.com")gcloudpip install "google-cloud-assured-workloads>=1.0,<2" "google-api-python-client>=2.0,<3" "google-auth>=2.0,<3"gcloudgcloud auth login && gcloud auth application-default logingcloud auth activate-service-account --key-file=/path/to/key.jsonexport GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"gcloud config set project {admin_project_id}gcloud auth application-default set-quota-project {admin_project_id}assuredworkloads.googleapis.comgcloud services enable assuredworkloads.googleapis.com --project={admin_project_id}organizations/{org_id}roles/assuredworkloads.adminroles/assuredworkloads.readerroles/assuredworkloads.editorlistdescriberoles/resourcemanager.organizationViewerroles/billing.user--billing-account=billingAccounts/{billing_id}billing.resourceAssociations.create--partner-services-billing-accountservice-{org_number}@gcp-sa-assuredworkloads.iam.gserviceaccount.comroles/assuredworkloads.serviceAgentgcloud assured workloads create--compliance-regime--locationREGIONAL_DATA_BOUNDARY--compliance-regime=REGIONAL_DATA_BOUNDARYREGIONAL_CONTROLS--location={location}JAPAN_DATA_BOUNDARY--compliance-regimeUS_REGIONS_AND_US_SUPPORTUS_DATA_BOUNDARY_AND_SUPPORTFEDRAMP_MODERATEUS_DATA_BOUNDARYgcloud billing accounts list --filter="open=true" --format="table(name,displayName)"billingAccounts/{billing_id}python3 scripts/validate_params.py --operation=create ...gcloud assured workloads creategcloud assured workloads create \
--organization={org_id} --location={location} \
--display-name="{display_name}" --compliance-regime={compliance_regime} \
--billing-account=billingAccounts/{billing_id} \
[--provisioned-resources-parent=folders/{parent_folder_id}] [--enable-sovereign-controls] \
[--next-rotation-time={next_rotation_time} --rotation-period={rotation_seconds}s] \
[--resource-settings=consumer-project-id={consumer_project_id},consumer-project-name={consumer_project_name},encryption-keys-project-id={kms_project_id},encryption-keys-project-name={kms_project_name},keyring-id={keyring_id}] \
[--partner={partner_enum}] [--partner-permissions=data-logs-viewer=true|false] \
[--partner-services-billing-account=billingAccounts/{partner_billing_id}] \
[--labels=key1=val1,key2=val2] [--external-identifier={external_id}] --format=json--next-rotation-time--rotation-period172800sencryption-keys-project-idencryption-keys-project-namekeyring-id--resource-settings--compliance-regime=ASSURED_WORKLOADS_FOR_PARTNERS--compliance-regime=ASSURED_WORKLOADS_FOR_PARTNERS--partner--partner--partner-permissions=data-logs-viewer=truedata-logs-viewer=falsegoogle-cloud-assured-workloadsFEDRAMP_MODERATEDATA_BOUNDARY_FOR_FEDRAMP_MODERATEFEDRAMP_HIGHconstraints/gcp.restrictServiceUsageconstraints/gcp.restrictServiceUsageAssuredWorkloadsServiceClient.restrict_allowed_resourcescompliantButDisallowedServicespython3 scripts/restrict_allowed_resources.py --organization={org_id} --location={location} --workload-id={workload_id} --restriction-type=ALLOW_COMPLIANT_RESOURCESgoogle-cloud-assured-workloadsfrom google.api_core.client_options import ClientOptions
from google.cloud import assuredworkloads_v1
client = assuredworkloads_v1.AssuredWorkloadsServiceClient(
client_options=ClientOptions(
api_endpoint=f"{location}-assuredworkloads.googleapis.com"
),
transport="rest",
)
request = assuredworkloads_v1.RestrictAllowedResourcesRequest(
name=f"organizations/{org_id}/locations/{location}/workloads/{workload_id}",
restriction_type=assuredworkloads_v1.RestrictAllowedResourcesRequest.RestrictionType.ALLOW_COMPLIANT_RESOURCES,
)
client.restrict_allowed_resources(request=request)RestrictionTypeALLOW_COMPLIANT_RESOURCESAPPEND_COMPLIANT_RESOURCESALLOW_ALL_GCP_RESOURCESgcloudlistdescribescripts/validate_params.pyListWorkloadsgcloud assured workloads list --organization={org_id} --location={location} \
[--filter="{filter_expression}"] [--limit={limit}] [--page-size={page_size}] --format=jsonGetWorkloadgcloud assured workloads describe {workload_id} --organization={org_id} --location={location} --format=jsonorganizations/{org_id}/locations/{location}/workloads/{workload_id}describenamedisplayNamecomplianceRegimepartnerresourcesCONSUMER_FOLDERCONSUMER_PROJECTENCRYPTION_KEYS_PROJECTKEYRINGetagupdatedeletecompliantButDisallowedServiceskajEnrollmentStatesaaEnrollmentResponseviolationNotificationsEnabledlabelsDeleteWorkloadfolders/{folder_id}FAILED_PRECONDITION: Workload is not emptyERROR_CODE_WORKLOAD_NOT_EMPTYgcloud assured workloads deletegcloud assured workloads describefolders/{folder_id}{project_id}python3 scripts/validate_params.py --operation=delete --workload-id={workload_id} --organization={org_id} --location={location}# Step 1: Delete child projects inside the workload folder first
gcloud projects delete {project_id} --quiet
# Step 2: Delete the provisioned Assured Workloads folder
gcloud resource-manager folders delete {folder_id}
# Step 3: Delete the Assured Workloads workload after folder deletion propagates
gcloud assured workloads delete {workload_id} --organization={org_id} --location={location} --quiet--etagDELETE_REQUESTEDERROR_CODE_WORKLOAD_NOT_EMPTYgcloud assured workloads delete--etagUpdateWorkloadgcloud assured workloads update--display-name="{new_display_name}"[a-zA-Z0-9 -]--labels=key1=val1,key2=val2--violation-notifications-enabled=true|false--etag={etag}describelistcomplianceRegimelocationbillingAccountpartnergcloud assured workloads updatecomplianceRegimelocationpython3 scripts/validate_params.py --operation=update ...gcloud assured workloads update {workload_id} --organization={org_id} --location={location} \
[--display-name="{new_display_name}"] [--labels=key1=val1,key2=val2] \
[--violation-notifications-enabled=true|false] [--etag={etag}] --format=jsonupdates.listupdates.applygcloud assured workloadsupdatesgcloud assured workloads updatescripts/manage_workload_updates.py--action=list--action=applygoogleapiclient.discovery.buildhttps://{location}-assuredworkloads.googleapis.comAVAILABLEWITHDRAWNAVAILABLEAVAILABLEdetails.orgPolicyUpdate.suggestedPolicy.constraintAVAILABLE--update-id=ALLAVAILABLEWITHDRAWNWITHDRAWNAVAILABLEWITHDRAWNupdates.listupdates.applyimport time
from google.api_core.client_options import ClientOptions
from googleapiclient import discovery
service = discovery.build(
"assuredworkloads",
"v1",
client_options=ClientOptions(
api_endpoint=f"https://{location}-assuredworkloads.googleapis.com"
),
)
parent = f"organizations/{org_id}/locations/{location}/workloads/{workload_id}"
# 1. List updates and filter for AVAILABLE state
resp = (
service.organizations()
.locations()
.workloads()
.updates()
.list(parent=parent)
.execute()
)
available = [u for u in resp.get("updates", []) if u.get("state") == "AVAILABLE"]
# 2. Apply each AVAILABLE update and poll the returned Long-Running Operation (LRO)
for update in available:
op = (
service.organizations()
.locations()
.workloads()
.updates()
.apply(name=update["name"], body={})
.execute()
)
while not op.get("done", False):
time.sleep(3)
op = (
service.organizations()
.locations()
.operations()
.get(name=op["name"])
.execute()
)scripts/diagnose_error.py400 INVALID_ARGUMENT403 PERMISSION_DENIED404 NOT_FOUNDFAILED_PRECONDITIONpython3 scripts/diagnose_error.py --error-message="{error_output_text}"ErrorInfo.reasonFolder creation was unsuccessful. Please try again.gcloud assured workloads createFolder creation was unsuccessful. Please try again.ErrorInfo.reasongcloud assured operations list --organization={org_id} --location={location} --format=json
gcloud assured operations describe {operation_id} --organization={org_id} --location={location} --format=jsonpython3 scripts/diagnose_error.py --fetch-latest-lro --organization={org_id} --location={location}ERROR_CODE_FOLDER_NAME_UNIQUENESS--display-nameorganizations/{org_id}folders/{parent_folder_id}--display-name--provisioned-resources-parentERROR_CODE_INVALID_PROVISIONED_RESOURCES_PARENT--provisioned-resources-parentERROR_CODE_FOLDER_CREATION_PRECONDITION_FAILEDDATA_BOUNDARY_FOR_*