作为云架构师,您知道存储空间对任何组织而言都是最重要的资源之一。每天,您的公司内有成千上万份新文件和文档被生成、修改和访问。您需要制定有效的灾难恢复计划来存储备份,并创建一个包含以下功能特性的冗余架构:
- 安全、可伸缩且具备高可用性的对象级存储
- 精细的访问权限控制
- 版本控制
- 生命周期管理功能
- 本地目录与云端目录直接同步
在 Amazon Web Services (AWS) 中,您使用 Simple Storage Service (S3) 作为对象存储解决方案。
如需实现精细的访问权限控制,您可以结合使用存储桶政策、Identity and Access Management (IAM) 政策和访问控制列表 (ACL),以便管理哪些人可以访问整个存储桶和单个对象。在 S3 存储桶内,还可以使用 AWS 代管或客户端代管的加密密钥来加密对象,从而提供额外的安全保障。
您可以设置版本控制,以避免重要文件被意外删除和覆盖。您还可以通过设置生命周期政策来优化成本,此类政策可根据访问模式将对象从一个存储类别自动移到另一个存储类别。如需同步目录,您可以镜像位置,确保来源中的更改反映在目标位置,以便复制数据。

接下来,您将探索 Cloud Storage 的各项功能,利用 Cloud 控制台和 gsutil 工具在 Google Cloud 上安全地存储数据。
概览
Cloud Storage 是 Google Cloud 提供的一种基础资源,它包含许多高级功能。在本实验中,您将练习运用 Cloud Storage 的许多功能,这些功能对于您的设计都非常有用。您将通过控制台和 gsutil 工具这两种方法来探索 Cloud Storage。
目标
在本实验中,您将学习如何执行以下任务:
- 创建并使用存储桶
- 设置访问控制列表来限制访问权限
- 使用您自己的加密密钥
- 实现版本控制
- 使用目录同步功能
Qwiklabs 设置
对于每个实验,您都会免费获得一个新的 Google Cloud 项目及一组资源,它们都有固定的使用时限。
-
点击开始实验按钮。如果该实验需要付费,系统会打开一个弹出式窗口供您选择付款方式。左侧是实验详细信息面板,其中包含以下各项:
-
打开 Google Cloud 控制台按钮
- 剩余时间
- 进行该实验时必须使用的临时凭据
- 帮助您逐步完成本实验所需的其他信息(如果需要)
-
点击打开 Google Cloud 控制台(如果您使用的是 Chrome 浏览器,请右键点击并选择在无痕式窗口中打开链接)。
该实验会启动资源并打开另一个标签页,显示登录页面。
提示:将这些标签页安排在不同的窗口中,并排显示。
注意:如果您看见选择账号对话框,请点击使用其他账号。
-
如有必要,请复制下方的用户名,然后将其粘贴到登录对话框中。
{{{user_0.username | "<用户名>"}}}
您也可以在实验详细信息面板中找到用户名。
-
点击下一步。
-
复制下面的密码,然后将其粘贴到欢迎对话框中。
{{{user_0.password | "<密码>"}}}
您也可以在实验详细信息面板中找到密码。
-
点击下一步。
重要提示:您必须使用实验提供的凭据。请勿使用您的 Google Cloud 账号凭据。
注意:在本实验中使用您自己的 Google Cloud 账号可能会产生额外费用。
-
继续在后续页面中点击以完成相应操作:
- 接受条款及条件。
- 由于这是临时账号,请勿添加账号恢复选项或双重验证。
- 请勿注册免费试用。
片刻之后,系统会在此标签页中打开 Google Cloud 控制台。
注意:如需查看列有 Google Cloud 产品和服务的菜单,请点击左上角的导航菜单,或在搜索字段中输入服务或产品的名称。
任务 1. 准备工作
在此任务中,您将创建一个 Cloud Storage 存储桶。然后,下载一个示例文件,您将在下一个任务中使用该文件。
创建 Cloud Storage 存储桶
- 在 Google Cloud 控制台的导航菜单 (
) 中,依次点击 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)
在此任务中,您将设置访问控制列表,为您复制到 Cloud Storage 存储桶的文件设定访问权限限制。
将该文件复制到存储桶并配置访问控制列表
- 运行以下命令以将第一个文件复制到存储桶:
gcloud storage 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 控制台中检查文件
- 在 Google Cloud 控制台的导航菜单 (
) 中,依次点击 Cloud Storage > 存储桶。
- 点击 [BUCKET_NAME_1]。
- 确认 setup.html 文件的公共访问权限部分有一个公开链接。
删除本地文件并从 Cloud Storage 重新复制该文件
- 返回 Cloud Shell。如有必要,点击激活 Cloud Shell (
)。
- 运行以下命令以删除设置文件:
rm setup.html
- 如需验证该文件已删除,请运行以下命令:
ls
- 如需重新从存储桶复制该文件,请运行以下命令:
gcloud storage cp gs://$BUCKET_NAME_1/setup.html setup.html
任务 3:客户提供的加密密钥 (CSEK)
在此任务中,您将生成 CSEK 密钥,以加密存储在 Cloud Storage 存储桶中的文件。
生成 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 密钥
在此任务中,您将轮替用于加密 Cloud Storage 中数据的 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。
注意:在实际工作中,您应从 encryption_key 行删除旧的 CSEK 密钥。
生成另一个 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。
注意:在实际工作中,您应从 decryption_key1 行删除旧的 CSEK 密钥。
下载 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. 启用生命周期管理
在此任务中,您将为 Cloud Storage 存储桶启用生命周期管理,以便在指定时间段后自动删除对象。
查看存储桶的当前生命周期政策
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. 启用版本控制
在此任务中,您将为 Cloud Storage 存储桶启用版本控制,以防止数据被意外删除或修改。
查看存储桶的版本控制状态并启用版本控制
- 运行以下命令以查看存储桶的当前版本控制状态:
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 版本控制选项将该文件复制到存储桶:
gcloud storage cp -v setup.html gs://$BUCKET_NAME_1
- 打开 setup.html 文件:
nano setup.html
- 从 setup.html 文件中再删除 5 行,再次更改该文件的大小。
- 依次按 Ctrl+O、ENTER 键保存文件,然后按 Ctrl+X 退出 nano。
- 使用 -v 版本控制选项将该文件复制到存储桶:
gcloud storage cp -v setup.html gs://$BUCKET_NAME_1
列出文件的所有版本
- 如需列出文件的所有版本,请运行以下命令:
gcloud storage 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
下载文件最早的原始版本并验证文件是否已恢复
- 下载文件的原始版本:
gcloud storage cp $VERSION_NAME recovered.txt
- 如需验证文件是否已恢复,请运行以下命令:
ls -al setup.html
ls -al recovered.txt
注意:您已通过备份版本恢复原始文件。您可以看到原始文件比当前版本大,因为您之前删除了几行。
任务 7. 将目录同步到存储桶
在此任务中,您将使用 gsutil rsync 命令将本地目录及其子目录同步到 Cloud Storage 存储桶。
构建一个嵌套目录,并将其同步到存储桶
构建一个嵌套目录结构,以便了解将该目录以递归方式复制到存储桶时会发生什么情况。
- 运行以下命令:
mkdir firstlevel
mkdir ./firstlevel/secondlevel
cp setup.html firstlevel
cp setup.html firstlevel/secondlevel
- 如需将虚拟机上的 firstlevel 目录同步到存储桶,请运行以下命令:
gsutil rsync -r ./firstlevel gs://$BUCKET_NAME_1/firstlevel
检查结果
- 在 Google Cloud 控制台的导航菜单 (
) 中,依次点击 Cloud Storage > 存储桶。
- 点击 [BUCKET_NAME_1]。请留意存储桶中的子文件夹。
- 依次点击 /firstlevel 和 /secondlevel。
- 将 Cloud 控制台中显示的内容与以下命令的结果进行比较:
gcloud storage ls -r gs://$BUCKET_NAME_1/firstlevel
- 退出 Cloud Shell:
exit
任务 8. 回顾
在本实验中,您学习了如何创建并使用存储桶和对象,并了解了以下 Cloud Storage 功能:
- CSEK:客户提供的加密密钥
- 使用您自己的加密密钥
- 轮替密钥
- ACL:访问控制列表
- 将一个 ACL 设置为不公开,然后修改为公开
- 生命周期管理
- 将一个政策设置为在 31 天后删除对象
- 版本控制
- 创建版本以及恢复先前的版本
- 目录同步
- 将虚拟机目录以递归方式同步到存储桶
摘要
S3 和 Cloud Storage 均提供对象级存储,并具有访问权限控制管理、加密、版本控制和生命周期管理功能。我们来了解一下两种服务之间的一些异同。
相似之处:
- Cloud Storage 和 S3 都提供访问控制列表 (ACL),以便进行精细的访问权限控制。
- 两项服务都提供存储类别,可通过修改数据访问频率和数据冗余来实现成本优化。
- 两项服务都提供对象生命周期管理,可自动将对象从一种存储类别移至另一种存储类别。
- 两项服务都提供版本控制功能,可防止文件被意外删除和覆盖。
- 两项服务都提供目录同步功能,以保持对象的最新状态,并确保来源和目标位置的存储桶对象保持一致。
不同之处:
- 在 Google Cloud 中,您可以通过修改 gsutil 配置的 .boto 文件来启用存储桶加密,并添加客户提供的加密密钥。在 AWS 中,您可以通过 AWS CLI 使用“put-bucket-encryption”命令并在 --server-side-encryption-configuration 参数中指定密钥,来启用存储桶加密。
- 在 Google Cloud 中,所有存储类别都由单个服务管理。而在 AWS 中,归档存储类别由 S3 Glacier 单独管理。标准和不频繁访问类别由 S3 管理。
结束实验
完成实验后,请点击结束实验。Google Cloud Skills Boost 会移除您使用过的资源并为您清理帐号。
系统会提示您为实验体验评分。请选择相应的星级数,输入评论,然后点击提交。
星级数的含义如下:
- 1 颗星 = 非常不满意
- 2 颗星 = 不满意
- 3 颗星 = 一般
- 4 颗星 = 满意
- 5 颗星 = 非常满意
如果您不想提供反馈,可以关闭该对话框。
如果要留言反馈、提出建议或做出更正,请使用支持标签页。
版权所有 2020 Google LLC 保留所有权利。Google 和 Google 徽标是 Google LLC 的商标。其他所有公司名和产品名可能是其各自相关公司的商标。