使用 Terraform 创建存储桶并上传对象

在本快速入门指南中,您将创建一个 Terraform 配置文件,以预配一个存储桶并将 sample_file.txt 对象上传到该存储桶。为完成本快速入门,您将使用 Cloud Shell Editor、Cloud Shell 终端,以及 Cloud Shell 中预安装的 Terraform CLI。

准备工作

如需为本快速入门设置项目,请完成以下步骤:

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 启用 Cloud Storage API。

    启用 API

  5. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  6. 确保您的 Google Cloud 项目已启用结算功能

  7. 启用 Cloud Storage API。

    启用 API

创建文件夹结构和 Terraform 配置文件

如需创建 Terraform 配置文件以及要以对象形式上传到 Cloud Storage 的文件,请完成以下步骤:

  1. 在 Google Cloud 控制台中,激活 Cloud Shell。

    激活 Cloud Shell

    Cloud Shell 会话随即会在 Google Cloud 控制台的底部启动,并显示命令行提示符。Cloud Shell 是一个已安装 Google Cloud CLI 且已为当前项目设置值的 Shell 环境。该会话可能需要几秒钟时间来完成初始化。

  1. 设置要在其中应用 Terraform 配置的默认 Google Cloud 项目:
    export GOOGLE_CLOUD_PROJECT=PROJECT_ID
  2. 在 Cloud Shell 终端中,将主目录设置为活跃目录:
    cd
  3. 创建名为 terraform 的新文件夹:
    mkdir terraform
  4. 通过点击 Cloud Shell 窗口工具栏上的打开编辑器,启动 Cloud Shell Editor。
  5. 浏览器窗格中,右键点击 terraform 文件夹,然后点击新建文件
  6. 输入 main.tf 作为文件名,然后点击确定
  7. 浏览器窗格中,右键点击 terraform 文件夹,然后点击新建文件
  8. 输入 sample_file.txt 作为文件名,然后点击确定

在 Terraform 配置文件中定义基础架构

如需在 Terraform 配置文件定义您要预配的基础架构,请完成以下步骤:

  1. 在 Cloud Shell Editor 中,打开 main.tf 文件。

  2. 将以下示例复制到 main.tf 文件中。

    # Create new storage bucket in the US
    # location with Standard Storage
    
    resource "google_storage_bucket" "static" {
     name          = "BUCKET_NAME"
     location      = "US"
     storage_class = "STANDARD"
    
     uniform_bucket_level_access = true
    }
    
    # Upload a text file as an object
    # to the storage bucket
    
    resource "google_storage_bucket_object" "default" {
     name         = "OBJECT_NAME"
     source       = "OBJECT_PATH"
     content_type = "text/plain"
     bucket       = google_storage_bucket.static.id
    }

    您需要将其中的:

    • BUCKET_NAME 替换为您要创建的存储桶的名称。例如 my-bucket

    • OBJECT_NAME 替换为您要上传的对象的名称。对于本快速入门,请输入名称 sample_file.txt

    • OBJECT_PATH 替换为您要上传的对象的路径。对于本快速入门,请输入路径 ~/terraform/sample_file.txt

  3. 保存 main.tf 文件。

初始化包含 Terraform 配置文件的工作目录

如需初始化 Terraform 和包含 Terraform 配置文件的目录,请完成以下步骤:

  1. 如需打开 Cloud Shell 终端,请点击 Cloud Shell Editor 工具栏中的打开终端

  2. 在 Cloud Shell 终端中,将 terraform 文件夹设置为当前工作目录:

    cd ~/terraform
    
  3. 初始化 Terraform:

    terraform init
    
  4. 如果系统提示您授权 Cloud Shell,请点击授权

    Terraform 会初始化工作目录。如果它成功初始化工作目录,则 Terraform 将返回类似于以下内容的输出:

    Terraform has been successfully initialized!
    
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    

预览执行计划

Terraform 执行计划基于 Terraform 配置,包含 Terraform 计划要对 Cloud Storage 基础架构和服务进行的更改。

查看 Terraform 执行计划:

terraform plan

输出示例:

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # google_storage_bucket.static will be created
  + resource "google_storage_bucket" "static" {
      + force_destroy               = false
      + id                          = (known after apply)
      + location                    = "US"
      + name                        = "my-bucket"
      + project                     = "my-project"
      + public_access_prevention    = (known after apply)
      + self_link                   = (known after apply)
      + storage_class               = "STANDARD"
      + uniform_bucket_level_access = true
      + url                         = (known after apply)

      + versioning {
          + enabled = (known after apply)
        }

      + website {
          + main_page_suffix = (known after apply)
          + not_found_page   = (known after apply)
        }
    }

  # google_storage_bucket_object.default will be created
  + resource "google_storage_bucket_object" "default" {
      + bucket         = (known after apply)
      + content_type   = "text/plain"
      + crc32c         = (known after apply)
      + detect_md5hash = "different hash"
      + id             = (known after apply)
      + kms_key_name   = (known after apply)
      + md5hash        = (known after apply)
      + media_link     = (known after apply)
      + name           = "sample_file.txt"
      + output_name    = (known after apply)
      + self_link      = (known after apply)
      + source         = "sample_file.txt"
      + storage_class  = (known after apply)
    }

Plan: 2 to add, 0 to change, 0 to destroy.

应用执行计划中建议的更改

如需在 Terraform 配置文件中应用更改,请完成以下步骤:

  1. 使用以下命令将执行计划中的更改应用于 Cloud Storage 基础架构。应用更改后,Terraform 会创建一个存储桶,并将 sample_file.txt 上传到该存储桶。

    terraform apply
    

    输出示例:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      + create
    
    Terraform will perform the following actions:
    
      # google_storage_bucket.static will be created
      + resource "google_storage_bucket" "static" {
          + force_destroy               = false
          + id                          = (known after apply)
          + location                    = "US"
          + name                        = "my-bucket"
          + project                     = "my-project"
          + public_access_prevention    = (known after apply)
          + self_link                   = (known after apply)
          + storage_class               = "STANDARD"
          + uniform_bucket_level_access = true
          + url                         = (known after apply)
    
          + versioning {
              + enabled = (known after apply)
            }
    
          + website {
              + main_page_suffix = (known after apply)
              + not_found_page   = (known after apply)
            }
        }
    
      # google_storage_bucket_object.default will be created
      + resource "google_storage_bucket_object" "default" {
          + bucket         = (known after apply)
          + content_type   = "text/plain"
          + crc32c         = (known after apply)
          + detect_md5hash = "different hash"
          + id             = (known after apply)
          + kms_key_name   = (known after apply)
          + md5hash        = (known after apply)
          + media_link     = (known after apply)
          + name           = "sample_file.txt"
          + output_name    = (known after apply)
          + self_link      = (known after apply)
          + source         = "sample_file.txt"
          + storage_class  = (known after apply)
        }
    
    Plan: 2 to add, 0 to change, 0 to destroy.
    
    Do you want to perform these actions?
      Terraform will perform the actions described above.
      Only 'yes' will be accepted to approve.
    
      Enter a value:
    
  2. 输入 yes 并按 Enter 键。

    如果成功,Terraform 将返回类似于以下内容的输出:

    Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
    

查看存储桶和上传的对象

在 Google Cloud 控制台中,进入 Cloud Storage 存储桶页面。

进入“存储桶”

系统随即会显示包含 sample_file.txt 对象的新存储桶。请注意,运行 terraform apply 后,资源可能需要几分钟时间才能完成预配。

清理您的项目

为避免您在本快速入门中创建的 Google Cloud 资源产生意外费用,请完成以下步骤来清理资源:

  1. 在 Cloud Shell 终端中,将 terraform 文件夹设置为当前工作目录:

    cd ~/terraform
    
  2. 删除您基于 Terraform 配置文件创建的 Cloud Storage 资源:

    terraform destroy
    
  3. 如果成功,Terraform 将返回类似于以下内容的输出:

    Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
      - destroy
    
    Terraform will perform the following actions:
    
      # google_storage_bucket.static will be destroyed
      - resource "google_storage_bucket" "static" {
          - default_event_based_hold    = false -> null
          - force_destroy               = false -> null
          - id                          = "my-bucket" -> null
          - labels                      = {} -> null
          - location                    = "US" -> null
          - name                        = "" -> null
          - project                     = "example-project" -> null
          - public_access_prevention    = "inherited" -> null
          - requester_pays              = false -> null
          - self_link                   = "https://www.googleapis.com/storage/v1/b/cbonnie-bucket-9" -> null
          - storage_class               = "STANDARD" -> null
          - uniform_bucket_level_access = true -> null
          - url                         = "gs://BUCKET_NAME" -> null
        }
    
      # google_storage_bucket_object.default will be destroyed
      - resource "google_storage_bucket_object" "default" {
          - bucket           = "my-bucket" -> null
          - content_type     = "text/plain" -> null
          - crc32c           = "yZRlqg==" -> null
          - detect_md5hash   = "XrY7u+Ae7tCTyyK7j1rNww==" -> null
          - event_based_hold = false -> null
          - id               = "my-bucket-sample_file.txt" -> null
          - md5hash          = "XrY7u+Ae7tCTyyK7j1rNww==" -> null
          - media_link       = "https://storage.googleapis.com/download/storage/v1/b/BUCKET_NAME/o/sample_file.txt?generation=1675800386233102&alt=media" -> null
          - metadata         = {} -> null
          - name             = "sample_file.txt" -> null
          - output_name      = "sample_file.txt" -> null
          - self_link        = "https://www.googleapis.com/storage/v1/b/BUCKET_NAME/o/sample_file.txt" -> null
          - source           = "sample_file.txt" -> null
          - storage_class    = "STANDARD" -> null
          - temporary_hold   = false -> null
        }
    
    Plan: 0 to add, 0 to change, 2 to destroy.
    
    Do you really want to destroy all resources?
      Terraform will destroy all your managed infrastructure, as shown above.
      There is no undo. Only 'yes' will be accepted to confirm.
    
      Enter a value:
    
  4. 输入 yes 并按 Enter 键。如果成功,Terraform 将返回类似于以下内容的输出:

    Destroy complete! Resources: 2 destroyed.
    
  5. 在 Cloud Shell Editor 中,右键点击浏览器窗格中的 terraform 文件夹,然后点击删除

  6. 出现提示时,点击确定以确认删除。

  7. 如需验证存储桶和对象是否已删除,请前往 Google Cloud 控制台中的存储桶页面。

    进入“存储桶”

后续步骤