概览
Cloud Storage 是 Google Cloud 提供的一种基础资源,它包含许多高级功能。在本实验中,您将练习运用 Cloud Storage 的许多功能,这些功能对于您的设计都非常有用。您将通过控制台和 gsutil 工具这两种方法来探索 Cloud Storage。
目标
在本实验中,您将学习如何执行以下任务:
创建并使用存储桶
设置访问控制列表来限制访问权限
使用您自己的加密密钥
实现版本控制
使用目录同步功能
使用 IAM 在各个项目之间共享存储桶
Qwiklabs 设置
对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。
请使用无痕式窗口 登录 Qwiklabs。
留意实验的访问时限(例如 1:15:00
)并确保能在相应时间段内完成实验。
系统不提供暂停功能。如有需要,您可以重新开始实验,不过必须从头开始。
准备就绪时,点击开始实验 。
请记好您的实验凭据(用户名 和密码 )。您需要使用这组凭据来登录 Google Cloud 控制台。
点击打开 Google 控制台 。
点击使用其他帐号 ,然后将此 实验的凭据复制并粘贴到相应提示框中。
如果您使用其他凭据,将会收到错误消息或产生费用 。
接受条款并跳过恢复资源页面。
任务 1. 准备工作
创建 Cloud Storage 存储桶
在导航菜单 ( ) 中,点击 Cloud Storage > 浏览器 。
注意 :存储桶必须具有全局唯一的名称。您可以在存储桶的名称中包含 PROJECT_ID_1
的一部分,帮助确保该名称的唯一性。例如,如果 PROJECT_ID_1
为 myproj-154920
,那么您可以将存储桶名称指定为 storecore154920
。
点击创建存储桶 。
指定下列内容,将其他设置保留默认值:
属性
值(按照说明输入值或选择选项)
名称
输入全局唯一的名称
位置类型
多区域
禁止公开访问此存储桶
未勾选
访问权限控制
精细控制 (除存储桶级权限外,还会用到对象级权限 )
记下存储桶名称。本实验的后面部分将用到该名称并以 [BUCKET_NAME_1] 来引用它。
点击创建 。
点击“检查我的进度” 以验证是否完成了以下目标:
创建 Cloud Storage 存储桶
使用 CURL 下载示例文件,并创建该文件的两个副本
在 Cloud 控制台中,点击激活 Cloud Shell ( )。
如果出现提示,点击继续 。
将 [BUCKET_NAME_1] 存储在环境变量中:
export BUCKET_NAME_1=<在此处输入存储桶名称 1>
使用 echo 进行验证:
echo $BUCKET_NAME_1
运行以下命令下载示例文件(该示例文件是一个公开提供的 Hadoop 文档的 HTML 文件):
curl \
https://hadoop.apache.org/docs/current/\
hadoop-project-dist/hadoop-common/\
ClusterSetup.html > setup.html
如需创建该文件的副本,请运行以下命令:
cp setup.html setup2.html
cp setup.html setup3.html
任务 2. 访问控制列表 (ACL)
将该文件复制到存储桶并配置访问控制列表
运行以下命令以将第一个文件复制到存储桶:
gsutil cp setup.html gs://$BUCKET_NAME_1/
如需获取分配给 setup.html 的默认访问权限列表,请运行以下命令:
gsutil acl get gs://$BUCKET_NAME_1/setup.html > acl.txt
cat acl.txt
如需将访问权限列表设置为不公开并验证结果,请运行以下命令:
gsutil acl set private gs://$BUCKET_NAME_1/setup.html
gsutil acl get gs://$BUCKET_NAME_1/setup.html > acl2.txt
cat acl2.txt
如需更新访问权限列表以使该文件可供公开读取,请运行以下命令:
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 控制台中检查文件
在 Cloud 控制台的导航菜单 ( ) 中,点击 Cloud Storage > 浏览器 。
点击 [BUCKET_NAME_1]。
确认 setup.html 文件的公共访问权限 部分有一个公开链接 。
删除本地文件并从 Cloud Storage 重新复制该文件
返回 Cloud Shell 。如有必要,点击激活 Cloud Shell ( )。
运行以下命令以删除设置文件:
rm setup.html
如需验证该文件是否已被删除,请运行以下命令:
ls
如需重新从存储桶复制该文件,请运行以下命令:
gsutil cp gs://$BUCKET_NAME_1/setup.html setup.html
任务 3. 客户提供的加密密钥 (CSEK)
生成 CSEK 密钥
在下一步中,您需要用到一个采用 base-64 编码的 AES-256 密钥。
运行以下命令以创建密钥:
python3 -c 'import base64; import os; print(base64.encodebytes(os.urandom(32)))'
结果(这是示例输出) :
b'tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=\n'
复制所生成密钥的值(不包含命令输出中的 b'
和 \n'
)。密钥应为 tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
格式。
修改 boto 文件
加密控件都包含在一个名为 .boto
的 gsutil 配置文件中。
如需查看并打开该 boto 文件,请运行以下命令:
ls -al
nano .boto
注意 :如果 .boto
文件为空,请使用 Ctrl+X 组合键关闭 nano 编辑器,然后使用 gsutil config -n
命令生成一个新的 .boto
文件。接下来,重新尝试用上述命令打开文件。
如果 .boto
文件仍为空,您可能需要使用 gsutil version -l
命令找到该文件。
找到“#encryption_key=
”所在的行。
注意 :nano 编辑器的底部提供了可用于快速查找文件的各种快捷方式。您可以使用 Where Is 快捷方式快速找到 #encryption_key= 所在的行。
移除 # 字符以取消注释该行,然后在该行末尾粘贴您在前面生成的密钥。
示例(这只是一个示例) :
修改之前:
# encryption_key=
修改之后:
encryption_key=tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
依次按 Ctrl+O 、ENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。
在 Cloud 控制台中上传其余的设置文件(已加密)并进行验证
如需上传其余的 setup.html 文件,请运行以下命令:
gsutil cp setup2.html gs://$BUCKET_NAME_1/
gsutil cp setup3.html gs://$BUCKET_NAME_1/
返回 Cloud 控制台。
点击 [BUCKET_NAME_1]。您可以看到,setup2.html 和 setup3.html 文件均已经过客户加密。
点击“检查我的进度” 以验证是否完成了以下目标:
客户提供的加密密钥 (CSEK)
删除本地文件、复制新文件并验证加密
如需删除本地文件,请在 Cloud Shell 中运行以下命令:
rm setup*
如需重新从存储桶复制文件,请运行以下命令:
gsutil cp gs://$BUCKET_NAME_1/setup* ./
如需输出这几个加密文件的内容以确定是否已成功复制,请运行以下命令:
cat setup.html
cat setup2.html
cat setup3.html
任务 4. 轮替 CSEK 密钥
将当前的 CSEK 加密密钥移至解密密钥对应的行
运行以下命令以打开 .boto
文件:
nano .boto
在当前 encryption_key 行的开头添加 # 字符,注释掉该行。
注意 :nano 编辑器的底部提供了可用于快速查找文件的各种快捷方式。您可以使用 Where Is 快捷方式快速找到 #encryption_key= 所在的行。
移除 decryption_key1 行的 # 字符以取消注释该行,然后将 encryption_key 行中的当前密钥复制到 decryption_key1 行。
结果(这是示例输出) :
修改之前:
encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
# decryption_key1=
修改之后:
# encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
依次按 Ctrl+O 、ENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。
生成另一个 CSEK 密钥并将其添加到 boto 文件
运行以下命令以生成一个新密钥:
python3 -c 'import base64; import os; print(base64.encodebytes(os.urandom(32)))'
复制所生成密钥的值(不包含命令输出中的 b'
和 \n'
)。密钥应为 tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
格式。
如需打开 boto 文件,请运行以下命令:
nano .boto
取消注释加密行,然后将新的密钥值粘贴到 encryption_key=
后面。
结果(这是示例输出) :
修改之前:
# encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
修改之后:
encryption_key=HbFK4I8CaStcvKKIx6aNpdTse0kTsfZNUjFpM+YUEjY=
依次按 Ctrl+O 、ENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。
重写文件 1 的密钥并注释掉旧的解密密钥
加密文件后,如果重写该文件,系统便会使用您先前设置的 decryption_key1 解密该文件,然后用新的 encryption_key 重新加密该文件。
您将重写 setup2.html 的密钥,但不重写 setup3.html 的密钥,以便了解如果没有正确轮替密钥,将会发生什么情况。
运行以下命令:
gsutil rewrite -k gs://$BUCKET_NAME_1/setup2.html
如需打开 boto 文件,请运行以下命令:
nano .boto
将 # 字符重新添加到当前 decryption_key1 行的开头,再次注释掉该行。
结果(这是示例输出) :
修改之前:
decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
修改之后:
# decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
依次按 Ctrl+O 、ENTER 键保存 boto 文件,然后按 Ctrl+X 退出 nano。
下载 setup2 和 setup3 文件
如需下载 setup2.html 文件,请运行以下命令:
gsutil cp gs://$BUCKET_NAME_1/setup2.html recover2.html
如需下载 setup3.html 文件,请运行以下命令:
gsutil cp gs://$BUCKET_NAME_1/setup3.html recover3.html
注意 :发生了什么情况?由于您未使用新密钥重写 setup3.html 文件,因而无法再解密该文件,导致复制失败。
您已成功轮替 CSEK 密钥。
任务 5. 启用生命周期管理
查看存储桶的当前生命周期政策
gsutil lifecycle get gs://$BUCKET_NAME_1
创建生命周期政策 JSON 文件
如需创建名为 life.json 的文件,请运行以下命令:
nano life.json
将下面的值粘贴到该 life.json 文件中:
{
"rule":
[
{
"action": {"type": "Delete"},
"condition": {"age": 31}
}
]
}
注意 :这些指令指示 Cloud Storage 在 31 天后删除该对象。
依次按 Ctrl+O 、ENTER 键保存文件,然后按 Ctrl+X 退出 nano。
设置政策并进行验证
如需设置政策,请运行以下命令:
gsutil lifecycle set life.json gs://$BUCKET_NAME_1
如需验证政策,请运行以下命令:
gsutil lifecycle get gs://$BUCKET_NAME_1
点击“检查我的进度” 以验证是否完成了以下目标:
启用生命周期管理
任务 6. 启用版本控制
查看存储桶的版本控制状态并启用版本控制
运行以下命令以查看存储桶的当前版本控制状态:
gsutil versioning get gs://$BUCKET_NAME_1
如需启用版本控制,请运行以下命令:
gsutil versioning set on gs://$BUCKET_NAME_1
如需验证是否已启用版本控制,请运行以下命令:
gsutil versioning get gs://$BUCKET_NAME_1
点击“检查我的进度” 以验证是否完成了以下目标:
启用版本控制
在存储桶中创建示例文件的多个版本
查看示例文件的大小:
ls -al setup.html
打开 setup.html 文件:
nano setup.html
从 setup.html 文件中删除任意 5 行,以更改该文件的大小。
依次按 Ctrl+O 、ENTER 键保存文件,然后按 Ctrl+X 退出 nano。
使用 -v 版本控制选项将该文件复制到存储桶:
gsutil cp -v setup.html gs://$BUCKET_NAME_1
打开 setup.html 文件:
nano setup.html
从 setup.html 文件中再删除 5 行,再次更改该文件的大小。
依次按 Ctrl+O 、ENTER 键保存文件,然后按 Ctrl+X 退出 nano。
使用 -v 版本控制选项将该文件复制到存储桶:
gsutil cp -v setup.html gs://$BUCKET_NAME_1
列出文件的所有版本
如需列出文件的所有版本,请运行以下命令:
gsutil ls -a gs://$BUCKET_NAME_1/setup.html
选中最早的文件版本(列在最前面的版本)并复制该版本的名称,下一步中会以 [VERSION_NAME] 引用该版本。
注意 :请务必复制文件的完整路径(以 gs:// 开头)。
将版本值存储在环境变量 [VERSION_NAME] 中。
export VERSION_NAME=<在此处输入版本名称>
使用 echo 进行验证:
echo $VERSION_NAME
结果(这是示例输出) :
gs://BUCKET_NAME_1/setup.html#1584457872853517
下载文件最早的原始版本并验证文件是否已恢复
下载文件的原始版本:
gsutil cp $VERSION_NAME recovered.txt
如需验证文件是否已恢复,请运行以下命令:
ls -al setup.html
ls -al recovered.txt
注意 :您已通过备份版本恢复原始文件。您可以看到原始文件比当前版本大,因为您之前删除了几行。
任务 7. 将目录同步到存储桶
构建一个嵌套目录并将其同步到存储桶
构建一个嵌套目录结构,以便了解将该目录以递归方式复制到存储桶时会发生什么情况。
运行以下命令:
mkdir firstlevel
mkdir ./firstlevel/secondlevel
cp setup.html firstlevel
cp setup.html firstlevel/secondlevel
如需将虚拟机上的 firstlevel 目录同步到存储桶,请运行以下命令:
gsutil rsync -r ./firstlevel gs://$BUCKET_NAME_1/firstlevel
检查结果
在 Cloud 控制台的导航菜单 ( ) 中,点击 Cloud Storage > 浏览器 。
点击 [BUCKET_NAME_1]。请留意存储桶中的子文件夹。
依次点击 /firstlevel 和 /secondlevel 。
将 Cloud 控制台中显示的内容与以下命令的结果进行比较:
gsutil ls -r gs://$BUCKET_NAME_1/firstlevel
退出 Cloud Shell:
exit
任务 8. 跨项目共享
切换到第二个项目
打开一个新的无痕式标签页。
导航到 console.cloud.google.com 以打开 Cloud 控制台。
点击标题栏中的项目选择器下拉菜单。
点击全部 ,然后在“Qwiklabs 连接详情”对话框中点击提供给您的第二个项目。请注意,项目 ID 应该是一个在所有 Google Cloud 项目中均保持唯一的名称。本实验将以 [PROJECT_ID_2] 引用第二个项目的 ID。
准备存储桶
在 Cloud 控制台的导航菜单 ( ) 中,点击 Cloud Storage > 浏览器 。
点击创建存储桶 。
指定下列内容,将其他设置保留默认值:
属性
值(按照说明输入值或选择选项)
名称
输入全局唯一的名称
位置类型
多区域
访问权限控制
精细控制 (除存储桶级权限外,还会用到对象级权限 )
记下存储桶名称。后面的步骤中将以 [BUCKET_NAME_2] 引用该名称。
点击创建 。
将一个文本文件上传到该存储桶
将一个文件上传到 [BUCKET_NAME_2]。您可以选择上传任意一个较小的示例文件或文本文件。
记下文件名(以 [FILE_NAME] 引用),后面的步骤需要用到该文件名。
创建 IAM 服务帐号
在 Cloud 控制台的导航菜单 ( ) 中,点击 IAM 和管理 > 服务帐号 。
点击创建服务帐号 。
在“服务帐号详情”页面上,将服务帐号名称 指定为 cross-project-storage 。
点击创建并继续 。
在“服务帐号权限”页面上,将角色指定为 Cloud Storage > Storage Object Viewer 。
依次点击继续 和完成 。
点击 cross-project-storage 服务帐号以向其添加 JSON 密钥。
在密钥 标签页中,点击添加密钥 下拉菜单并选择创建新密钥 。
选择 JSON 作为密钥类型,然后点击创建 。系统会下载一个 JSON 密钥文件。在后面的步骤中,您需要找到这个密钥文件并将其上传到虚拟机。
点击关闭 。
在您的硬盘上,将该 JSON 密钥文件重命名为 credentials.json 。
在上面的窗格中,切换回 [PROJECT_ID_1]。
点击“检查我的进度” 以验证是否完成了以下目标:
在第二个项目中创建资源
创建虚拟机
在导航菜单 ( ) 中,点击 Compute Engine > 虚拟机实例 。
点击创建实例 。
指定下列内容,将其他设置保留默认值:
属性
值(按照说明输入值或选择选项)
名称
crossproject
区域
europe-west1
可用区
europe-west1-d
系列
N1
机器类型
n1-standard-1
启动磁盘
Debian GNU/Linux 11 (bullseye)
点击创建 。
通过 SSH 连接到虚拟机
对于 crossproject ,点击 SSH 以启动一个终端并进行连接。
将 [BUCKET_NAME_2] 存储在环境变量中:
export BUCKET_NAME_2=<在此处输入存储桶名称 2>
使用 echo 进行验证:
echo $BUCKET_NAME_2
将 [FILE_NAME] 存储在环境变量中:
export FILE_NAME=<在此处输入文件名>
使用 echo 进行验证:
echo $FILE_NAME
列出 [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.
向虚拟机授权
如需通过 SSH 虚拟机终端上传 credentials.json,请点击右上角的向上箭头图标 ( ),然后点击上传文件 。
选择 credentials.json 并上传该文件。
在“文件传输”窗口中点击关闭 。
验证该 JSON 文件是否已上传到虚拟机:
ls
结果(这是示例输出) :
credentials.json
在终端中输入以下命令以授权虚拟机使用 Google Cloud API:
gcloud auth activate-service-account --key-file credentials.json
验证访问权限
再次执行下面的命令:
gsutil ls gs://$BUCKET_NAME_2/
再次执行下面的命令:
gsutil cat gs://$BUCKET_NAME_2/$FILE_NAME
尝试将凭据文件复制到存储桶:
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.
修改角色
在上面的窗格中,切换回 [PROJECT_ID_2]。
在 Cloud 控制台的导航菜单 ( ) 中,点击 IAM 和管理 > IAM 。
点击 cross-project-storage 服务帐号的铅笔图标(可能需要向右侧滚动才能看到该图标)。
点击 Storage Object Viewer 角色,然后点击 Cloud Storage > Storage Object Admin 。
点击保存 。如果您未点击保存 ,所做的更改将不会生效。
点击“检查我的进度” 以验证是否完成了以下目标:
在第一个项目中创建资源并进行验证
验证更改后的访问权限
返回 crossproject 的 SSH 终端。
将凭据文件复制到存储桶:
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.
注意 :在本示例中,PROJECT_ID_1
中的虚拟机现在能够将文件上传到在另一个项目中创建的 Cloud Storage 存储桶中。
请注意,创建该存储桶的项目是该活动的结算项目。也就是说,如果该虚拟机上传大量文件,所产生的费用不会计入 PROJECT_ID_1
,而是会计入 PROJECT_ID_2
。
任务 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 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。