From 574ed2a97c8868626946eb930ce18118611793ee Mon Sep 17 00:00:00 2001 From: martygubar Date: Wed, 11 Dec 2024 18:56:51 -0500 Subject: [PATCH] many updates to support google cloud. --- multicloud/azure-cli/README.md | 6 +- multicloud/azure-cli/config | 33 +++++--- multicloud/azure-cli/config.default | 33 +++++--- .../azure-cli/create-data-lake-storage.sh | 6 +- .../azure-cli/show-data-lake-storage-info.sh | 5 +- multicloud/gcloud-cli/README.md | 77 ++++++++++-------- multicloud/gcloud-cli/config | 46 +++++++++++ multicloud/gcloud-cli/config.default | 46 +++++++++++ .../gcloud-cli/create-data-lake-storage.sh | 1 + multicloud/gcloud-cli/create-network.sh | 6 -- .../gcloud-cli/show-data-lake-storage-info.sh | 1 + multicloud/images/gcloud-deployment.png | Bin 0 -> 58303 bytes multicloud/oci-cli/README.md | 13 ++- multicloud/oci-cli/config | 19 ++++- multicloud/oci-cli/config.default | 17 +++- multicloud/oci-cli/create-compartment.sh | 9 +- sql/config.sql | 22 +++-- sql/credential-create.sql | 10 ++- sql/data-export-to-datalake.sql | 2 +- 19 files changed, 267 insertions(+), 85 deletions(-) create mode 100644 multicloud/gcloud-cli/config create mode 100644 multicloud/gcloud-cli/config.default create mode 100644 multicloud/images/gcloud-deployment.png diff --git a/multicloud/azure-cli/README.md b/multicloud/azure-cli/README.md index 37da994..4d867f1 100644 --- a/multicloud/azure-cli/README.md +++ b/multicloud/azure-cli/README.md @@ -1,7 +1,7 @@ # Oracle Database@Azure: Create an Autonomous Database There are different ways that you can deploy a new Oracle Autonomous Database: * [Using the Azure Portal](https://youtu.be/QOCvRr5CfeQ) -* [Using Terraform scripts](https://github.com/oci-landing-zones/terraform-oci-multicloud-azure/tree/main) +* [Using Terraform scripts](https://github.com/oci-landing-zones/terraform-oci-multicloud-azure) * Using the Azure CLI The steps below show how to create an Autonomous Database using the Azure CLI. @@ -29,6 +29,8 @@ You can run the scripts independently or run `create-all-resources.sh`. Simply u |[create-all-resources.sh](create-all-resources.sh)|Creates your resource group, network, ADB and VM| |[create-data-lake-storage.sh](create-data-lake-storage.sh)|Creates an Azure Data Lake Gen 2 storage account, a container and uploads sample data into that container| |[delete-all-resources.sh](delete-all-resources.sh)|Deletes your resource group, network, ADB and VM| +|[show-adb-info.sh](show-adb-info.sh)|Shows information about your ADB - including you JDBC connection details to the HIGH service| +|[show-data-lake-storage-info.sh](show-data-lake-storage-info.sh)|Shows information about your data lake storage - including the storage endpoint URL| ### Configuration file The Azure cli deployment scripts rely on settings found in the config file. These resources **will be created** by the scripts. Update the config file prior to running any of the scripts. @@ -80,6 +82,8 @@ Connect to your Autonomous Database! * Use these great VS Code extensions that help you develop and debug your database apps: * SQL Developer for VS Code ([Learn More](https://www.oracle.com/database/sqldeveloper/vscode/) | [Marketplace](https://marketplace.visualstudio.com/items?itemName=Oracle.sql-developer)) * Oracle Developer Tools for VS Code ([Learn More](https://docs.oracle.com/en/database/oracle/developer-tools-for-vscode/getting-started/gettingstarted.html) | [Marketplace](https://marketplace.visualstudio.com/items?itemName=Oracle.oracledevtools)) +* [Use the sample scripts](../../sql/README.md) to learn how to use different features - like Select AI, data lake integration, JSON, and more. + #### JDBC Example: JDBC is a common way to connect to Autonomous Database. For example, you can use the **Custom JDBC URL** in the VS Code SQL Developer Extension: diff --git a/multicloud/azure-cli/config b/multicloud/azure-cli/config index 1a8375e..9b51423 100644 --- a/multicloud/azure-cli/config +++ b/multicloud/azure-cli/config @@ -2,38 +2,49 @@ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ # update the values below to match your requirements -LOCATION="eastus" -RESOURCE_GROUP="development" +# Region and resource groupwhere resources are deployed +# example: eastus +LOCATION="" +RESOURCE_GROUP="" ADB_NAME="quickstart" ## NETWORKING # database -VNET_NAME="dev-vnet" -VNET_PREFIX="19x.xxx.0.0/16" +# example: dev-vnet +VNET_NAME="" +# example: 192.168.0.0/16 +VNET_PREFIX="" # subnet for the database -SUBNET_NAME="dev-sn-db" -SUBNET_PREFIX="19x.xxx.1.0/24" +# example: dev-sn-db +SUBNET_NAME="" +# example: 192.168.1.0/24 +SUBNET_PREFIX="" # client subnet -SUBNET2_NAME="dev-sn-client" -SUBNET2_PREFIX="19x.xxx.2.0/24" +# example: dev-sn-client +SUBNET2_NAME="" +# example: 192.168.2.0/24 +SUBNET2_PREFIX="" #network security group NSG_NAME=$SUBNET2_NAME-nsg ## COMPUTE VM -VM_NAME="adb-vm-client" +# example: adb-vm-client +VM_NAME="" VM_PREFERRED_SIZES=( "Standard_DS3_v2" "Standard_DC1s_v2" "Standard_DC2s_v2" "Standard_DC2ads_v5" "Standard_L4s" ) VM_IMAGE="MicrosoftWindowsDesktop:Windows-11:win11-22h2-pro:latest" ## CLOUD STORAGE # Storage accounts require a unique name across azure. Enter your unique name below. -STORAGE_ACCOUNT_NAME="your-storage-account" +# example: devadbstorageacct +STORAGE_ACCOUNT_NAME="" STORAGE_CONTAINER_NAME="adb-sample" ## IDENTITIES # This identity will be used for your VM. The password will also be used for the database ADMIN user USER_NAME="adb" ---The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# example: watchS0meMovies# USER_PASSWORD="" \ No newline at end of file diff --git a/multicloud/azure-cli/config.default b/multicloud/azure-cli/config.default index 1a8375e..9b51423 100644 --- a/multicloud/azure-cli/config.default +++ b/multicloud/azure-cli/config.default @@ -2,38 +2,49 @@ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ # update the values below to match your requirements -LOCATION="eastus" -RESOURCE_GROUP="development" +# Region and resource groupwhere resources are deployed +# example: eastus +LOCATION="" +RESOURCE_GROUP="" ADB_NAME="quickstart" ## NETWORKING # database -VNET_NAME="dev-vnet" -VNET_PREFIX="19x.xxx.0.0/16" +# example: dev-vnet +VNET_NAME="" +# example: 192.168.0.0/16 +VNET_PREFIX="" # subnet for the database -SUBNET_NAME="dev-sn-db" -SUBNET_PREFIX="19x.xxx.1.0/24" +# example: dev-sn-db +SUBNET_NAME="" +# example: 192.168.1.0/24 +SUBNET_PREFIX="" # client subnet -SUBNET2_NAME="dev-sn-client" -SUBNET2_PREFIX="19x.xxx.2.0/24" +# example: dev-sn-client +SUBNET2_NAME="" +# example: 192.168.2.0/24 +SUBNET2_PREFIX="" #network security group NSG_NAME=$SUBNET2_NAME-nsg ## COMPUTE VM -VM_NAME="adb-vm-client" +# example: adb-vm-client +VM_NAME="" VM_PREFERRED_SIZES=( "Standard_DS3_v2" "Standard_DC1s_v2" "Standard_DC2s_v2" "Standard_DC2ads_v5" "Standard_L4s" ) VM_IMAGE="MicrosoftWindowsDesktop:Windows-11:win11-22h2-pro:latest" ## CLOUD STORAGE # Storage accounts require a unique name across azure. Enter your unique name below. -STORAGE_ACCOUNT_NAME="your-storage-account" +# example: devadbstorageacct +STORAGE_ACCOUNT_NAME="" STORAGE_CONTAINER_NAME="adb-sample" ## IDENTITIES # This identity will be used for your VM. The password will also be used for the database ADMIN user USER_NAME="adb" ---The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# example: watchS0meMovies# USER_PASSWORD="" \ No newline at end of file diff --git a/multicloud/azure-cli/create-data-lake-storage.sh b/multicloud/azure-cli/create-data-lake-storage.sh index e52f214..e128417 100755 --- a/multicloud/azure-cli/create-data-lake-storage.sh +++ b/multicloud/azure-cli/create-data-lake-storage.sh @@ -99,8 +99,10 @@ az storage account keys list \ --resource-group $RESOURCE_GROUP --query "[0].value" -o tsv echo "Storage URL:" -az storage account show \ +STORAGE_URL=$(az storage account show \ --name $STORAGE_ACCOUNT_NAME \ --query primaryEndpoints.blob \ - --output tsv + --output tsv) +echo $STORAGE_URL$STORAGE_CONTAINER_NAME + echo "" diff --git a/multicloud/azure-cli/show-data-lake-storage-info.sh b/multicloud/azure-cli/show-data-lake-storage-info.sh index 7e53dfa..bef69fa 100755 --- a/multicloud/azure-cli/show-data-lake-storage-info.sh +++ b/multicloud/azure-cli/show-data-lake-storage-info.sh @@ -15,9 +15,10 @@ az storage account keys list \ --account-name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP --query "[0].value" -o tsv echo "Storage URL:" -az storage account show \ +STORAGE_URL=$(az storage account show \ --name $STORAGE_ACCOUNT_NAME \ --query primaryEndpoints.blob \ - --output tsv + --output tsv) +echo $STORAGE_URL$STORAGE_CONTAINER_NAME echo "" diff --git a/multicloud/gcloud-cli/README.md b/multicloud/gcloud-cli/README.md index 139cab8..bfe057e 100644 --- a/multicloud/gcloud-cli/README.md +++ b/multicloud/gcloud-cli/README.md @@ -1,37 +1,44 @@ # Oracle Database@Google Cloud: Create an Autonomous Database There are different ways that you can deploy a new Oracle Autonomous Database: -* [Using the Google Cloud Portal](https://youtu.be/QOCvRr5CfeQ) -* [Using Terraform scripts](https://github.com/oci-landing-zones/terraform-oci-multicloud-azure/tree/main) -* Using the Azure CLI +* [Using the Google Cloud Portal](https://docs.oracle.com/en-us/iaas/ogadb/ogadb-provisioning-autonomous-database.html) +* [Using Terraform scripts](https://github.com/oci-landing-zones/terraform-oci-multicloud-azure) +* Using the Google Command Line Interace (gcloud CLI) -The steps below show how to create an Autonomous Database using the Azure CLI. + +The steps below show how to create an Autonomous Database using the gcloud CLI. ## Prerequisites: -* [Install the Azure CLI](https://learn.microsoft.com/en-us/cli/azure/) -* [Subscribe to Oracle Database@Azure](https://www.youtube.com/watch?v=MEB8kB_TI2I) -* Ensure you have the appropriate user groups and privileges. See [details for onboarding Autonomous Database](https://learn.microsoft.com/en-us/azure/oracle/oracle-db/onboard-oracle-database) +* [Install the gcloud CLI](https://cloud.google.com/sdk/docs/install) +* [Onboard Oracle Database@Google Cloud](https://docs.oracle.com/en-us/iaas/Content/database-at-gcp/oagcp-onboard.htm#oagcp_onboard). Onboarding includes subscribing to the service using a Pay as You Go or private offer, setting up permissions, and more. ## Deploy your Autonomous Database and your infrastructure -Use the following scripts to deploy your infrastructure and Autonomous Database: +The gcloud CLI scripts will deploy the following infrastructure: +* A VPC Network with a client subnet +* An Oracle Autonomous Database. It is deployed to a private subnet on that VPC Network. That private subnet is managed by Oracle Database@Google Cloud. +* A Windows-based Virtual Machine is deployed to the client subnet. You can RDP to that VM to develop your apps and access Autonomous Database. +* A Cloud Storage bucket with sample data +* Sample code will use Google Gemini. Ensure the API is enabled. + + +![deployment](../images/gcloud-deployment.png) -![deployment](../images/azure-deployment.png) +**Note:** Gemini is used by the samples - but the scripts do not set up access to the resource. See the [Generative AI on Vertex Quickstart](https://cloud.google.com/vertex-ai/generative-ai/docs/start/quickstarts/quickstart-multimodal?authuser=1) -**Note:** Azure OpenAI is used by the samples - but the scripts do not deploy the resource. -f You can run the scripts independently or run `create-all-resources.sh`. Simply update the [`config`](#configuration-file) prior to running the scripts: |Script|Description| |----|---| -|[create-resource-group.sh](create-resource-group.sh)|Create a resource group| -|[create-network.sh](create-network.sh)|Create virtual cloud network.

ADB must be deployed to a delegated subnet. In addition, ADB access is thru a private endpoint. This means it must be accessed from either the same VCN or another privileged network.| +|[create-network.sh](create-network.sh)|Creates a VPC Network and subnet with required firewall rules. ADB is accessed thru a private endpoint on this network. The VM is deployed to this network and can be used to work with ADB.| |[create-adb.sh](create-adb.sh)|Create an Autonomous Database| -|[create-compute-vm.sh](create-compute-vm.sh)|Create a VM in that VCN| -|[create-all-resources.sh](create-all-resources.sh)|Creates your resource group, network, ADB and VM| -|[create-data-lake-storage.sh](create-data-lake-storage.sh)|Creates an Azure Data Lake Gen 2 storage account, a container and uploads sample data into that container| +|[create-compute-vm.sh](create-compute-vm.sh)|Create a VM in that VPC. By default, a Windows VM is created and can be accessed via RDP. After running this script, you can set up the password by running:
`source config`
`gcloud compute reset-windows-password $VM_NAME --zone=$REGION-a`| +|[create-all-resources.sh](create-all-resources.sh)|Creates your network, ADB, VM and Cloud Storage bucket.| +|[create-data-lake-storage.sh](create-data-lake-storage.sh)|Creates a bucket on Cloud Storage and uploads sample data into that bucket| |[delete-all-resources.sh](delete-all-resources.sh)|Deletes your resource group, network, ADB and VM| +|[show-adb-info.sh](show-adb-info.sh)|Shows information about your ADB - including you JDBC connection details to the HIGH service| +|[show-data-lake-storage-info.sh](show-data-lake-storage-info.sh)|Shows information about your data lake storage - including the storage endpoint URL| ### Configuration file -The Azure cli deployment scripts rely on settings found in the config file. These resources **will be created** by the scripts. Update the config file prior to running any of the scripts. +The gcloud CLI deployment scripts rely on settings found in the config file. These resources **will be created** by the scripts. Update the config file prior to running any of the scripts. >**IMPORTANT:** This file will contain a password that is used to connect to Autonomous Database and the virtual machine. Set the file's permissions so that only the file's owner can view its contents: ```bash @@ -40,30 +47,30 @@ chmod 600 config |Setting|Description|Example| |----|----|----| -|LOCATION|Region where resources will be deployed. [See documentation](https://docs.oracle.com/en-us/iaas/Content/database-at-azure/oaa_regions.htm) for regions where Oracle Database 23ai is available|"eastus"| -|RESOURCE_GROUP|Target resource group for new resources|"development"| +|REGION|Region where resources will be deployed. [See documentation](https://docs.oracle.com/en-us/iaas/Content/database-at-gcp/oagcp-regions.htm) for region availability|"us-east4"| +|PROJECT|Target Google Cloud project for new resources|"development"| +|USER_PASSWORD|The password for the Autonomous Database admin user|"watchS0meMovies#"| |ADB_NAME|Autonomous Database name. This name must be unique within a region location|"quickstart"| -|VNET_NAME|Virtual network|"dev-vnet"| +|SUBNET_DB_IP_RANGE|IP address range used for ADB. It can not overlap with the client subnet range. It can overlap with other ADB instances.|"192.168.11.0/24"| +|VPC_NETWORK_NAME|Name of the VPC Network|"dev-network"| |VNET_PREFIX|CIDR range for the virtual network|"192.168.0.0/16"| -|SUBNET_NAME|Delegated subnet where the database will be deployed|"dev-sn-db"| -|SUBNET_PREFIX|CIDR range for the delegated subnet|"192.168.1.0/24"| -|SUBNET2_NAME|Client subnet. The VM will be deployed to this subnet|"dev-sn-client"| -|SUBNET2_PREFIX|CIDR range for the client subnet|"192.168.2.0/24"| -|NSG_NAME|Name of the network security group used by the client subnet|$SUBNET2_NAME-nsg| -|VM_NAME|Name of the virtual machine|"adb-vm-client"| -|VM_PREFERRED_SIZES|A list of VM sizes. Change these values based on region availability. The script will attempt to create a VM based on the order listed|( "Standard_GS1" "Standard_DC1s_v2" "Standard_DC2s_v2" "Standard_DC2ads_v5" "Standard_L4s" )| -|VM_IMAGE|The image used by the VM|"MicrosoftWindowsDesktop:Windows-11:win11-22h2-pro:latest"| -|STORAGE_ACCOUNT_NAME|The name of an Azure Data Lake Storage Gen 2 account. This name must be unique across Azure. Sample data files will be uploaded into this storage account.|"mytenancysamplestorageaccount"| -|STORAGE_CONTAINER_NAME|The name of the container where files will be uploaded|"adb-sample"| -|USER_NAME|The name of the user for the virtual machine|"adb"| -|USER_PASSWORD|The password for both the VM and the Autonomous Database admin user|"Welcome1234#abcd"| +|SUBNET_CLIENT_NAME|Name of the client subnet where the VM is deployed|"dev-sn-client"| +|SUBNET_CLIENT_IP_RANGE|CIDR range for the client subnet|"192.168.10.0/24"| +|VM_NAME|Name of the virtual machine|"dev-vm-client"| +|VM_IMAGE_FAMILY|The image deployed to the VM |"windows-2022"| +|VM_MACHINE_TYPE|The type of VM deployed|"e2-standard-4"| +|BUCKET_NAME|The name of the cloud storage bucket where sample files will be uploaded.|"adb-sample-quickstart"| + ### Using the scripts -Log into azure: after updating the config file: +Make sure that you have enabled APIs for your project. [See the documentation](https://cloud.google.com/endpoints/docs/openapi/enable-api) for details. +Log into Google Cloud from the CLI: ```bash -az login +gcloud auth login ``` + +Update the config file Then, run your scripts. The following will deploy a complete environment, but you can also install independent components. Just make sure you install dependencies (e.g. a VCN prior to Autonomous Database): Creating all of the resources will take approximately 15-20 minutes. @@ -80,6 +87,8 @@ Connect to your Autonomous Database! * Use these great VS Code extensions that help you develop and debug your database apps: * SQL Developer for VS Code ([Learn More](https://www.oracle.com/database/sqldeveloper/vscode/) | [Marketplace](https://marketplace.visualstudio.com/items?itemName=Oracle.sql-developer)) * Oracle Developer Tools for VS Code ([Learn More](https://docs.oracle.com/en/database/oracle/developer-tools-for-vscode/getting-started/gettingstarted.html) | [Marketplace](https://marketplace.visualstudio.com/items?itemName=Oracle.oracledevtools)) +* [Use the sample scripts](../../sql/README.md) to learn how to use different features - like Select AI, data lake integration, JSON, and more. + #### JDBC Example: JDBC is a common way to connect to Autonomous Database. For example, you can use the **Custom JDBC URL** in the VS Code SQL Developer Extension: diff --git a/multicloud/gcloud-cli/config b/multicloud/gcloud-cli/config new file mode 100644 index 0000000..207f9bb --- /dev/null +++ b/multicloud/gcloud-cli/config @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +# update the values below to match your requirements +# example: us-east4 +REGION="" +PROJECT="" + +## IDENTITIES +# The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# example: watchS0meMovies# +USER_PASSWORD="" + +## ADB properties +# Database name. This will be used for the display name as well. +ADB_NAME="quickstart" + +# ADB IP range. It can not overlap with the client subnet range +# example: 192.168.11.0/24 +SUBNET_DB_IP_RANGE="" + +## NETWORKING +# public client network +# example: dev-network +VPC_NETWORK_NAME="" + +# names firewall rules +VPC_FIREWALL_INGRESS_NAME="allow-common-ingress-ports" +VPC_FIREWALL_EGRESS_NAME="allow-client-egress-ports" + +# client subnet +# example: dev-sn-client +SUBNET_CLIENT_NAME="" +# example: 192.168.10.0/24 +SUBNET_CLIENT_IP_RANGE="" + +## COMPUTE VM +# example: dev-vm-client +VM_NAME="" +VM_IMAGE_FAMILY="windows-2022" +VM_MACHINE_TYPE="e2-standard-4" + +## CLOUD STORAGE +# Storage bucket require a unique name across google. Enter your unique name below. +# example: adb-sample-quickstart +BUCKET_NAME="" \ No newline at end of file diff --git a/multicloud/gcloud-cli/config.default b/multicloud/gcloud-cli/config.default new file mode 100644 index 0000000..4de8d30 --- /dev/null +++ b/multicloud/gcloud-cli/config.default @@ -0,0 +1,46 @@ +# Copyright (c) 2024 Oracle and/or its affiliates. +# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ + +# update the values below to match your requirements +# example: us-east4 +REGION="" +PROJECT="" + +## IDENTITIES +# The password must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# example: watchS0meMovies# +USER_PASSWORD="" + +## ADB properties +# Database name. This will be used for the display name as well. +ADB_NAME="quickstart" + +# ADB IP range. It can not overlap with the client subnet range +# example: 192.168.11.0/24 +SUBNET_DB_IP_RANGE="" + +## NETWORKING +# public client network +# example: dev-network +VPC_NETWORK_NAME="" + +# names firewall rules +VPC_FIREWALL_INGRESS_NAME="allow-common-ingress-ports" +VPC_FIREWALL_EGRESS_NAME="allow-client-egress-ports" + +# client subnet +# example: dev-sn-client +SUBNET_CLIENT_NAME="" +# example: 192.168.10.0/24 +SUBNET_CLIENT_IP_RANGE="" + +## COMPUTE VM +# example: dev-vm-client +VM_NAME="" +VM_IMAGE_FAMILY="windows-2022" +VM_MACHINE_TYPE="e2-standard-4" + +## CLOUD STORAGE +# Storage accounts require a unique name across google. Enter your unique name below. +# example: adb-sample-quickstart +BUCKET_NAME="" \ No newline at end of file diff --git a/multicloud/gcloud-cli/create-data-lake-storage.sh b/multicloud/gcloud-cli/create-data-lake-storage.sh index cd33146..ed3f821 100755 --- a/multicloud/gcloud-cli/create-data-lake-storage.sh +++ b/multicloud/gcloud-cli/create-data-lake-storage.sh @@ -26,5 +26,6 @@ gcloud storage ls --long --recursive gs://$BUCKET_NAME echo "" echo "Bucket Name: $BUCKET_NAME" +gcloud storage hmac list echo "Storage URL:" echo "https://storage.googleapis.com/$BUCKET_NAME" diff --git a/multicloud/gcloud-cli/create-network.sh b/multicloud/gcloud-cli/create-network.sh index 0c11d8f..27798cb 100755 --- a/multicloud/gcloud-cli/create-network.sh +++ b/multicloud/gcloud-cli/create-network.sh @@ -13,12 +13,6 @@ source ./config # Create a VPC gcloud compute networks create $VPC_NETWORK_NAME --subnet-mode=custom -#gcloud compute networks subnets create private-subnet \ -# --network=$VPC_NETWORK_NAME \ -# --region=$REGION \ -# --range=192.168.5.0/24 \ -# --enable-private-ip-google-access - gcloud compute networks subnets create $SUBNET_CLIENT_NAME \ --network=$VPC_NETWORK_NAME \ --region=$REGION \ diff --git a/multicloud/gcloud-cli/show-data-lake-storage-info.sh b/multicloud/gcloud-cli/show-data-lake-storage-info.sh index b2ae7b1..6eff2be 100755 --- a/multicloud/gcloud-cli/show-data-lake-storage-info.sh +++ b/multicloud/gcloud-cli/show-data-lake-storage-info.sh @@ -12,6 +12,7 @@ gcloud storage ls --long --recursive gs://$BUCKET_NAME echo "" echo "Bucket Name: $BUCKET_NAME" +gcloud storage hmac list echo "Storage URL:" echo "https://storage.googleapis.com/$BUCKET_NAME" echo "" diff --git a/multicloud/images/gcloud-deployment.png b/multicloud/images/gcloud-deployment.png new file mode 100644 index 0000000000000000000000000000000000000000..35837b7175f29069376c3e722e7f48b928a53cbc GIT binary patch literal 58303 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 XvC(PCf!dqP8Gyjk)z4*}Q$iB}LoJI% literal 0 HcmV?d00001 diff --git a/multicloud/oci-cli/README.md b/multicloud/oci-cli/README.md index 86e06cc..57c84ea 100644 --- a/multicloud/oci-cli/README.md +++ b/multicloud/oci-cli/README.md @@ -15,11 +15,16 @@ The steps below show how to create an Autonomous Database using the OCI CLI. * [Use OCI Object Storage](https://docs.oracle.com/en-us/iaas/Content/Security/Reference/objectstorage_security.htm#iam-policies) ## Deploy your Autonomous Database -Use the following scripts to deploy your Autonomous Database and sample data on OCI. Because the sample script deploys ADB on a public endpoint, the architecture is very simple: +Autonomous Database will be deployed on a public endpoint - which will simplify the architecture. The OCI CLI will deploy: +* An Oracle Autonomous Database. It is deployed to a private subnet on that VPC Network. That private subnet is managed by Oracle Database@Google Cloud. +* An Object Storage bucket with sample data +* Sample code will use OCI GenAI (or other AI service). +* Use your computer as a client. + ![ADB on OCI](../images/oci-adb-github-samples.drawio.png) -You can run the scripts independently or run `create-all-resources.sh`. Simply update the [`config`](#configuration-file) prior to running the scripts: +You can run the OCI CLI scripts independently or run `create-all-resources.sh`. Simply update the [`config`](#configuration-file) prior to running the scripts: |Script|Description| |----|---| @@ -28,6 +33,8 @@ You can run the scripts independently or run `create-all-resources.sh`. Simply u |[create-all-resources.sh](create-all-resources.sh)|Creates your resource group, network, ADB and VM| |[create-data-lake-storage.sh](create-data-lake-storage.sh)|Creates an OCI Object Storage bucket and uploads sample data into that bucket| |[delete-all-resources.sh](delete-all-resources.sh)|Deletes your compartment, bucket and Autonomous Database| +|[show-adb-info.sh](show-adb-info.sh)|Shows information about your ADB - including you JDBC connection details to the HIGH service| +|[show-data-lake-storage-info.sh](show-data-lake-storage-info.sh)|Shows information about your data lake storage - including the storage endpoint URL| ### Configuration file The OCI cli deployment scripts rely on settings found in the config file. These resources **will be created** by the scripts. Update the config file prior to running any of the scripts. @@ -63,6 +70,8 @@ Connect to your Autonomous Database! * Use these great VS Code extensions that help you develop and debug your database apps: * SQL Developer for VS Code ([Learn More](https://www.oracle.com/database/sqldeveloper/vscode/) | [Marketplace](https://marketplace.visualstudio.com/items?itemName=Oracle.sql-developer)) * Oracle Developer Tools for VS Code ([Learn More](https://docs.oracle.com/en/database/oracle/developer-tools-for-vscode/getting-started/gettingstarted.html) | [Marketplace](https://marketplace.visualstudio.com/items?itemName=Oracle.oracledevtools)) +* [Use the sample scripts](../../sql/README.md) to learn how to use different features - like Select AI, data lake integration, JSON, and more. + #### JDBC Example: JDBC is a common way to connect to Autonomous Database. For example, you can use the **Custom JDBC URL** in the VS Code SQL Developer Extension: diff --git a/multicloud/oci-cli/config b/multicloud/oci-cli/config index ed1d017..2f11722 100644 --- a/multicloud/oci-cli/config +++ b/multicloud/oci-cli/config @@ -2,9 +2,19 @@ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ # update the values below to match your requirements. -TENANCY_OCID="ocid1.tenancy.oc1..aaaaaaaafcue47pqmrf4vigneebgbcmmoy5r7xvoypicjqqge32ewnrcyx2a" -REGION="us-ashburn-1" -COMPARTMENT_NAME="from-github" + +# your Tenancy unique identifier +# example: ocid1.tenancy.oc1..example.... +TENANCY_OCID="" +# Region where resources will be deployed +# example: us-ashburn-1 +REGION="" + +# Compartment name. Will be created if it does not exist +# example: mycompartment +COMPARTMENT_NAME="" + +# Autonomous Database name ADB_NAME="quickstart" ## CLOUD STORAGE @@ -13,4 +23,5 @@ BUCKET_NAME="adb-sample" ## IDENTITIES # The password is for the ADB ADMIN user. It must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character -USER_PASSWORD="bigdataPM2019#" \ No newline at end of file +# example: watchS0meMovies# +USER_PASSWORD="" \ No newline at end of file diff --git a/multicloud/oci-cli/config.default b/multicloud/oci-cli/config.default index 70f5351..2f11722 100644 --- a/multicloud/oci-cli/config.default +++ b/multicloud/oci-cli/config.default @@ -2,9 +2,19 @@ # Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ # update the values below to match your requirements. -TENANCY_OCID="your-tenancy-ocid" -REGION="us-ashburn-1" -COMPARTMENT_NAME="your-target-compartment" + +# your Tenancy unique identifier +# example: ocid1.tenancy.oc1..example.... +TENANCY_OCID="" +# Region where resources will be deployed +# example: us-ashburn-1 +REGION="" + +# Compartment name. Will be created if it does not exist +# example: mycompartment +COMPARTMENT_NAME="" + +# Autonomous Database name ADB_NAME="quickstart" ## CLOUD STORAGE @@ -13,4 +23,5 @@ BUCKET_NAME="adb-sample" ## IDENTITIES # The password is for the ADB ADMIN user. It must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +# example: watchS0meMovies# USER_PASSWORD="" \ No newline at end of file diff --git a/multicloud/oci-cli/create-compartment.sh b/multicloud/oci-cli/create-compartment.sh index 65c0851..f0a3409 100755 --- a/multicloud/oci-cli/create-compartment.sh +++ b/multicloud/oci-cli/create-compartment.sh @@ -9,4 +9,11 @@ echo "" # ensure you update the config file to match your deployment prior to running the deployment source ./config -oci iam compartment create --region $REGION --compartment-id $TENANCY_OCID --name "$COMPARTMENT_NAME" --description "Created by oracle-autonomous-database-samples" \ No newline at end of file +RESULT=$(oci iam compartment create --region $REGION --compartment-id $TENANCY_OCID --name "$COMPARTMENT_NAME" --description "Created by oracle-autonomous-database-samples" 2>&1) + +if echo "$RESULT" | grep -q "CompartmentAlreadyExists"; then + echo "Compartment '$COMPARTMENT_NAME' already exists. Continuing execution..." +else + echo "Error creating compartment. Exiting." + exit 1 +fi diff --git a/sql/config.sql b/sql/config.sql index 2a5ba78..eeec41b 100644 --- a/sql/config.sql +++ b/sql/config.sql @@ -10,6 +10,7 @@ define CONN='jdbc:oracle:thin:@(description=...)' -- user name and password used for the sample data define USER_NAME='moviestream' -- # The password is for the sample user. It must be between 12 and 30 characters long and must include at least one uppercase letter, one lowercase letter, and one numeric character +-- example: watchS0meMovies# define USER_PASSWORD='' -- @@ -21,9 +22,12 @@ define AI_PROVIDER='oci' -- The Select AI profile name that encapsulates the AI provider info + tables for NL2SQL define AI_PROFILE_NAME='genai' -- This is a database credential that captures the secret key or other connection info -define AI_CREDENTIAL_NAME='AI_cred' +define AI_CREDENTIAL_NAME='AI_CRED' --- The endpoint should be the servername only. For example, myopenai.openai.azure.com. This is not required for OCI GenAI. +-- The endpoint should be the servername only. This is not required for OCI GenAI. +-- Examples: +-- myopenai.openai.azure.com +-- us-east4-aiplatform.googleapis.com define AI_ENDPOINT='' -- API key for AI service. This is not required for OCI GenAI. define AI_KEY='' @@ -43,13 +47,21 @@ define AZURE_OPENAI_EMBEDDING_DEPLOYMENT_NAME='your-openai-emedding-deployment-n -- you can get the storage info by running /multicloud/{oci|azure|gcloud}-cli/show-data-lake-storage-info.sh define STORAGE_PROVIDER='oci' -- The url is a pointer to the bucket that will be used for import/export to object storage +-- Examples: +-- google: https://storage.googleapis.com/adb-sample +-- azure : https://devadbstorageacct.blob.core.windows.net/adb-sample +-- oci : https://adwc4pm.objectstorage.us-ashburn-1.oci.customer-oci.com/n/adwc4pm/b/adb-sample/o define STORAGE_URL='' + -- A database credential encapsulates the authentication details to the object store. Specify a name for the credential below define STORAGE_CREDENTIAL_NAME='storage_cred' --- below required for azure -define STORAGE_KEY='' -define STORAGE_ACCOUNT_NAME='' +--Azure storage properties +define AZURE_STORAGE_ACCOUNT_NAME='' +define AZURE_STORAGE_KEY='' +-- Google storage properties +define GOOGLE_STORAGE_ACCESS_KEY='' +define GOOGLE_STORAGE_SECRET='' -- -- OCI API credentials diff --git a/sql/credential-create.sql b/sql/credential-create.sql index a596acc..d4edc51 100644 --- a/sql/credential-create.sql +++ b/sql/credential-create.sql @@ -13,6 +13,8 @@ prompt "Creating credential: &user_param" DECLARE l_exists number := 0; l_type varchar2(20) := nvl(upper('&user_param'),'ALL'); + l_username varchar2(400); + l_password varchar2(400); BEGIN -- AI provider. Note, they will have different syntax based on the provider if l_type in ('AI','ALL') then @@ -73,10 +75,14 @@ BEGIN private_key => '&OCI_PRIVATE_KEY' ); ELSE + -- Google and Azure use different settings for username and password + l_username := CASE WHEN UPPER('&STORAGE_PROVIDER') = 'AZURE' THEN '&AZURE_STORAGE_ACCOUNT_NAME' ELSE '&GOOGLE_STORAGE_ACCESS_KEY' END; + l_password := CASE WHEN UPPER('&STORAGE_PROVIDER') = 'AZURE' THEN '&AZURE_STORAGE_KEY' ELSE '&GOOGLE_STORAGE_SECRET' END; + dbms_cloud.create_credential( credential_name => '&STORAGE_CREDENTIAL_NAME', - username => '&STORAGE_ACCOUNT_NAME', - password => '&STORAGE_KEY' + username => l_username, + password => l_password ); END IF; -- OCI vs other AI services END IF; -- Storage diff --git a/sql/data-export-to-datalake.sql b/sql/data-export-to-datalake.sql index 253ea72..6227b8f 100644 --- a/sql/data-export-to-datalake.sql +++ b/sql/data-export-to-datalake.sql @@ -1,7 +1,7 @@ -- Copyright (c) 2024 Oracle and/or its affiliates. -- Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/ -/** Export data to Azure Data Lake **/ +/** Export data to cloud storage **/ /* PREREQUISITES Install the sample schema using script