教學課程:使用 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 服務 和資源。安全性最佳做法是將管理存取權指派給使用者,並僅使用 root 使用者來執行需要 root 使用者存取權的工作。

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

註冊後,請保護您的 AWS 帳戶 AWS 帳戶根使用者 AWS IAM Identity Center、啟用和建立系統管理使用者,這樣您就不會將 root 使用者用於日常工作。

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

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

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

    如需指示,請參閱《IAM 使用者指南》的為 AWS 帳戶 根使用者啟用虛擬 MFA 裝置 (主控台)

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

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

  2. 在 IAM 身分中心中,將管理存取權授予使用者。

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

以具有管理權限的使用者身分登入
指派存取權給其他使用者
  1. 在 IAM 身分中心中,建立遵循套用最低權限許可的最佳做法的權限集。

    如需指示,請參閱《AWS IAM Identity Center 使用指南》中的「建立權限集」。

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

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

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

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

建立兩個 Amazon S3 儲存貯體

教學課程工作流程圖顯示您正在進行建立儲存貯體的 Amazon S3 儲存貯體步驟

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

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

  2. 選擇 建立儲存貯體

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

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

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

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

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

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

    aws s3api create-bucket --bucket DOC-EXAMPLE-SOURCE-BUCKET --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

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

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

    aws s3api create-bucket --bucket DOC-EXAMPLE-SOURCE-BUCKET-resized --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

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

教學課程工作流程圖顯示您正在進行上傳測試物件的 Amazon S3 儲存貯體步驟

稍後在教學課程中,您將使用 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 DOC-EXAMPLE-SOURCE-BUCKET --key HappyFace.jpg --body ./HappyFace.jpg

建立許可政策

教學課程工作流程圖顯示您正處於建立許可政策的 Lambda 函數步驟中

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

AWS Management Console
建立政策 (主控台)
  1. 開啟 AWS Identity and Access Management (IAM) 主控台的「政策」頁面。

  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

建立執行角色

教學課程工作流程圖顯示您正處於建立執行角色的 Lambda 函數步驟中

執行角色是一種 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 使用角色的權限,方法是lambda.amazonaws.com授予服務主體呼叫 AWS Security Token Service (AWS STS) AssumeRole 動作的權限。

    { "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

建立函數部署套件

教學課程工作流程圖顯示您正處於建立部署套件的 Lambda 函數步驟中

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

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

    mkdir lambda-s3 cd lambda-s3
  2. 將以下函數程式碼儲存在名為 index.mjs 檔案中。請務必使'us-west-2'用您建立自己的來源和目的地值區的 AWS 區域 位置來取代。

    // 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-west-2'}); // 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); };
  3. 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
  4. 建立包含函數程式碼及其相依項 .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.9 \ --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 函式

教學課程工作流程圖顯示您正在進行建立函數的 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 18.xPython 3.9

    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-west-2 取代為您建立 Amazon S3 儲存貯體所在的區域。

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

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

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

設定 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:::DOC-EXAMPLE-SOURCE-BUCKET \ --source-account 123456789012

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

    注意

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

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

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

    aws s3api put-bucket-notification-configuration --bucket DOC-EXAMPLE-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,請 AWS 區域 以您在中建立的 Amazon S3 儲存貯體取us-east-1代。

      • 對於 name,將 DOC-EXAMPLE-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": "DOC-EXAMPLE-BUCKET", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::DOC-EXAMPLE-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 的檔案中。將下列參數的值取代為您自己的值:

    1. 對於awsRegion,請 AWS 區域 以您在中建立的 Amazon S3 儲存貯體取us-west-2代。

    2. 對於 name,將 DOC-EXAMPLE-SOURCE-BUCKET 取代為 Amazon S3 來源儲存貯體的名稱。

    3. 對於 key,將 HappyFace.jpg 取代為您在步驟 將測試映像上傳到來源儲存貯體 中上傳至來源儲存貯體之測試物件的檔案名稱。

    { "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"DOC-EXAMPLE-SOURCE-BUCKET", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::DOC-EXAMPLE-SOURCE-BUCKET" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  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

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

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

    aws s3api list-objects-v2 --bucket DOC-EXAMPLE-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 觸發條件測試函數

教學課程工作流程圖顯示您正處於透過上傳檔案到 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 DOC-EXAMPLE-SOURCE-BUCKET --key SmileyFace.jpg --body ./SmileyFace.jpg
  2. 確認函數已建立映像的縮圖版本,並將其儲存到目標 Amazon S3 儲存貯體。執行以下 CLI 命令,將 DOC-EXAMPLE-SOURCE-BUCKET-resized 取代為您自己的目的地儲存貯體的名稱。

    aws s3api list-objects-v2 --bucket DOC-EXAMPLE-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,然後選擇 Delete (刪除)。

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

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

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

  4. 選擇 刪除

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

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

  3. 選擇 刪除

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

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

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

  3. 選擇 刪除

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

  5. 選擇 刪除儲存貯體