教學課程:使用 Amazon S3 觸發條件建立縮圖影像 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

教學課程:使用 Amazon S3 觸發條件建立縮圖影像

在本教學課程中,您將建立和設定 Lambda 函數,它會調整新增至 Amazon Simple Storage Service (Amazon S3) 儲存貯體的映像。當您將映像檔案新增至儲存貯體時,Amazon S3 會調用 Lambda 函數。然後,函數會建立映像的縮圖版本,並將其輸出到不同 Amazon S3 儲存貯體。

Amazon S3 儲存貯體、Lambda 函數和其他 Amazon S3 儲存貯體之間的資料流

請執行下列步驟以完成本教學課程:

  1. 建立來源和目的地 Amazon S3 儲存貯體,並上傳範例映像。

  2. 建立可調整映像大小並將縮圖輸出到 Amazon S3 儲存貯體的 Lambda 函數。

  3. 設定一個 Lambda 觸發條件,在物件上傳至來源儲存貯體時調用函數。

  4. 首先使用虛擬事件測試函數,然後透過將映像上傳到來源儲存貯體來測試函數。

完成這些步驟後,將了解如何使用 Lambda 在新增至 Amazon S3 儲存貯體的物件上執行檔案處理任務。您可以使用 AWS Command Line Interface 或 AWS CLI (AWS Management Console) 來完成本教學課程。

如果您正在尋找更簡單的範例來學習如何為 Lambda 設定 Amazon S3 觸發條件,則可以嘗試教學課程:使用 Amazon S3 觸發條件調用 Lambda 函數

必要條件

如果您還沒有 AWS 帳戶,請完成以下步驟建立新帳戶。

註冊 AWS 帳戶
  1. 開啟 https://portal.aws.amazon.com/billing/signup

  2. 請遵循線上指示進行。

    部分註冊程序需接收來電,並在電話鍵盤輸入驗證碼。

    註冊 AWS 帳戶 時,會同時建立 AWS 帳戶根使用者。根使用者有權存取該帳戶中的所有 AWS 服務 和資源。作為安全最佳實務,請將管理存取權指派給使用者,並且僅使用根使用者來執行需要根使用者存取權的任務

註冊程序完成後,AWS 會傳送一封確認電子郵件給您。您可以隨時登錄 https://aws.amazon.com/ 並選擇我的帳戶,以檢視您目前的帳戶活動並管理帳戶。

當您註冊 AWS 帳戶 之後,請保護您的 AWS 帳戶根使用者,啟用 AWS IAM Identity Center,並建立管理使用者,讓您可以不使用根使用者處理日常作業。

保護您的 AWS 帳戶根使用者
  1. 選擇根使用者並輸入您的 AWS 帳戶電子郵件地址,以帳戶擁有者身分登入 AWS Management Console。在下一頁中,輸入您的密碼。

    如需使用根使用者登入的說明,請參閱 AWS 登入 使用者指南中的以根使用者身分登入

  2. 若要在您的根使用者帳戶上啟用多重要素驗證 (MFA)。

    如需指示,請參閱《IAM 使用者指南》中的 Enable a virtual MFA device for your AWS 帳戶 root user (console) 一節。

建立具有管理存取權的使用者
  1. 啟用 IAM Identity Center。

    如需指示,請參閱 AWS IAM Identity Center 使用者指南中的啟用 AWS IAM Identity Center

  2. 在 IAM Identity Center 中,將管理存取權授予使用者。

    若要取得有關使用 IAM Identity Center 目錄 做為身分識別來源的教學課程,請參閱《使用 AWS IAM Identity Center 使用者指南中的以預設 IAM Identity Center 目錄 設定使用者存取權限

以具有管理存取權的使用者身分登入
  • 若要使用您的 IAM Identity Center 使用者簽署,請使用建立 IAM Identity Center 使用者時傳送至您電子郵件地址的簽署 URL。

    如需有關如何使用 IAM Identity Center 使用者登入的說明,請參閱《AWS 登入 使用者指南》中的 Signing in to the AWS access portal 一節。

指派存取權給其他使用者
  1. 在 IAM Identity Center 中,建立一個許可集來遵循套用最低權限的最佳實務。

    如需指示,請參閱《AWS IAM Identity Center 使用者指南》中的建立許可集

  2. 將使用者指派至群組,然後對該群組指派單一登入存取權。

    如需指示,請參閱《AWS IAM Identity Center 使用者指南》中的新增群組

如果想使用 AWS CLI 來完成教學課程,則請安裝最新版本的 AWS Command Line Interface

對於 Lambda 函數程式碼,您可以使用 Python 或 Node.js。為您想要使用的語言安裝語言支援工具和套件管理工具。

建立兩個 Amazon S3 儲存貯體

第一步:建立 S3 儲存貯體

首先建立兩個 Amazon S3 儲存貯體。第一個儲存貯體是將接收映像上傳的來源儲存貯體。當您調用函數時,Lambda 會使用第二個儲存貯體來儲存已調整大小的縮圖。

AWS Management Console
建立 Amazon S3 儲存貯體 (主控台)
  1. 開啟 Amazon S3 主控台的儲存貯體頁面。

  2. 選擇建立儲存貯體

  3. General configuration (一般組態) 下,執行下列動作:

    1. 請在儲存貯體名稱輸入符合 Amazon S3 儲存貯體命名規則的全域唯一名稱。儲存貯體名稱只能包含小寫字母、數字、句點 (.) 和連字號 (-)。

    2. 對於 AWS 區域,請選擇最接近您地理位置的 AWS 區域。在本教學課程稍後的階段,您必須在同一 AWS 區域 中建立 Lambda 函數,因此請記下您所選的區域。

  4. 其他所有選項維持設為預設值,然後選擇建立儲存貯體

  5. 重複步驟 1 到 4 以建立目的地儲存貯體。對於儲存貯體名稱,輸入 amzn-s3-demo-source-bucket-resized,其中 amzn-s3-demo-source-bucket 是您剛才建立的來源儲存貯體名稱。

AWS CLI
建立 Amazon S3 儲存貯體 (AWS CLI)
  1. 執行下列 CLI 命令以建立來源儲存貯體。您為儲存貯體選擇的名稱必須是全域唯一的,並遵循 Amazon S3 儲存貯體命名規則。名稱只能包含小寫字母、數字、句點 (.) 和連字號 (-)。對於 regionLocationConstraint,請選擇最接近您地理位置的 AWS 區域

    aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1

    在本教學課程稍後的階段,您必須在與來源儲存貯體相同的 AWS 區域 中建立 Lambda 函數,因此請記下您所選的區域。

  2. 執行下列命令以建立目的地儲存貯體。對於儲存貯體名稱,必須使用 amzn-s3-demo-source-bucket-resized,其中 amzn-s3-demo-source-bucket 是您在步驟 1 中建立的來源儲存貯體名稱。對於 regionLocationConstraint,請選擇用來建立來源儲存貯體的相同 AWS 區域。

    aws s3api create-bucket --bucket amzn-s3-demo-source-bucket-resized --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1

將測試映像上傳到來源儲存貯體

下一步:上傳測試物件

在本教學課程稍後的階段,您將透過使用 AWS CLI 或 Lambda 主控台調用 Lambda 函數進行測試。若要確認函数運作正常,來源儲存貯體需要包含測試映像。此映像可以是您選擇的任何 JPG 或 PNG 檔案。

AWS Management Console
將測試映像上傳到來源儲存貯體 (主控台)
  1. 開啟 Amazon S3 主控台的儲存貯體頁面。

  2. 選取您在上一個步驟所建立的來源儲存貯體。

  3. 選擇上傳

  4. 選擇新增檔案,然後使用檔案選擇器選擇您要上傳的物件。

  5. 選擇開啟,然後選擇上傳

AWS CLI
將測試映像上傳到來源儲存貯體 (AWS CLI)
  • 從包含要上傳之映像的目錄中,執行下列 CLI 命令。將 --bucket 參數取代為來源儲存貯體名稱。對於 --key--body 參數,請使用測試映像的檔案名稱。

    aws s3api put-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --body ./HappyFace.jpg

建立許可政策

下一步:建立許可政策

建立 Lambda 函數的第一個步驟是建立許可政策。此政策為您的函數提供存取其他 AWS 資源所需的許可。在本教學課程中,該政策為 Lambda 提供了 Amazon S3 儲存貯體的讀取和寫入許可,並允許其寫入到 Amazon CloudWatch Logs 日誌。

AWS Management Console
建立政策 (主控台)
  1. 在 AWS Identity and Access Management IAM 主控台開啟 Policies (政策) 頁面

  2. 選擇建立政策

  3. 選擇 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:::*/*" } ] }
  4. 選擇下一步

  5. 政策詳細資訊下,針對政策政策名稱 ,輸入 LambdaS3Policy

  6. 選擇建立政策

AWS CLI
建立政策 (AWS CLI)
  1. 將下面的 JSON 儲存在名為 policy.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:::*/*" } ] }
  2. 在儲存 JSON 政策文件的目錄中執行下列 CLI 命令。

    aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json

建立執行角色

下一步:建立執行角色

執行角色是 IAM 角色,其授予 Lambda 函數存取 AWS 服務 和資源的許可。若要為函數提供 Amazon S3 儲存貯體的讀取和寫入存取權,請連接您在上個步驟建立的許可政策。

AWS Management Console
建立執行角色並連接許可政策 (主控台)
  1. 開啟 (IAM) 主控台的角色頁面。

  2. 選擇建立角色

  3. 對於可信實體類型,選取 AWS 服務,然後針對使用案例選取 Lambda

  4. 選擇下一步

  5. 執行下列動作,新增您在上個步驟中建立的許可政策:

    1. 在政策搜尋方塊中,輸入 LambdaS3Policy

    2. 在搜尋結果中,選取 LambdaS3Policy 的核取方塊。

    3. 選擇下一步

  6. 角色詳細資訊下,針對角色名稱,輸入 LambdaS3Role

  7. 選擇建立角色

AWS CLI
建立執行角色並連接許可政策 (AWS CLI)
  1. 將下面的 JSON 儲存在名為 trust-policy.json 的檔案中。此信任政策會授予服務主體 lambda.amazonaws.com 呼叫 AWS Security Token Service (AWS STS) AssumeRole 動作的許可,以便 Lambda 能使用角色的許可。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 在儲存 JSON 信任政策文件的目錄中,執行下列 CLI 命令,建立執行角色。

    aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
  3. 執行下列 CLI 命令,連接您在上個步驟中建立的許可政策。將政策 ARN 中的 AWS 帳戶 號碼取代為您自己的帳號。

    aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy

建立函數部署套件

下一步:建立部署套件

要建立函數,需建立包含函數程式碼和其相依項的部署套件。對於此 CreateThumbnail 函數,函數程式碼使用單獨的程式庫來調整映像大小。依照所選語言的指示,建立包含所需程式庫的部署套件。

Node.js
建立部署套件 (Node.js)
  1. 為函數程式碼和相依項建立名為 lambda-s3 的目錄並導覽到該目錄。

    mkdir lambda-s3 cd lambda-s3
  2. 使用 npm 建立新 Node.js 專案。若要接受互動體驗中提供的預設選項,請按下 Enter

    npm init
  3. 將以下函數程式碼儲存在名為 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); };
  4. 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
  5. 建立包含函數程式碼及其相依項 .zip 部署套件。在 MacOS 或 Linux 中,執行下列命令。

    zip -r function.zip .

    在 Windows 中,使用您偏好的 zip 公用程式建立 .zip 檔案。請確保 index.mjspackage.jsonpackage-lock.json 檔案以及 node_modules 目錄全部都位於 .zip 檔案的根目錄。

Python
建立部署套件 (Python)
  1. 將程式碼範例儲存為名為 lambda_function.py 的檔案。

    import boto3 import os import sys import uuid from urllib.parse import unquote_plus from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def lambda_handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) upload_path = '/tmp/resized-{}'.format(tmpkey) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
  2. 在建立 lambda_function.py 檔案的同一個目錄中,建立名為 package 的新目錄並安裝 Pillow (PIL) 程式庫和 AWS SDK for Python (Boto3)。雖然 Lambda Python 執行期包含 Boto3 SDK 的版本,但建議您將函數的所有相依項新增至部署套件,即使其包含在執行期中。如需詳細資訊,請參閱 Python 中的執行期相依項

    mkdir package pip install \ --platform manylinux2014_x86_64 \ --target=package \ --implementation cp \ --python-version 3.12 \ --only-binary=:all: --upgrade \ pillow boto3

    Pillow 程式庫中包含 C/C ++ 程式碼。使用 --platform manylinux_2014_x86_64 和 --only-binary=:all: 選項,pip 便會下載並安裝適用的 Pillow 版本,其中包含與 Amazon Linux 2 作業系統相容的預先編譯二進位檔。這可確保無論本機建置機器的作業系統和架構為何,您的部署套件都能在 Lambda 執行環境中運作。

  3. 建立一個包含應用程式碼以及 Pillow 和 Boto3 程式庫的 .zip 檔案。在 Linux 或 MacOS 中,使用命令列界面執行下列命令。

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    在 Windows 中,使用您偏好的 zip 工具建立 lambda_function.zip 檔案。確保包含相依項的 lambda_function.py 檔案和資料夾全部都在 .zip 檔案的根目錄中。

您也可以使用 Python 虛擬環境建立部署套件。請參閱 使用 .zip 封存檔部署 Python Lambda 函數

建立 Lambda 函式

下一步:建立函數

使用 AWS CLI 或 Lambda 主控台建立 Lambda 函數。依照所選語言的指示建立函數。

AWS Management Console
建立函數的方式 (主控台)

要使用主控台建立 Lambda 函數,首先建立包含一些 ‘Hello world’ 程式碼的基本函數。然後,透過上傳您在上一個步驟中建立的 .zip 或 JAR 檔案,將此程式碼取代為您自己的函數程式碼。

  1. 開啟 Lambda 主控台中的函數頁面

  2. 請確定您在建立 Amazon S3 儲存貯體的同一個 AWS 區域 中操作。可使用螢幕頂端的下拉式清單來變更區域。

    此圖顯示 Lambda 主控台下拉式區域選單
  3. 選擇建立函數

  4. 選擇 Author from scratch (從頭開始撰寫)。

  5. 基本資訊下,請執行下列動作:

    1. 針對函數名稱,請輸入 CreateThumbnail

    2. 對於執行時期,請根據您為函數選擇的語言,選擇 Node.js 22.xPython 3.12

    3. 對於 Architecture (架構),選擇 x86_64

  6. 變更預設執行角色索引標籤中,執行下列操作:

    1. 展開索引標籤,然後選擇使用現有角色

    2. 選擇您之前建立的 LambdaS3Role

  7. 選擇建立函數

上傳函數程式碼 (主控台)
  1. 程式碼來源窗格中選擇上傳來源

  2. 選擇 .zip 檔案

  3. 選擇上傳

  4. 在檔案選擇器中,選取 .zip 檔案,並選擇開啟

  5. 選擇儲存

AWS CLI
建立函數 (AWS CLI)
  • 執行所選語言的 CLI 命令。對於 role 參數,確保將 123456789012 取代為您自己的 AWS 帳戶 ID。對於 region 參數,將 us-east-1 取代為您建立 Amazon S3 儲存貯體所在的區域。

    • 對於 Node.js,請從包含 function.zip 檔案的目錄中執行下列命令。

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs22.x \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    • 對於 Python,請從包含 lambda_function.zip 檔案的目錄中執行下列命令。

      aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \ --runtime python3.13 --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1

設定 Amazon S3 以調用函數

下一步:建立 Amazon S3 觸發條件

若要在將映像上傳至來源儲存貯體時執行 Lambda 函數,您需要設定函數的觸發條件。可以使用主控台或 AWS CLI 來設定 Amazon S3 觸發條件。

重要

此程序會將 Amazon S3 儲存貯體設定為每次在儲存貯體中建立物件時即會調用您的函數。請務必僅在來源儲存貯體上進行設定。如果 Lambda 函數在進行調用的同一個儲存貯體中建立物件,則可以在一個迴圈中連續調用函數。這可能會導致意外費用計入您的 AWS 帳戶。

AWS Management Console
設定 Amazon S3 觸發條件 (主控台)
  1. 開啟 Lambda 主控台的函數頁面,然後選擇您的函數 (CreateThumbnail)。

  2. 選擇 Add trigger (新增觸發條件)

  3. 選取 S3

  4. 儲存貯體下,選取您的來源儲存貯體。

  5. 事件類型下,選取所有物件建立事件

  6. 遞迴調用下,選取核取方塊,確認您了解不建議使用相同的 Amazon S3 儲存貯體進行輸入和輸出作業。您可以閱讀無伺服器園地中 導致 Lambda 函數失控的遞迴模式,進一步了解 Lambda 中的遞迴調用模式。

  7. 選擇新增

    當您使用 Lambda 主控台建立觸發條件時,Lambda 會自動建立資源型政策,為您選取的服務授予調用函數的許可。

AWS CLI
設定 Amazon S3 觸發條件 (AWS CLI)
  1. 若要讓 Amazon S3 來源儲存貯體在新增映像檔案時調用函數,您首先需要使用資源型政策為函數設定許可。資源型政策聲明提供了調用函數的其他 AWS 服務 許可。若要授予 Amazon S3 調用函數的許可,請執行下列 CLI 命令。請務必使用您自己的 AWS 帳戶 ID 取代 source-account 參數,並使用您自己的來源儲存貯體名稱。

    aws lambda add-permission --function-name CreateThumbnail \ --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::amzn-s3-demo-source-bucket \ --source-account 123456789012

    使用此命令定義的政策允許 Amazon S3 僅在來源儲存貯體上發生動作時調用函數。

    注意

    雖然 Amazon S3 儲存貯體名稱全域唯一,但是在使用資源型政策時,最佳實務是指定儲存貯體必須屬於您的帳戶。這是因為如果您刪除某個儲存貯體,則另一個 AWS 帳戶 可以使用相同的 Amazon Resource Name (ARN) 建立儲存貯體。

  2. 將下面的 JSON 儲存在名為 notification.json 的檔案中。套用至來源儲存貯體時,此 JSON 會設定儲存貯體,以便在每次新增新物件時傳送通知至 Lambda 函數。將 Lambda 函數 ARN 中的 AWS 帳戶 編號和 AWS 區域 取代為您自己的帳戶編號和區域。

    { "LambdaFunctionConfigurations": [ { "Id": "CreateThumbnailEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail", "Events": [ "s3:ObjectCreated:Put" ] } ] }
  3. 執行下列 CLI 命令,將您建立的 JSON 檔案中的通知設定套用至來源儲存貯體。用您自己的來源儲存貯體名稱取代 amzn-s3-demo-source-bucket

    aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-source-bucket \ --notification-configuration file://notification.json

    若要深入了解 put-bucket-notification-configuration 命令和 notification-configuration 選項,請參閱 AWS CLI 命令參考中的 put-bucket-notification-configuration

使用虛擬事件來測試 Lambda 函數

下一步:建立虛擬事件

在將映像檔案新增至 Amazon S3 來源儲存貯體以測試整個設定之前,可以透過使用虛擬事件調用 Lambda 函數來測試其是否正常運作。Lambda 中的事件是一種 JSON 格式的文件,它包含供函數處理的資料。Amazon S3 調用函數時,傳送至函數的事件會包含諸如儲存貯體名稱、儲存貯體 ARN 和物件金鑰等資訊。

AWS Management Console
使用虛擬事件來測試 Lambda 函數 (主控台)
  1. 開啟 Lambda 主控台的函數頁面,然後選擇您的函數 (CreateThumbnail)。

  2. 選擇測試標籤。

  3. 若要建立測試事件,請在測試事件窗格中執行下列動作:

    1. 測試事件動作下方,選取建立新事件

    2. 事件名稱輸入 myTestEvent

    3. 對於範本,選取 S3 Put

    4. 將下列參數的值取代為您自己的值。

      • 對於 awsRegion,將 us-east-1 取代為您建立 Amazon S3 儲存貯體所在的 AWS 區域。

      • 對於 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" } } } ] }
    5. 選擇儲存

  4. 測試事件窗格中,選擇測試

  5. 若要檢查您的函數已建立大小經過調整的映像版本並將其存放在目標 Amazon S3 儲存貯體中,請執行以下操作:

    1. 開啟 Amazon S3 主控台的儲存貯體頁面。

    2. 選擇目標儲存貯體,並確認在物件窗格中列出已調整大小的檔案。

AWS CLI
使用虛擬事件來測試 Lambda 函數 (AWS CLI)
  1. 將下面的 JSON 儲存在名為 dummyS3Event.json 的檔案中。將下列參數的值取代為您自己的值:

    • 對於 awsRegion,將 us-east-1 取代為您建立 Amazon S3 儲存貯體所在的 AWS 區域。

    • 對於 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" } } } ] }
  2. 在您儲存 dummyS3Event.json 檔案的目錄中,透過執行下列 CLI 命令來調用函數。此命令透過將 RequestResponse 指定為調用類型參數的值來同步調用 Lambda 函數。若要進一步了解同步和非同步調用,請參閱調用 Lambda 函數

    aws lambda invoke --function-name CreateThumbnail \ --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \ --payload file://dummyS3Event.json outputfile.txt

    如果使用的是 AWS CLI 版本 2,則需要 cli-binary-format 選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。如需詳細資訊,請參閱《支援 AWS CLI 的全域命令列選項》。

  3. 確認函數已建立映像的縮圖版本,並將其儲存到目標 Amazon S3 儲存貯體。執行以下 CLI 命令,將 amzn-s3-demo-source-bucket-resized 取代為您自己的目的地儲存貯體的名稱。

    aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized

    您應該會看到類似下列的輸出。Key 參數會顯示調整大小後的映像檔案名稱。

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-06T21:40:07+00:00", "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"", "Size": 2633, "StorageClass": "STANDARD" } ] }

使用 Amazon S3 觸發條件測試函數

下一步:測試函數

既然您已確認 Lambda 函數運作正常,便可將映像檔案新增至 Amazon S3 來源儲存貯體來測試完整的設定。將映像新增至來源儲存貯體時,應該會自動調用 Lambda 函數。函數會建立已調整大小的檔案版本,並將其存放在目標儲存貯體中。

AWS Management Console
使用 Amazon S3 觸發條件測試 Lambda 函數 (主控台)
  1. 若要將映像上傳到 Amazon S3 儲存貯體,請執行以下操作:

    1. 開啟 Amazon S3 主控台的儲存貯體頁面,並選擇來源儲存貯體。

    2. 選擇上傳

    3. 選擇新增檔案,然後使用檔案選擇器選擇您要上傳的映像檔案。映像物件可以是任何 .jpg 或 .png 檔案。

    4. 選擇開啟,然後選擇上傳

  2. 透過執行下列操作,確認 Lambda 已在目標儲存貯體中儲存了調整大小後的映像檔案版本:

    1. 導覽回 Amazon S3 主控台的儲存貯體頁面,然後選擇目的地儲存貯體。

    2. 物件窗格中,現在應該會看到兩個已調整大小的映像檔案,分別來自 Lambda 函數的每個測試。若要下載已調整大小的映像,請選取檔案,然後選擇下載

AWS CLI
使用 Amazon S3 觸發條件測試 Lambda 函數 (AWS CLI)
  1. 從包含要上傳之映像的目錄中,執行下列 CLI 命令。將 --bucket 參數取代為來源儲存貯體名稱。對於 --key--body 參數,請使用測試映像的檔案名稱。測試映像可以是任何 .jpg 或 .png 檔案。

    aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
  2. 確認函數已建立映像的縮圖版本,並將其儲存到目標 Amazon S3 儲存貯體。執行以下 CLI 命令,將 amzn-s3-demo-source-bucket-resized 取代為您自己的目的地儲存貯體的名稱。

    aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized

    如果函數成功運作,則您會看到類似以下內容的輸出。您的目標儲存貯體現在應包含兩個已調整大小的檔案。

    { "Contents": [ { "Key": "resized-HappyFace.jpg", "LastModified": "2023-06-07T00:15:50+00:00", "ETag": "\"7781a43e765a8301713f533d70968a1e\"", "Size": 2763, "StorageClass": "STANDARD" }, { "Key": "resized-SmileyFace.jpg", "LastModified": "2023-06-07T00:13:18+00:00", "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"", "Size": 1245, "StorageClass": "STANDARD" } ] }

清除您的資源

除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除您不再使用的 AWS 資源,可為 AWS 帳戶 避免不必要的費用。

若要刪除 Lambda 函數
  1. 開啟 Lambda 主控台中的函數頁面

  2. 選擇您建立的函數。

  3. 選擇 Actions (動作)、Delete (刪除)。

  4. 在文字輸入欄位中輸入 delete,然後選擇刪除

刪除您建立的政策
  1. 開啟 IAM 主控台中的 Policies (政策) 頁面

  2. 選取您建立的政策 (AWSLambdaS3Policy)。

  3. 選擇政策動作,然後刪除

  4. 選擇刪除

若要刪除執行角色
  1. 開啟 IAM 主控台中的角色頁面

  2. 選取您建立的執行角色。

  3. 選擇刪除

  4. 在文字輸入欄位中輸入角色的名稱,然後選擇刪除

刪除 S3 儲存貯體
  1. 開啟 Amazon S3 主控台

  2. 選擇您建立的儲存貯體。

  3. 選擇刪除

  4. 在文字輸入欄位中輸入儲存貯體的名稱。

  5. 選擇刪除儲存貯體