本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在本教學課程中,您將建立和設定 Lambda 函數,它會調整新增至 Amazon Simple Storage Service (Amazon S3) 儲存貯體的映像。當您將映像檔案新增至儲存貯體時,Amazon S3 會調用 Lambda 函數。然後,函數會建立映像的縮圖版本,並將其輸出到不同 Amazon S3 儲存貯體。

請執行下列步驟以完成本教學課程:
-
建立來源和目的地 Amazon S3 儲存貯體,並上傳範例映像。
-
建立可調整映像大小並將縮圖輸出到 Amazon S3 儲存貯體的 Lambda 函數。
-
設定一個 Lambda 觸發條件,在物件上傳至來源儲存貯體時調用函數。
-
首先使用虛擬事件測試函數,然後透過將映像上傳到來源儲存貯體來測試函數。
完成這些步驟後,將了解如何使用 Lambda 在新增至 Amazon S3 儲存貯體的物件上執行檔案處理任務。您可以使用 AWS Command Line Interface (AWS CLI) 或 來完成本教學課程 AWS Management Console。
如果您正在尋找更簡單的範例來學習如何為 Lambda 設定 Amazon S3 觸發條件,則可以嘗試教學課程:使用 Amazon S3 觸發條件調用 Lambda 函數。
主題
先決條件
如果您想要使用 AWS CLI 完成教學課程,請安裝最新版本的 AWS Command Line Interface。
對於 Lambda 函數程式碼,您可以使用 Python 或 Node.js。為您想要使用的語言安裝語言支援工具和套件管理工具。
如果您尚未安裝 AWS Command Line Interface,請依照安裝或更新最新版本 AWS CLI的步驟進行安裝。
本教學課程需使用命令列終端機或 Shell 來執行命令。在 Linux 和 macOS 中,使用您偏好的 Shell 和套件管理工具。
注意
在 Windows 中,作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 zip
)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本,請安裝適用於 Linux 的 Windows 子系統
建立兩個 Amazon S3 儲存貯體

首先建立兩個 Amazon S3 儲存貯體。第一個儲存貯體是將接收映像上傳的來源儲存貯體。當您調用函數時,Lambda 會使用第二個儲存貯體來儲存已調整大小的縮圖。
建立 Amazon S3 儲存貯體 (主控台)
-
開啟 Amazon S3 主控台
,然後選取一般用途儲存貯體頁面。 -
選取離您的地理位置 AWS 區域 最近的 。可使用螢幕頂端的下拉式清單來變更區域。在本教學課程稍後的階段,您必須在同一區域中建立 Lambda 函數。
-
選擇建立儲存貯體。
-
在 General configuration (一般組態) 下,執行下列動作:
-
對於儲存貯體類型,請確定已選取一般用途。
-
請在儲存貯體名稱輸入符合 Amazon S3 儲存貯體命名規則的全域唯一名稱。儲存貯體名稱只能包含小寫字母、數字、句點 (.) 和連字號 (-)。
-
-
其他所有選項維持設為預設值,然後選擇建立儲存貯體。
-
重複步驟 1 到 5 來建立目的地儲存貯體。對於儲存貯體名稱,輸入
,其中amzn-s3-demo-source-bucket-resized
是您剛才建立的來源儲存貯體名稱。amzn-s3-demo-source-bucket
將測試映像上傳到來源儲存貯體

稍後在教學課程中,您將使用 AWS CLI 或 Lambda 主控台叫用 Lambda 函數,以進行測試。若要確認函数運作正常,來源儲存貯體需要包含測試映像。此映像可以是您選擇的任何 JPG 或 PNG 檔案。
將測試映像上傳到來源儲存貯體 (主控台)
-
開啟 Amazon S3 主控台的儲存貯體
頁面。 -
選取您在上一個步驟所建立的來源儲存貯體。
-
選擇上傳。
-
選擇新增檔案,然後使用檔案選擇器選擇您要上傳的物件。
-
選擇開啟,然後選擇上傳。
建立許可政策

建立 Lambda 函數的第一個步驟是建立許可政策。此政策為您的函數提供存取其他 AWS 資源所需的許可。在本教學課程中,該政策為 Lambda 提供了 Amazon S3 儲存貯體的讀取和寫入許可,並允許其寫入到 Amazon CloudWatch Logs 日誌。
建立政策 (主控台)
-
開啟 AWS Identity and Access Management (IAM) 主控台的政策
頁面。 -
選擇 建立政策。
-
選擇 JSON 索引標籤,然後將下列政策貼到 JSON 編輯器。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::*/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::*/*" } ] }
-
選擇 Next (下一步)。
-
在政策詳細資訊下,針對政策政策名稱 ,輸入
。LambdaS3Policy
-
選擇 建立政策。
建立執行角色

執行角色是 IAM 角色,授予 Lambda 函數存取 AWS 服務 和資源的許可。若要為函數提供 Amazon S3 儲存貯體的讀取和寫入存取權,請連接您在上個步驟建立的許可政策。
建立執行角色並連接許可政策 (主控台)
-
開啟 (IAM) 主控台的角色
頁面。 -
選擇建立角色。
-
對於可信實體類型,選取 AWS 服務,然後針對使用案例選取 Lambda。
-
選擇 Next (下一步)。
-
執行下列動作,新增您在上個步驟中建立的許可政策:
-
在政策搜尋方塊中,輸入
。LambdaS3Policy
-
在搜尋結果中,選取
LambdaS3Policy
的核取方塊。 -
選擇 Next (下一步)。
-
-
在角色詳細資訊下,針對角色名稱,輸入
。LambdaS3Role
-
選擇建立角色。
建立函數部署套件

要建立函數,需建立包含函數程式碼和其相依項的部署套件。對於此 CreateThumbnail
函數,函數程式碼使用單獨的程式庫來調整映像大小。依照所選語言的指示,建立包含所需程式庫的部署套件。
建立部署套件 (Node.js)
-
為函數程式碼和相依項建立名為
lambda-s3
的目錄並導覽到該目錄。mkdir lambda-s3 cd lambda-s3
-
使用
npm
建立新 Node.js 專案。若要接受互動體驗中提供的預設選項,請按下Enter
。npm init
-
將以下函數程式碼儲存在名為
index.mjs
檔案中。請務必以您建立來源和目的地儲存貯體的 AWS 區域 取代us-east-1
。// dependencies import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3'; import { Readable } from 'stream'; import sharp from 'sharp'; import util from 'util'; // create S3 client const s3 = new S3Client({region:
'us-east-1'
}); // define the handler function export const handler = async (event, context) => { // Read options from the event parameter and get the source bucket console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Get the image from the source bucket. GetObjectCommand returns a stream. try { const params = { Bucket: srcBucket, Key: srcKey }; var response = await s3.send(new GetObjectCommand(params)); var stream = response.Body; // Convert stream to buffer to pass to sharp resize function. if (stream instanceof Readable) { var content_buffer = Buffer.concat(await stream.toArray()); } else { throw new Error('Unknown object stream type'); } } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the sharp module to resize the image and save in a buffer. try { var output_buffer = await sharp(content_buffer).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: output_buffer, ContentType: "image" }; const putResult = await s3.send(new PutObjectCommand(destparams)); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); }; -
在
lambda-s3
目錄中,使用 npm 安裝 Sharp 程式庫。請注意,最新的 Sharp 版本 (0.33) 與 Lambda 不相容。安裝版本 0.32.6 以完成本教學課程。npm install sharp@0.32.6
npm
install
命令為您的模組建立一個node_modules
目錄。在此步驟之後,目錄結構應如下所示。lambda-s3 |- index.mjs |- node_modules | |- base64js | |- bl | |- buffer ... |- package-lock.json |- package.json
-
建立包含函數程式碼及其相依項 .zip 部署套件。在 MacOS 或 Linux 中,執行下列命令。
zip -r function.zip .
在 Windows 中,使用您偏好的 zip 公用程式建立 .zip 檔案。請確保
index.mjs
、package.json
和package-lock.json
檔案以及node_modules
目錄全部都位於 .zip 檔案的根目錄。
建立 Lambda 函式

您可以使用 AWS CLI 或 Lambda 主控台來建立 Lambda 函數。依照所選語言的指示建立函數。
建立函數的方式 (主控台)
要使用主控台建立 Lambda 函數,首先建立包含一些 ‘Hello world’ 程式碼的基本函數。然後,透過上傳您在上一個步驟中建立的 .zip 或 JAR 檔案,將此程式碼取代為您自己的函數程式碼。
-
開啟 Lambda 主控台中的函數頁面
。 -
請確定您在 AWS 區域 建立 Amazon S3 儲存貯體的相同 中工作。可使用螢幕頂端的下拉式清單來變更區域。
-
選擇 Create function (建立函數)。
-
選擇 Author from scratch (從頭開始撰寫)。
-
在基本資訊下,請執行下列動作:
-
針對函數名稱,請輸入
。CreateThumbnail
-
對於執行時期,請根據您為函數選擇的語言,選擇 Node.js 22.x 或 Python 3.12。
-
對於 Architecture (架構),選擇 x86_64。
-
-
在變更預設執行角色索引標籤中,執行下列操作:
-
展開索引標籤,然後選擇使用現有角色。
-
選擇您之前建立的
LambdaS3Role
。
-
-
選擇 Create function (建立函數)。
上傳函數程式碼 (主控台)
-
在程式碼來源窗格中選擇上傳來源。
-
選擇 .zip 檔案。
-
選擇上傳。
-
在檔案選擇器中,選取 .zip 檔案,並選擇開啟。
-
選擇 Save (儲存)。
設定 Amazon S3 以調用函數

若要在將映像上傳至來源儲存貯體時執行 Lambda 函數,您需要設定函數的觸發條件。可以使用主控台或 AWS CLI來設定 Amazon S3 觸發條件。
重要
此程序會將 Amazon S3 儲存貯體設定為每次在儲存貯體中建立物件時即會調用您的函數。請務必僅在來源儲存貯體上進行設定。如果 Lambda 函數在進行調用的同一個儲存貯體中建立物件,則可以在一個迴圈中連續調用
設定 Amazon S3 觸發條件 (主控台)
-
開啟 Lambda 主控台的函數頁面
,然後選擇您的函數 ( CreateThumbnail
)。 -
選擇 Add trigger (新增觸發條件)。
-
選取 S3。
-
在儲存貯體下,選取您的來源儲存貯體。
-
在事件類型下,選取所有物件建立事件。
-
在遞迴調用下,選取核取方塊,確認您了解不建議使用相同的 Amazon S3 儲存貯體進行輸入和輸出作業。您可以閱讀無伺服器園地中 導致 Lambda 函數失控的遞迴模式
,進一步了解 Lambda 中的遞迴調用模式。 -
選擇新增。
當您使用 Lambda 主控台建立觸發條件時,Lambda 會自動建立資源型政策,為您選取的服務授予調用函數的許可。
使用虛擬事件來測試 Lambda 函數

在將映像檔案新增至 Amazon S3 來源儲存貯體以測試整個設定之前,可以透過使用虛擬事件調用 Lambda 函數來測試其是否正常運作。Lambda 中的事件是一種 JSON 格式的文件,它包含供函數處理的資料。Amazon S3 調用函數時,傳送至函數的事件會包含諸如儲存貯體名稱、儲存貯體 ARN 和物件金鑰等資訊。
使用虛擬事件來測試 Lambda 函數 (主控台)
-
開啟 Lambda 主控台的函數頁面
,然後選擇您的函數 ( CreateThumbnail
)。 -
選擇測試標籤。
-
若要建立測試事件,請在測試事件窗格中執行下列動作:
-
在測試事件動作下方,選取建立新事件。
-
事件名稱輸入
myTestEvent
。 -
對於範本,選取 S3 Put。
-
將下列參數的值取代為您自己的值。
-
對於
awsRegion
,us-east-1
將 取代 AWS 區域 為您在其中建立的 Amazon S3 儲存貯體。 -
對於
name
,將amzn-s3-demo-bucket
取代為 Amazon S3 來源儲存貯體的名稱。 -
對於
key
,將test%2Fkey
取代為您在步驟 將測試映像上傳到來源儲存貯體 中上傳至來源儲存貯體之測試物件的檔案名稱。
{ "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion":
"us-east-1"
, "eventTime": "1970-01-01T00:00:00.000Z", "eventName": "ObjectCreated:Put", "userIdentity": { "principalId": "EXAMPLE" }, "requestParameters": { "sourceIPAddress": "127.0.0.1" }, "responseElements": { "x-amz-request-id": "EXAMPLE123456789", "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "testConfigRule", "bucket": { "name":"amzn-s3-demo-bucket"
, "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::amzn-s3-demo-bucket" }, "object": { "key":"test%2Fkey"
, "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] } -
-
選擇 Save (儲存)。
-
-
在測試事件窗格中,選擇測試。
-
若要檢查您的函數已建立大小經過調整的映像版本並將其存放在目標 Amazon S3 儲存貯體中,請執行以下操作:
-
開啟 Amazon S3 主控台的儲存貯體
頁面。 -
選擇目標儲存貯體,並確認在物件窗格中列出已調整大小的檔案。
-
使用 Amazon S3 觸發條件測試函數

既然您已確認 Lambda 函數運作正常,便可將映像檔案新增至 Amazon S3 來源儲存貯體來測試完整的設定。將映像新增至來源儲存貯體時,應該會自動調用 Lambda 函數。函數會建立已調整大小的檔案版本,並將其存放在目標儲存貯體中。
使用 Amazon S3 觸發條件測試 Lambda 函數 (主控台)
清除您的資源
除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除不再使用 AWS 的資源,您可以避免不必要的費用 AWS 帳戶。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
confirm
,然後選擇 Delete (刪除)。
刪除您建立的政策
-
開啟 IAM 主控台中的 Policies (政策) 頁面
。 -
選取您建立的政策 (AWSLambdaS3Policy)。
-
選擇政策動作,然後刪除。
-
選擇 刪除 。
若要刪除執行角色
-
開啟 IAM 主控台中的 角色頁面
。 -
選取您建立的執行角色。
-
選擇刪除。
-
在文字輸入欄位中輸入角色的名稱,然後選擇刪除。
刪除 S3 儲存貯體
-
開啟 Amazon S3 主控台
。 -
選擇您建立的儲存貯體。
-
選擇 刪除 。
-
在文字輸入欄位中輸入儲存貯體的名稱。
-
選擇刪除儲存貯體。