在 Google Cloud 儲存、處理及管理資料:挑戰實驗室
实验
45 分钟
universal_currency_alt
1 积分
show_chart
入门级
info
此实验可能会提供 AI 工具来支持您学习。
ARC100

總覽
在挑戰研究室中,您會在特定情境下完成一系列任務。挑戰研究室不會提供逐步說明,您將運用從課程研究室學到的技巧,自行找出方法完成任務!自動評分系統 (如本頁所示) 將根據您是否正確完成任務來提供意見回饋。
在您完成任務的期間,挑戰研究室不會介紹新的 Google Cloud 概念。您須靈活運用所學技巧,例如變更預設值或詳讀並研究錯誤訊息,解決遇到的問題。
若想滿分達標,就必須在時限內成功完成所有任務!
設定
瞭解以下事項後,再點選「Start Lab」按鈕
請詳閱以下操作說明。實驗室活動會計時,且中途無法暫停。點選「Start Lab」後就會開始計時,顯示可使用 Google Cloud 資源的時間。
您將在真正的雲端環境完成實作實驗室活動,而不是模擬或示範環境。為此,我們會提供新的暫時憑證,供您在實驗室活動期間登入及存取 Google Cloud。
為了順利完成這個實驗室,請先確認:
- 可以使用標準的網際網路瀏覽器 (Chrome 瀏覽器為佳)。
注意事項:請使用無痕模式 (建議選項) 或私密瀏覽視窗執行此實驗室,這可以防止個人帳戶和學員帳戶之間的衝突,避免個人帳戶產生額外費用。
- 是時候完成實驗室活動了!別忘了,活動一旦開始將無法暫停。
注意事項:務必使用實驗室專用的學員帳戶。如果使用其他 Google Cloud 帳戶,可能會產生額外費用。
挑戰情境
您剛獲聘,現在是初階資料工程師。目前已協助多個團隊建立及管理 Google Cloud 資源。
公司認為您具備執行這些工作所需的技能與知識。
您的挑戰
現在,您必須協助新成立的開發團隊完成新專案的幾項初期工作;新專案名為「回憶」,目的是儲存及整理相片。您必須協助「回憶」團隊進行應用程式開發環境的初始設定,並收到下列工作與相應要求:
- 建立用來儲存相片的 bucket
- 建立 Pub/Sub 主題,稍後您建立的 Cloud Run 函式會用到
- 建立 Cloud Run 函式
您須遵守以下規則:
- 如未特別指定,所有資源均須建立於 區域。
- 使用專案虛擬私有雲。
- 名稱通常為「team-resource」,例如執行個體的名稱可以是「kraken-webserver1」。
- 分配符合成本效益的資源大小。專案會受到監控,超量使用資源會導致做為容器的專案終止,您的專案也有可能受到影響,因此請特別留意。以上是監控團隊提供的指引。除非另有指定,否則請針對小型 Linux VM 使用 f1-micro,並為 Windows 或其他應用程式 (例如 Kubernetes 節點) 使用 n1-standard-1。
以下詳細說明各項工作,祝您好運!
工作 1:建立 bucket
建立 bucket 並命名為 ,用於儲存相片。
資源務必建立於 區域。
點選「Check my progress」,確認目標已達成。
建立 bucket 並命名為
工作 2:建立 Pub/Sub 主題
建立 Pub/Sub 主題並命名為 ,以便 Cloud Run 函式傳送訊息。
點選「Check my progress」,確認目標已達成。
建立名為 的 Pub/Sub 主題
工作 3:建立縮圖的 Cloud Run 函式
建立 Cloud Run 函式 ,利用先前新增至 bucket 的圖片來建立縮圖。
確認 Cloud Run 函式採用的是 Cloud Run functions 環境 (第 2 代)。
資源務必建立於 區域和 可用區。
- 使用
Node.js 22
建立名為 的 Cloud Run 函式 (第 2 代),並將觸發條件設為 Cloud Storage
。
注意:
每次在工作 1 建立的 bucket 中建立物件時,都必須執行這個 Cloud Run 函式。
過程中,Cloud Run 函式可能會要求取得啟用 API 的權限,或要求將角色授予服務帳戶。請按照要求啟用各個必要 API 及授予角色。
授予權限後,請稍候幾分鐘,再點按建立函式,確保權限已更新。
使用控制台建立函式時請注意:啟動函式建立作業後,請等待「建立 Eventarc 觸發條件」 (位於頁面頂端的「建立服務」下方) 顯示綠色核取方塊,再於下一步更新程式碼。
如果未等待 Creating Eventarc trigger 顯示綠色核取方塊,觸發條件可能無法順利建立,且不會顯示在函式的「觸發條件」分頁中。
-
請務必將「進入點」 (要執行的函式) 設為 。
-
將下列程式碼加入 index.js
:
const functions = require('@google-cloud/functions-framework');
const { Storage } = require('@google-cloud/storage');
const { PubSub } = require('@google-cloud/pubsub');
const sharp = require('sharp');
functions.cloudEvent('{{{ project_0.startup_script.function }}}', async cloudEvent => {
const event = cloudEvent.data;
console.log(`Event: ${JSON.stringify(event)}`);
console.log(`Hello ${event.bucket}`);
const fileName = event.name;
const bucketName = event.bucket;
const size = "64x64";
const bucket = new Storage().bucket(bucketName);
const topicName = "{{{ project_0.startup_script.topic }}}";
const pubsub = new PubSub();
if (fileName.search("64x64_thumbnail") === -1) {
// doesn't have a thumbnail, get the filename extension
const filename_split = fileName.split('.');
const filename_ext = filename_split[filename_split.length - 1].toLowerCase();
const filename_without_ext = fileName.substring(0, fileName.length - filename_ext.length - 1); // fix sub string to remove the dot
if (filename_ext === 'png' || filename_ext === 'jpg' || filename_ext === 'jpeg') {
// only support png and jpg at this point
console.log(`Processing Original: gs://${bucketName}/${fileName}`);
const gcsObject = bucket.file(fileName);
const newFilename = `${filename_without_ext}_64x64_thumbnail.${filename_ext}`;
const gcsNewObject = bucket.file(newFilename);
try {
const [buffer] = await gcsObject.download();
const resizedBuffer = await sharp(buffer)
.resize(64, 64, {
fit: 'inside',
withoutEnlargement: true,
})
.toFormat(filename_ext)
.toBuffer();
await gcsNewObject.save(resizedBuffer, {
metadata: {
contentType: `image/${filename_ext}`,
},
});
console.log(`Success: ${fileName} → ${newFilename}`);
await pubsub
.topic(topicName)
.publishMessage({ data: Buffer.from(newFilename) });
console.log(`Message published to ${topicName}`);
} catch (err) {
console.error(`Error: ${err}`);
}
} else {
console.log(`gs://${bucketName}/${fileName} is not an image I can handle`);
}
} else {
console.log(`gs://${bucketName}/${fileName} already has a thumbnail`);
}
});
- 將下列程式碼加入
package.json
:
{
"name": "thumbnails",
"version": "1.0.0",
"description": "Create Thumbnail of uploaded image",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0",
"@google-cloud/pubsub": "^2.0.0",
"@google-cloud/storage": "^6.11.0",
"sharp": "^0.32.1"
},
"devDependencies": {},
"engines": {
"node": ">=4.3.2"
}
}
注意:如果收到權限遭拒的錯誤訊息,指出可能需要幾分鐘,才能將所有必要權限套用至服務代理,請稍候片刻再試一次,並確認所有適當角色 (Eventarc 服務代理、Eventarc 事件接收者、服務帳戶憑證建立者、Pub/Sub 發布者) 均已指派至正確的服務帳戶。
工作 4:測試基礎架構
如要測試這項功能,請將 JPG 或 PNG 圖片上傳至 bucket。
- 將一張 PNG 或 JPG 圖片上傳至 bucket。
注意:
您需要將一張 JPG 或 PNG 圖片上傳至 bucket,才能確認縮圖已建立 (成功建立函式後)。您可以使用任何 JPG 或 PNG 圖片,或是使用這張圖片:https://storage.googleapis.com/cloud-training/arc101/travel.jpg
。請將圖片下載至您的機器,然後將檔案上傳至您的 bucket。
- 請稍後片刻,接著點選「bucket 詳細資料」頁面中的「重新整理」按鈕,,您應該就會看見縮圖圖片。
上傳圖片檔後,就能點選下方來確認進度,不需等到縮圖建立完成。
注意:如果已順利部署函式,但 bucket 中仍未出現縮圖圖片,可以檢查「觸發條件」分頁,確認是否顯示您先前提供的函式觸發條件資訊。如果先前曾出現錯誤,可能沒有正確儲存。
如果函式的「觸發條件」分頁沒有出現 Cloud Storage 觸發條件,您可以參閱「建立服務的觸發條件」說明文件頁面,重新建立觸發條件,再重新上傳新檔案來測試。新增檔案後,別忘了重新整理頁面。
點選「Check my progress」,確認目標已達成。
確認 Cloud Run 函式是否成功建立縮圖
恭喜!
恭喜!在本實驗室中,您已成功建立 bucket、Pub/Sub 主題和 Cloud Run 函式,並使用新增至 bucket 的圖片建立縮圖。

取得下一枚技能徽章
這個自學實驗室是「在 Google Cloud 儲存、處理與管理資料 - 控制台」課程的一部分。完成這門課程後,您可獲得上述徽章以表彰成就。您可以在履歷表和社群平台張貼徽章,並加上 #GoogleCloudBadge 公開這項成就。
Google Cloud 教育訓練與認證
協助您瞭解如何充分運用 Google Cloud 的技術。我們的課程會介紹專業技能和最佳做法,讓您可以快速掌握要領並持續進修。我們提供從基本到進階等級的訓練課程,並有隨選、線上和虛擬課程等選項,方便您抽空參加。認證可協助您驗證及證明自己在 Google Cloud 技術方面的技能和專業知識。
使用手冊上次更新日期:2025 年 4 月 4 日
實驗室上次測試日期:2025 年 4 月 4 日
Copyright 2025 Google LLC 保留所有權利。Google 和 Google 標誌是 Google LLC 的商標,其他公司和產品名稱則有可能是其關聯公司的商標。