diff --git a/.changelog/10312.txt b/.changelog/10312.txt
new file mode 100644
index 0000000000..0d3062de2e
--- /dev/null
+++ b/.changelog/10312.txt
@@ -0,0 +1,6 @@
+```release-note:enhancement
+storage: added `project_number` attribute to `google_storage_bucket` resource and data source
+```
+```release-note:enhancement
+storage: added ability to provide `project` argument to `google_storage_bucket` data source. This will not impact reading the resource's data, instead this helps users avoid calls to the Compute API within the data source.
+```
\ No newline at end of file
diff --git a/google-beta/services/storage/data_source_google_storage_bucket.go b/google-beta/services/storage/data_source_google_storage_bucket.go
index 99860f9872..9b119b1b18 100644
--- a/google-beta/services/storage/data_source_google_storage_bucket.go
+++ b/google-beta/services/storage/data_source_google_storage_bucket.go
@@ -14,6 +14,7 @@ func DataSourceGoogleStorageBucket() *schema.Resource {
 
 	dsSchema := tpgresource.DatasourceSchemaFromResourceSchema(ResourceStorageBucket().Schema)
 
+	tpgresource.AddOptionalFieldsToSchema(dsSchema, "project")
 	tpgresource.AddRequiredFieldsToSchema(dsSchema, "name")
 
 	return &schema.Resource{
diff --git a/google-beta/services/storage/data_source_google_storage_bucket_test.go b/google-beta/services/storage/data_source_google_storage_bucket_test.go
index 681c36cf29..712b1ed67e 100644
--- a/google-beta/services/storage/data_source_google_storage_bucket_test.go
+++ b/google-beta/services/storage/data_source_google_storage_bucket_test.go
@@ -3,17 +3,19 @@
 package storage_test
 
 import (
-	"fmt"
 	"testing"
 
 	"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
 	"github.com/hashicorp/terraform-provider-google-beta/google-beta/acctest"
+	"github.com/hashicorp/terraform-provider-google-beta/google-beta/envvar"
 )
 
 func TestAccDataSourceGoogleStorageBucket_basic(t *testing.T) {
 	t.Parallel()
 
-	bucket := "tf-bucket-" + acctest.RandString(t, 10)
+	context := map[string]interface{}{
+		"bucket_name": "tf-bucket-" + acctest.RandString(t, 10),
+	}
 
 	acctest.VcrTest(t, resource.TestCase{
 		PreCheck:                 func() { acctest.AccTestPreCheck(t) },
@@ -21,7 +23,7 @@ func TestAccDataSourceGoogleStorageBucket_basic(t *testing.T) {
 		CheckDestroy:             testAccStorageBucketDestroyProducer(t),
 		Steps: []resource.TestStep{
 			{
-				Config: testAccDataSourceGoogleStorageBucketConfig(bucket),
+				Config: testAccDataSourceGoogleStorageBucketConfig(context),
 				Check: resource.ComposeTestCheckFunc(
 					acctest.CheckDataSourceStateMatchesResourceStateWithIgnores("data.google_storage_bucket.bar", "google_storage_bucket.foo", map[string]struct{}{"force_destroy": {}}),
 				),
@@ -30,18 +32,80 @@ func TestAccDataSourceGoogleStorageBucket_basic(t *testing.T) {
 	})
 }
 
-func testAccDataSourceGoogleStorageBucketConfig(bucketName string) string {
-	return fmt.Sprintf(`
+// Test that the data source can take a project argument, which is used as a way to avoid using Compute API to
+// get project id for the project number returned from the Storage API.
+func TestAccDataSourceGoogleStorageBucket_avoidComputeAPI(t *testing.T) {
+	// Cannot use t.Parallel() if using t.Setenv
+
+	project := envvar.GetTestProjectFromEnv()
+
+	context := map[string]interface{}{
+		"bucket_name":          "tf-bucket-" + acctest.RandString(t, 10),
+		"real_project_id":      project,
+		"incorrect_project_id": "foobar",
+	}
+
+	// Unset ENV so no provider default is available to the data source
+	t.Setenv("GOOGLE_PROJECT", "")
+
+	acctest.VcrTest(t, resource.TestCase{
+		// Removed PreCheck because it wants to enforce GOOGLE_PROJECT being set
+		ProtoV5ProviderFactories: acctest.ProtoV5ProviderFactories(t),
+		CheckDestroy:             testAccStorageBucketDestroyProducer(t),
+		Steps: []resource.TestStep{
+			{
+				Config: testAccDataSourceGoogleStorageBucketConfig_setProjectInConfig(context),
+				Check: resource.ComposeTestCheckFunc(
+					// We ignore project to show that the project argument on the data source is retained and isn't impacted
+					acctest.CheckDataSourceStateMatchesResourceStateWithIgnores("data.google_storage_bucket.bar", "google_storage_bucket.foo", map[string]struct{}{"force_destroy": {}, "project": {}}),
+
+					resource.TestCheckResourceAttrSet(
+						"google_storage_bucket.foo", "project_number"),
+					resource.TestCheckResourceAttr(
+						"google_storage_bucket.foo", "project", context["real_project_id"].(string)),
+
+					resource.TestCheckResourceAttrSet(
+						"data.google_storage_bucket.bar", "project_number"),
+					resource.TestCheckResourceAttr(
+						"data.google_storage_bucket.bar", "project", context["incorrect_project_id"].(string)),
+				),
+			},
+		},
+	})
+}
+
+func testAccDataSourceGoogleStorageBucketConfig(context map[string]interface{}) string {
+	return acctest.Nprintf(`
+resource "google_storage_bucket" "foo" {
+  name     = "%{bucket_name}"
+  location = "US"
+}
+
+data "google_storage_bucket" "bar" {
+  name = google_storage_bucket.foo.name
+  depends_on = [
+    google_storage_bucket.foo,
+  ]
+}
+`, context)
+}
+
+func testAccDataSourceGoogleStorageBucketConfig_setProjectInConfig(context map[string]interface{}) string {
+	return acctest.Nprintf(`
 resource "google_storage_bucket" "foo" {
-  name     = "%s"
+  project = "%{real_project_id}"
+  name     = "%{bucket_name}"
   location = "US"
 }
 
+// The project argument here doesn't help the provider retrieve data about the bucket
+// It only serves to stop the data source using the compute API to convert the project number to an id
 data "google_storage_bucket" "bar" {
+  project = "%{incorrect_project_id}"
   name = google_storage_bucket.foo.name
   depends_on = [
     google_storage_bucket.foo,
   ]
 }
-`, bucketName)
+`, context)
 }
diff --git a/google-beta/services/storage/resource_storage_bucket.go b/google-beta/services/storage/resource_storage_bucket.go
index cddda72447..298db423f6 100644
--- a/google-beta/services/storage/resource_storage_bucket.go
+++ b/google-beta/services/storage/resource_storage_bucket.go
@@ -132,6 +132,12 @@ func ResourceStorageBucket() *schema.Resource {
 				Description: `The ID of the project in which the resource belongs. If it is not provided, the provider project is used.`,
 			},
 
+			"project_number": {
+				Type:        schema.TypeInt,
+				Computed:    true,
+				Description: `The project number of the project in which the resource belongs.`,
+			},
+
 			"self_link": {
 				Type:        schema.TypeString,
 				Computed:    true,
@@ -1719,6 +1725,9 @@ func setStorageBucket(d *schema.ResourceData, config *transport_tpg.Config, res
 	if err := d.Set("url", fmt.Sprintf("gs://%s", bucket)); err != nil {
 		return fmt.Errorf("Error setting url: %s", err)
 	}
+	if err := d.Set("project_number", res.ProjectNumber); err != nil {
+		return fmt.Errorf("Error setting project_number: %s", err)
+	}
 	if err := d.Set("storage_class", res.StorageClass); err != nil {
 		return fmt.Errorf("Error setting storage_class: %s", err)
 	}
diff --git a/google-beta/services/storage/resource_storage_bucket_test.go b/google-beta/services/storage/resource_storage_bucket_test.go
index 9676ef0691..271bcd05bd 100644
--- a/google-beta/services/storage/resource_storage_bucket_test.go
+++ b/google-beta/services/storage/resource_storage_bucket_test.go
@@ -35,6 +35,10 @@ func TestAccStorageBucket_basic(t *testing.T) {
 				Check: resource.ComposeTestCheckFunc(
 					resource.TestCheckResourceAttr(
 						"google_storage_bucket.bucket", "force_destroy", "false"),
+					resource.TestCheckResourceAttr(
+						"google_storage_bucket.bucket", "project", envvar.GetTestProjectFromEnv()),
+					resource.TestCheckResourceAttrSet(
+						"google_storage_bucket.bucket", "project_number"),
 				),
 			},
 			{
diff --git a/website/docs/d/storage_bucket.html.markdown b/website/docs/d/storage_bucket.html.markdown
index a6e88ab620..18fb11bde3 100644
--- a/website/docs/d/storage_bucket.html.markdown
+++ b/website/docs/d/storage_bucket.html.markdown
@@ -26,6 +26,8 @@ The following arguments are supported:
 
 * `name` - (Required) The name of the bucket.
 
+* `project` - (Optional) The ID of the project in which the resource belongs. If it is not provided, the provider project is used. If no value is supplied in the configuration or through provider defaults then the data source will use the Compute API to find the project id that corresponds to the project number returned from the Storage API. Supplying a value for `project` doesn't influence retrieving data about the bucket but it can be used to prevent use of the Compute API. If you do provide a `project` value ensure that it is the correct value for that bucket; the data source will not check that the project id and project number match.
+
 ## Attributes Reference
 
 See [google_storage_bucket](https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/storage_bucket#argument-reference) resource for details of the available attributes.