arrow_back

Cloud Storage

登录 加入
欢迎加入我们的社区,一起测试和分享您的知识!

Cloud Storage

实验 1 小时 30 分钟 universal_currency_alt 5 个积分 show_chart 入门级
info 此实验可能会提供 AI 工具来支持您学习。
欢迎加入我们的社区,一起测试和分享您的知识!

概览

Cloud Storage 是 Google Cloud 提供的一种基础资源,它包含许多高级功能。在本实验中,您将练习运用 Cloud Storage 的许多功能,这些功能对于您的设计都非常有用。您将通过控制台和 gsutil 工具这两种方法来探索 Cloud Storage。

目标

在本实验中,您将学习如何执行以下任务:

  • 创建并使用存储桶

  • 设置访问控制列表来限制访问权限

  • 使用您自己的加密密钥

  • 实现版本控制

  • 使用目录同步功能

  • 使用 IAM 在各个项目之间共享存储桶

Qwiklabs 设置

对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。

  1. 请使用无痕式窗口登录 Qwiklabs。

  2. 留意实验的访问时限(例如 1:15:00)并确保能在相应时间段内完成实验。
    系统不提供暂停功能。如有需要,您可以重新开始实验,不过必须从头开始。

  3. 准备就绪时,点击开始实验

  4. 请记好您的实验凭据(用户名密码)。您需要使用这组凭据来登录 Google Cloud 控制台。

  5. 点击打开 Google 控制台

  6. 点击使用其他帐号,然后将实验的凭据复制并粘贴到相应提示框中。
    如果您使用其他凭据,将会收到错误消息或产生费用

  7. 接受条款并跳过恢复资源页面。

任务 1. 准备工作

创建 Cloud Storage 存储桶

  1. 导航菜单 () 中,点击 Cloud Storage > 浏览器
注意:存储桶必须具有全局唯一的名称。您可以在存储桶的名称中包含 PROJECT_ID_1 的一部分,帮助确保该名称的唯一性。例如,如果 PROJECT_ID_1myproj-154920,那么您可以将存储桶名称指定为 storecore154920
  1. 点击创建存储桶
  2. 指定下列内容,将其他设置保留默认值:
属性 值(按照说明输入值或选择选项)
名称 输入全局唯一的名称
位置类型 多区域
禁止公开访问此存储桶 未勾选
访问权限控制 精细控制除存储桶级权限外,还会用到对象级权限
  1. 记下存储桶名称。本实验的后面部分将用到该名称并以 [BUCKET_NAME_1] 来引用它。
  2. 点击创建

点击“检查我的进度”以验证是否完成了以下目标: 创建 Cloud Storage 存储桶

使用 CURL 下载示例文件,并创建该文件的两个副本

  1. 在 Cloud 控制台中,点击激活 Cloud Shell ()。

  2. 如果出现提示,点击继续

  3. 将 [BUCKET_NAME_1] 存储在环境变量中:

export BUCKET_NAME_1=<在此处输入存储桶名称 1>
  1. 使用 echo 进行验证:

echo $BUCKET_NAME_1
  1. 运行以下命令下载示例文件(该示例文件是一个公开提供的 Hadoop 文档的 HTML 文件):

curl \ https://hadoop.apache.org/docs/current/\ hadoop-project-dist/hadoop-common/\ ClusterSetup.html > setup.html
  1. 如需创建该文件的副本,请运行以下命令:

cp setup.html setup2.html cp setup.html setup3.html

任务 2. 访问控制列表 (ACL)

将该文件复制到存储桶并配置访问控制列表

  1. 运行以下命令以将第一个文件复制到存储桶:

gsutil cp setup.html gs://$BUCKET_NAME_1/
  1. 如需获取分配给 setup.html 的默认访问权限列表,请运行以下命令:

gsutil acl get gs://$BUCKET_NAME_1/setup.html > acl.txt cat acl.txt
  1. 如需将访问权限列表设置为不公开并验证结果,请运行以下命令:

gsutil acl set private gs://$BUCKET_NAME_1/setup.html gsutil acl get gs://$BUCKET_NAME_1/setup.html > acl2.txt cat acl2.txt
  1. 如需更新访问权限列表以使该文件可供公开读取,请运行以下命令:

gsutil acl ch -u AllUsers:R gs://$BUCKET_NAME_1/setup.html gsutil acl get gs://$BUCKET_NAME_1/setup.html > acl3.txt cat acl3.txt

点击“检查我的进度”以验证是否完成了以下目标: 使文件可供公开读取

在 Cloud 控制台中检查文件

  1. 在 Cloud 控制台的导航菜单 () 中,点击 Cloud Storage > 浏览器

  2. 点击 [BUCKET_NAME_1]。

  3. 确认 setup.html 文件的公共访问权限部分有一个公开链接

删除本地文件并从 Cloud Storage 重新复制该文件

  1. 返回 Cloud Shell。如有必要,点击激活 Cloud Shell ()。

  2. 运行以下命令以删除设置文件:

rm setup.html
  1. 如需验证该文件是否已被删除,请运行以下命令:

ls
  1. 如需重新从存储桶复制该文件,请运行以下命令:

gsutil cp gs://$BUCKET_NAME_1/setup.html setup.html

任务 3. 客户提供的加密密钥 (CSEK)

生成 CSEK 密钥

在下一步中,您需要用到一个采用 base-64 编码的 AES-256 密钥。

  1. 运行以下命令以创建密钥:

python3 -c 'import base64; import os; print(base64.encodebytes(os.urandom(32)))'

结果(这是示例输出)

b'tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=\n'
  1. 复制所生成密钥的值(不包含命令输出中的 b'\n')。密钥应为 tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0= 格式。

修改 boto 文件

加密控件都包含在一个名为 .boto 的 gsutil 配置文件中。

  1. 如需查看并打开该 boto 文件,请运行以下命令:

ls -al nano .boto
  1. 找到“#encryption_key=”所在的行。
注意:nano 编辑器的底部提供了可用于快速查找文件的各种快捷方式。您可以使用 Where Is 快捷方式快速找到 #encryption_key= 所在的行。
  1. 移除 # 字符以取消注释该行,然后在该行末尾粘贴您在前面生成的密钥。

示例(这只是一个示例)

修改之前: # encryption_key= 修改之后: encryption_key=tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
  1. 依次按 Ctrl+OENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。

在 Cloud 控制台中上传其余的设置文件(已加密)并进行验证

  1. 如需上传其余的 setup.html 文件,请运行以下命令:

gsutil cp setup2.html gs://$BUCKET_NAME_1/ gsutil cp setup3.html gs://$BUCKET_NAME_1/
  1. 返回 Cloud 控制台。
  2. 点击 [BUCKET_NAME_1]。您可以看到,setup2.html 和 setup3.html 文件均已经过客户加密。

点击“检查我的进度”以验证是否完成了以下目标: 客户提供的加密密钥 (CSEK)

删除本地文件、复制新文件并验证加密

  1. 如需删除本地文件,请在 Cloud Shell 中运行以下命令:

rm setup*
  1. 如需重新从存储桶复制文件,请运行以下命令:

gsutil cp gs://$BUCKET_NAME_1/setup* ./
  1. 如需输出这几个加密文件的内容以确定是否已成功复制,请运行以下命令:

cat setup.html cat setup2.html cat setup3.html

任务 4. 轮替 CSEK 密钥

将当前的 CSEK 加密密钥移至解密密钥对应的行

  1. 运行以下命令以打开 .boto 文件:

nano .boto
  1. 在当前 encryption_key 行的开头添加 # 字符,注释掉该行。
注意:nano 编辑器的底部提供了可用于快速查找文件的各种快捷方式。您可以使用 Where Is 快捷方式快速找到 #encryption_key= 所在的行。
  1. 移除 decryption_key1 行的 # 字符以取消注释该行,然后将 encryption_key 行中的当前密钥复制到 decryption_key1 行。

结果(这是示例输出)

修改之前: encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg= # decryption_key1= 修改之后: # encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg= decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
  1. 依次按 Ctrl+OENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。

生成另一个 CSEK 密钥并将其添加到 boto 文件

  1. 运行以下命令以生成一个新密钥:

python3 -c 'import base64; import os; print(base64.encodebytes(os.urandom(32)))'
  1. 复制所生成密钥的值(不包含命令输出中的 b'\n')。密钥应为 tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0= 格式。

  2. 如需打开 boto 文件,请运行以下命令:

nano .boto
  1. 取消注释加密行,然后将新的密钥值粘贴到 encryption_key= 后面。

结果(这是示例输出)

修改之前: # encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg= 修改之后: encryption_key=HbFK4I8CaStcvKKIx6aNpdTse0kTsfZNUjFpM+YUEjY=
  1. 依次按 Ctrl+OENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。

重写文件 1 的密钥并注释掉旧的解密密钥

加密文件后,如果重写该文件,系统便会使用您先前设置的 decryption_key1 解密该文件,然后用新的 encryption_key 重新加密该文件。

您将重写 setup2.html 的密钥,但不重写 setup3.html 的密钥,以便了解如果没有正确轮替密钥,将会发生什么情况。

  1. 运行以下命令:

gsutil rewrite -k gs://$BUCKET_NAME_1/setup2.html
  1. 如需打开 boto 文件,请运行以下命令:

nano .boto
  1. 将 # 字符重新添加到当前 decryption_key1 行的开头,再次注释掉该行。

结果(这是示例输出)

修改之前: decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg= 修改之后: # decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
  1. 依次按 Ctrl+OENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。

下载 setup2 和 setup3 文件

  1. 如需下载 setup2.html 文件,请运行以下命令:

gsutil cp gs://$BUCKET_NAME_1/setup2.html recover2.html
  1. 如需下载 setup3.html 文件,请运行以下命令:

gsutil cp gs://$BUCKET_NAME_1/setup3.html recover3.html 注意:发生了什么情况?由于您未使用新密钥重写 setup3.html 文件,因而无法再解密该文件,导致复制失败。

您已成功轮替 CSEK 密钥。

任务 5. 启用生命周期管理

查看存储桶的当前生命周期政策

  • 运行以下命令以查看当前生命周期政策:

gsutil lifecycle get gs://$BUCKET_NAME_1

创建生命周期政策 JSON 文件

  1. 如需创建名为 life.json 的文件,请运行以下命令:

nano life.json
  1. 将下面的值粘贴到该 life.json 文件中:

{ "rule": [ { "action": {"type": "Delete"}, "condition": {"age": 31} } ] }
  1. 依次按 Ctrl+OENTER 键保存文件,然后按 Ctrl+X 退出 nano。

设置政策并进行验证

  1. 如需设置政策,请运行以下命令:

gsutil lifecycle set life.json gs://$BUCKET_NAME_1
  1. 如需验证政策,请运行以下命令:

gsutil lifecycle get gs://$BUCKET_NAME_1

点击“检查我的进度”以验证是否完成了以下目标: 启用生命周期管理

任务 6. 启用版本控制

查看存储桶的版本控制状态并启用版本控制

  1. 运行以下命令以查看存储桶的当前版本控制状态:

gsutil versioning get gs://$BUCKET_NAME_1
  1. 如需启用版本控制,请运行以下命令:

gsutil versioning set on gs://$BUCKET_NAME_1
  1. 如需验证是否已启用版本控制,请运行以下命令:

gsutil versioning get gs://$BUCKET_NAME_1

点击“检查我的进度”以验证是否完成了以下目标: 启用版本控制

在存储桶中创建示例文件的多个版本

  1. 查看示例文件的大小:

ls -al setup.html
  1. 打开 setup.html 文件:

nano setup.html
  1. 从 setup.html 文件中删除任意 5 行,以更改该文件的大小。

  2. 依次按 Ctrl+OENTER 键保存文件,然后按 Ctrl+X 退出 nano。

  3. 使用 -v 版本控制选项将该文件复制到存储桶:

gsutil cp -v setup.html gs://$BUCKET_NAME_1
  1. 打开 setup.html 文件:

nano setup.html
  1. 从 setup.html 文件中再删除 5 行,再次更改该文件的大小。

  2. 依次按 Ctrl+OENTER 键保存文件,然后按 Ctrl+X 退出 nano。

  3. 使用 -v 版本控制选项将该文件复制到存储桶:

gsutil cp -v setup.html gs://$BUCKET_NAME_1

列出文件的所有版本

  1. 如需列出文件的所有版本,请运行以下命令:

gsutil ls -a gs://$BUCKET_NAME_1/setup.html
  1. 选中最早的文件版本(列在最前面的版本)并复制该版本的名称,下一步中会以 [VERSION_NAME] 引用该版本。
注意:请务必复制文件的完整路径(以 gs:// 开头)。
  1. 将版本值存储在环境变量 [VERSION_NAME] 中。

export VERSION_NAME=<在此处输入版本名称>
  1. 使用 echo 进行验证:

echo $VERSION_NAME

结果(这是示例输出)

gs://BUCKET_NAME_1/setup.html#1584457872853517

下载文件最早的原始版本并验证文件是否已恢复

  1. 下载文件的原始版本:

gsutil cp $VERSION_NAME recovered.txt
  1. 如需验证文件是否已恢复,请运行以下命令:

ls -al setup.html ls -al recovered.txt

任务 7. 将目录同步到存储桶

构建一个嵌套目录并将其同步到存储桶

构建一个嵌套目录结构,以便了解将该目录以递归方式复制到存储桶时会发生什么情况。

  1. 运行以下命令:

mkdir firstlevel mkdir ./firstlevel/secondlevel cp setup.html firstlevel cp setup.html firstlevel/secondlevel
  1. 如需将虚拟机上的 firstlevel 目录同步到存储桶,请运行以下命令:

gsutil rsync -r ./firstlevel gs://$BUCKET_NAME_1/firstlevel

检查结果

  1. 在 Cloud 控制台的导航菜单 () 中,点击 Cloud Storage > 浏览器

  2. 点击 [BUCKET_NAME_1]。请留意存储桶中的子文件夹。

  3. 依次点击 /firstlevel/secondlevel

  4. 将 Cloud 控制台中显示的内容与以下命令的结果进行比较:

gsutil ls -r gs://$BUCKET_NAME_1/firstlevel
  1. 退出 Cloud Shell:

exit

任务 8. 跨项目共享

切换到第二个项目

  1. 打开一个新的无痕式标签页。

  2. 导航到 console.cloud.google.com 以打开 Cloud 控制台。

  3. 点击标题栏中的项目选择器下拉菜单。

  4. 点击全部,然后在“Qwiklabs 连接详情”对话框中点击提供给您的第二个项目。请注意,项目 ID 应该是一个在所有 Google Cloud 项目中均保持唯一的名称。本实验将以 [PROJECT_ID_2] 引用第二个项目的 ID。

准备存储桶

  1. 在 Cloud 控制台的导航菜单 () 中,点击 Cloud Storage > 浏览器
  2. 点击创建存储桶
  3. 指定下列内容,将其他设置保留默认值:
属性 值(按照说明输入值或选择选项)
名称 输入全局唯一的名称
位置类型 多区域
访问权限控制 精细控制除存储桶级权限外,还会用到对象级权限
  1. 记下存储桶名称。后面的步骤中将以 [BUCKET_NAME_2] 引用该名称。

  2. 点击创建

将一个文本文件上传到该存储桶

  1. 将一个文件上传到 [BUCKET_NAME_2]。您可以选择上传任意一个较小的示例文件或文本文件。

  2. 记下文件名(以 [FILE_NAME] 引用),后面的步骤需要用到该文件名。

创建 IAM 服务帐号

  1. 在 Cloud 控制台的导航菜单 () 中,点击 IAM 和管理 > 服务帐号
  2. 点击创建服务帐号
  3. 在“服务帐号详情”页面上,将服务帐号名称指定为 cross-project-storage
  4. 点击创建并继续
  5. 在“服务帐号权限”页面上,将角色指定为 Cloud Storage > Storage Object Viewer
  6. 依次点击继续完成
  7. 点击 cross-project-storage 服务帐号以向其添加 JSON 密钥。
  8. 密钥标签页中,点击添加密钥下拉菜单并选择创建新密钥
  9. 选择 JSON 作为密钥类型,然后点击创建。系统会下载一个 JSON 密钥文件。在后面的步骤中,您需要找到这个密钥文件并将其上传到虚拟机。
  10. 点击关闭
  11. 在您的硬盘上,将该 JSON 密钥文件重命名为 credentials.json
  12. 在上面的窗格中,切换回 [PROJECT_ID_1]。

点击“检查我的进度”以验证是否完成了以下目标: 在第二个项目中创建资源

创建虚拟机

  1. 导航菜单 () 中,点击 Compute Engine > 虚拟机实例
  2. 点击创建实例
  3. 指定下列内容,将其他设置保留默认值:
属性 值(按照说明输入值或选择选项)
名称 crossproject
区域 europe-west1
可用区 europe-west1-d
系列 N1
机器类型 n1-standard-1
启动磁盘 Debian GNU/Linux 11 (bullseye)
  1. 点击创建

通过 SSH 连接到虚拟机

  1. 对于 crossproject,点击 SSH 以启动一个终端并进行连接。
  1. 将 [BUCKET_NAME_2] 存储在环境变量中:

export BUCKET_NAME_2=<在此处输入存储桶名称 2>
  1. 使用 echo 进行验证:

echo $BUCKET_NAME_2
  1. 将 [FILE_NAME] 存储在环境变量中:

export FILE_NAME=<在此处输入文件名>
  1. 使用 echo 进行验证:

echo $FILE_NAME
  1. 列出 [PROJECT_ID_2] 中的文件:

gsutil ls gs://$BUCKET_NAME_2/

结果(这是示例输出)

AccessDeniedException: 403 404513585876-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket.

向虚拟机授权

  1. 如需通过 SSH 虚拟机终端上传 credentials.json,请点击右上角的向上箭头图标 (),然后点击上传文件

  2. 选择 credentials.json 并上传该文件。

  3. 在“文件传输”窗口中点击关闭

  4. 验证该 JSON 文件是否已上传到虚拟机:

ls

结果(这是示例输出)

credentials.json
  1. 在终端中输入以下命令以授权虚拟机使用 Google Cloud API:

gcloud auth activate-service-account --key-file credentials.json

验证访问权限

  1. 再次执行下面的命令:

gsutil ls gs://$BUCKET_NAME_2/
  1. 再次执行下面的命令:

gsutil cat gs://$BUCKET_NAME_2/$FILE_NAME
  1. 尝试将凭据文件复制到存储桶:

gsutil cp credentials.json gs://$BUCKET_NAME_2/

结果(这是示例输出)

Copying file://credentials.json [Content-Type=application/json]... AccessDeniedException: 403 cross-project-storage@qwiklabs-gcp-02-c638e3daa975.iam.gserviceaccount.com does not have storage.objects.create access to the Google Cloud Storage object.

修改角色

  1. 在上面的窗格中,切换回 [PROJECT_ID_2]。
  2. 在 Cloud 控制台的导航菜单 () 中,点击 IAM 和管理 > IAM
  3. 点击 cross-project-storage 服务帐号的铅笔图标(可能需要向右侧滚动才能看到该图标)。
  4. 点击 Storage Object Viewer 角色,然后点击 Cloud Storage > Storage Object Admin
  5. 点击保存。如果您未点击保存,所做的更改将不会生效。

点击“检查我的进度”以验证是否完成了以下目标: 在第一个项目中创建资源并进行验证

验证更改后的访问权限

  1. 返回 crossproject 的 SSH 终端。

  2. 将凭据文件复制到存储桶:

gsutil cp credentials.json gs://$BUCKET_NAME_2/

结果(这是示例输出)

Copying file://credentials.json [Content-Type=application/json]... - [1 files][ 2.3 KiB/ 2.3 KiB] Operation completed over 1 objects/2.3 KiB.

任务 9. 回顾

在本实验中,您学习了如何创建并使用存储桶和对象,并了解了以下 Cloud Storage 功能:

  • CSEK:客户提供的加密密钥
  • 使用您自己的加密密钥
  • 轮替密钥
  • ACL:访问控制列表
  • 将一个 ACL 设置为不公开,然后修改为公开
  • 生命周期管理
  • 将一个政策设置为在 31 天后删除对象
  • 版本控制
  • 创建版本以及恢复先前的版本
  • 目录同步
  • 将虚拟机目录以递归方式同步到存储桶
  • 使用 IAM 跨项目共享资源
  • 使用 IAM 实现跨项目访问资源

结束实验

完成实验后,请点击结束实验。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。

系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交

星级数的含义如下:

  • 1 颗星 = 非常不满意
  • 2 颗星 = 不满意
  • 3 颗星 = 一般
  • 4 颗星 = 满意
  • 5 颗星 = 非常满意

如果您不想提供反馈,可以关闭该对话框。

如果要留言反馈、提出建议或做出更正,请使用支持标签页。

版权所有 2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。

Before you begin

  1. Labs create a Google Cloud project and resources for a fixed time
  2. Labs have a time limit and no pause feature. If you end the lab, you'll have to restart from the beginning.
  3. On the top left of your screen, click Start lab to begin

此内容目前不可用

一旦可用,我们会通过电子邮件告知您

太好了!

一旦可用,我们会通过电子邮件告知您

One lab at a time

Confirm to end all existing labs and start this one

Use private browsing to run the lab

Use an Incognito or private browser window to run this lab. This prevents any conflicts between your personal account and the Student account, which may cause extra charges incurred to your personal account.