本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:使用 Amazon S3 觸發條件建立縮圖影像
在本教學課程中,您會建立並設定 Lambda 事件函數,以調整新增至 Amazon Simple Storage Service (Amazon S3) 儲存貯體的影像大小。當您將映像檔案新增至儲存貯體時,Amazon S3 會叫用您的 Lambda 事件函數。然後,函數會建立映像的縮圖版本,並將其輸出到不同 Amazon S3 儲存貯體。
請執行下列步驟以完成本教學課程:
-
建立來源和目的地 Amazon S3 儲存貯體,並上傳範例映像。
-
建立 Lambda 事件函數來調整映像大小,並將縮圖輸出至 Amazon S3 儲存貯體。
-
設定一個 Lambda 觸發條件,在物件上傳至來源儲存貯體時調用函數。
-
首先使用虛擬事件測試函數,然後透過將映像上傳到來源儲存貯體來測試函數。
透過完成這些步驟,您將了解如何使用 Lambda 對新增至 Amazon S3 儲存貯體的物件執行檔案處理任務。您可以使用 AWS Command Line Interface (AWS CLI) 或 來完成本教學課程 AWS 管理主控台。
如果您正在尋找更簡單的範例來學習如何為 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 會使用第二個儲存貯體來儲存已調整大小的縮圖。
- AWS 管理主控台
-
建立 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
-
建立 Amazon S3 儲存貯體 (AWS CLI)
-
執行下列 CLI 命令以建立來源儲存貯體。您為儲存貯體選擇的名稱必須是全域唯一的,並遵循 Amazon S3 儲存貯體命名規則。名稱只能包含小寫字母、數字、句點 (.) 和連字號 (-)。對於 region 和 LocationConstraint,請選擇最接近您地理位置的 AWS 區域。
aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \
--create-bucket-configuration LocationConstraint=us-east-1
稍後在教學課程中,您必須在與 AWS 區域 來源儲存貯體相同的 中建立 Lambda 事件函數,因此請記下您選擇的區域。
-
執行下列命令以建立目的地儲存貯體。對於儲存貯體名稱,必須使用 amzn-s3-demo-source-bucket-resized,其中 amzn-s3-demo-source-bucket 是您在步驟 1 中建立的來源儲存貯體名稱。針對 region和 LocationConstraint,選擇 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 事件函數,以測試 Lambda 事件函數。若要確認函数運作正常,來源儲存貯體需要包含測試映像。此映像可以是您選擇的任何 JPG 或 PNG 檔案。
- AWS 管理主控台
-
將測試映像上傳到來源儲存貯體 (主控台)
-
開啟 Amazon S3 主控台的儲存貯體頁面。
-
選取您在上一個步驟所建立的來源儲存貯體。
-
選擇上傳。
-
選擇新增檔案,然後使用檔案選擇器選擇您要上傳的物件。
-
選擇開啟,然後選擇上傳。
- AWS CLI
-
建立許可政策
建立 Lambda 事件函數的第一步是建立許可政策。此政策為您的函數提供存取其他 AWS 資源所需的許可。在本教學課程中,該政策為 Lambda 提供了 Amazon S3 儲存貯體的讀取和寫入許可,並允許其寫入到 Amazon CloudWatch Logs 日誌。
- AWS 管理主控台
-
建立政策 (主控台)
-
開啟 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:::*/*"
}
]
}
-
選擇下一步。
-
在政策詳細資訊下,針對政策政策名稱 ,輸入 LambdaS3Policy。
-
選擇建立政策。
- AWS CLI
-
建立政策 (AWS CLI)
-
將下面的 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:::*/*"
}
]
}
-
在儲存 JSON 政策文件的目錄中執行下列 CLI 命令。
aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json
建立執行角色
執行角色是授予 Lambda 事件函數存取 AWS 服務 和資源許可的 IAM 角色。若要為函數提供 Amazon S3 儲存貯體的讀取和寫入存取權,請連接您在上個步驟建立的許可政策。
- AWS 管理主控台
-
建立執行角色並連接許可政策 (主控台)
-
開啟 (IAM) 主控台的角色頁面。
-
選擇建立角色。
-
對於可信實體類型,選取 AWS 服務,然後針對使用案例選取 Lambda。
-
選擇下一步。
-
執行下列動作,新增您在上個步驟中建立的許可政策:
-
在政策搜尋方塊中,輸入 LambdaS3Policy。
-
在搜尋結果中,選取 LambdaS3Policy 的核取方塊。
-
選擇下一步。
-
在角色詳細資訊下,針對角色名稱,輸入 LambdaS3Role。
-
選擇建立角色。
- AWS CLI
-
建立執行角色並連接許可政策 (AWS CLI)
-
將下面的 JSON 儲存在名為 trust-policy.json 的檔案中。此信任政策允許 Lambda 透過授予服務主體呼叫 AWS Security Token Service (AWS STS) AssumeRole動作的許可來使用角色的lambda.amazonaws.com許可。
-
{
"Version":"2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
-
在儲存 JSON 信任政策文件的目錄中,執行下列 CLI 命令,建立執行角色。
aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
-
執行下列 CLI 命令,連接您在上個步驟中建立的許可政策。將政策 ARN 中的 AWS 帳戶 號碼取代為您自己的帳戶號碼。
aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy
建立事件函數部署套件
要建立函數,需建立包含函數程式碼和其相依項的部署套件。對於此 CreateThumbnail 函數,函數程式碼使用單獨的程式庫來調整映像大小。依照所選語言的指示,建立包含所需程式庫的部署套件。
- Node.js
-
建立部署套件 (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 檔案的根目錄。
- Python
-
建立部署套件 (Python)
-
將程式碼範例儲存為名為 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))
-
在建立 lambda_function.py 檔案的同一個目錄中,建立名為 package 的新目錄並安裝 Pillow (PIL) 程式庫和 適用於 Python (Boto3) 的 AWS SDK。雖然 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 執行環境中運作,無論本機建置機器的作業系統和架構為何。
-
建立一個包含應用程式碼以及 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 虛擬環境建立部署套件。請參閱 使用 Python Lambda 事件函數的 .zip 檔案封存
建立 Lambda 事件函數
您可以使用 AWS CLI 或 Lambda 主控台建立 Lambda 事件函數。依照所選語言的指示建立函數。
- AWS 管理主控台
-
建立事件函數 (主控台)
若要使用主控台建立 Lambda 事件函數,請先建立包含一些「Hello world」程式碼的基本函數。然後,透過上傳您在上一個步驟中建立的 .zip 或 JAR 檔案,將此程式碼取代為您自己的函數程式碼。
-
開啟 Lambda 主控台的事件函數頁面。
-
請確定您使用 AWS 區域 與建立 Amazon S3 儲存貯體相同的 。可使用螢幕頂端的下拉式清單來變更區域。
-
選擇建立事件函數。
-
選擇 Author from scratch (從頭開始撰寫)。
-
在基本資訊下,請執行下列動作:
-
針對函數名稱,請輸入 CreateThumbnail。
-
對於執行時期,請根據您為函數選擇的語言,選擇 Node.js 22.x 或 Python 3.12。
-
對於 Architecture (架構),選擇 x86_64。
-
在變更預設執行角色索引標籤中,執行下列操作:
-
展開索引標籤,然後選擇使用現有角色。
-
選擇您之前建立的 LambdaS3Role。
-
選擇建立事件函數。
上傳事件函數程式碼 (主控台)
-
在程式碼來源窗格中選擇上傳來源。
-
選擇 .zip 檔案。
-
選擇上傳。
-
在檔案選擇器中,選取 .zip 檔案,並選擇開啟。
-
選擇儲存。
- AWS CLI
-
若要讓 Lambda 事件函數在您將映像上傳至來源儲存貯體時執行,您需要為函數設定觸發。可以使用主控台或 AWS CLI來設定 Amazon S3 觸發條件。
此程序會將 Amazon S3 儲存貯體設定為每次在儲存貯體中建立物件時即會調用您的函數。請務必僅在來源儲存貯體上進行設定。如果您的 Lambda 事件函數在叫用物件的相同儲存貯體中建立物件,則可以在迴圈中持續叫用函數。這可能會導致未預期的費用向您的 收費 AWS 帳戶。
- AWS 管理主控台
-
設定 Amazon S3 觸發條件 (主控台)
-
開啟 Lambda 主控台的事件函數頁面,然後選擇您的函數 (CreateThumbnail)。
-
選擇 Add trigger (新增觸發條件)。
-
選取 S3。
-
在儲存貯體下,選取您的來源儲存貯體。
-
在事件類型下,選取所有物件建立事件。
-
在遞迴調用下,選取核取方塊,確認您了解不建議使用相同的 Amazon S3 儲存貯體進行輸入和輸出作業。您可以閱讀無伺服器園地中 導致 Lambda 函數失控的遞迴模式,進一步了解 Lambda 中的遞迴調用模式。
-
選擇新增。
當您使用 Lambda 主控台建立觸發條件時,Lambda 會自動建立資源型政策,為您選取的服務授予調用函數的許可。
- AWS CLI
-
設定 Amazon S3 觸發條件 (AWS CLI)
-
若要讓 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 儲存貯體名稱全域唯一,但是在使用資源型政策時,最佳實務是指定儲存貯體必須屬於您的帳戶。這是因為如果您刪除儲存貯體,另一個 可以使用相同的 Amazon Resource Name (ARN) AWS 帳戶 建立儲存貯體。
-
將下面的 JSON 儲存在名為 notification.json 的檔案中。套用至來源儲存貯體時,此 JSON 會將儲存貯體設定為在每次新增物件時傳送通知至 Lambda 事件函數。將 AWS 帳戶 Lambda 事件函數 ARN AWS 區域 中的數字 和 取代為您自己的帳號和區域。
{
"LambdaFunctionConfigurations": [
{
"Id": "CreateThumbnailEventConfiguration",
"LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail",
"Events": [ "s3:ObjectCreated:Put" ]
}
]
}
-
執行下列 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 管理主控台
-
使用虛擬事件 (主控台) 測試 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"
}
}
}
]
}
-
選擇儲存。
-
在測試事件窗格中,選擇測試。
-
若要檢查您的函數已建立大小經過調整的映像版本並將其存放在目標 Amazon S3 儲存貯體中,請執行以下操作:
-
開啟 Amazon S3 主控台的儲存貯體頁面。
-
選擇目標儲存貯體,並確認在物件窗格中列出已調整大小的檔案。
- AWS CLI
-
使用虛擬事件測試 Lambda 事件函數 (AWS CLI)
-
將下面的 JSON 儲存在名為 dummyS3Event.json 的檔案中。將下列參數的值取代為您自己的值:
-
對於 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"
}
}
}
]
}
-
在您儲存 dummyS3Event.json 檔案的目錄中,透過執行下列 CLI 命令來調用函數。此命令會將 指定RequestResponse為 invocation-type 參數的值,以同步方式叫用 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 的全域命令列選項》。
-
確認函數已建立映像的縮圖版本,並將其儲存到目標 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 管理主控台
-
使用 Amazon S3 觸發條件測試 Lambda 事件函數 (主控台)
-
若要將映像上傳到 Amazon S3 儲存貯體,請執行以下操作:
-
開啟 Amazon S3 主控台的儲存貯體頁面,並選擇來源儲存貯體。
-
選擇上傳。
-
選擇新增檔案,然後使用檔案選擇器選擇您要上傳的映像檔案。映像物件可以是任何 .jpg 或 .png 檔案。
-
選擇開啟,然後選擇上傳。
-
透過執行下列操作,確認 Lambda 已在目標儲存貯體中儲存了調整大小後的映像檔案版本:
-
導覽回 Amazon S3 主控台的儲存貯體頁面,然後選擇目的地儲存貯體。
-
在物件窗格中,您現在應該會看到兩個調整大小的影像檔案,每個 Lambda 事件函數測試各一個。若要下載已調整大小的映像,請選取檔案,然後選擇下載。
- AWS CLI
-
使用 Amazon S3 觸發條件測試 Lambda 事件函數 (AWS CLI)
-
從包含要上傳之映像的目錄中,執行下列 CLI 命令。將 --bucket 參數取代為來源儲存貯體名稱。對於 --key 和 --body 參數,請使用測試映像的檔案名稱。測試映像可以是任何 .jpg 或 .png 檔案。
aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
-
確認函數已建立映像的縮圖版本,並將其儲存到目標 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 事件函數
-
開啟 Lambda 主控台的事件函數頁面。
-
選取您建立的事件函數。
-
選擇 動作、刪除。
-
在文字輸入欄位中輸入 confirm,然後選擇 Delete (刪除)。
刪除您建立的政策
-
開啟 IAM 主控台中的 Policies (政策) 頁面。
-
選取您建立的政策 (AWSLambdaS3Policy)。
-
選擇政策動作,然後刪除。
-
選擇 刪除 。
若要刪除執行角色
-
開啟 IAM 主控台中的 角色頁面 。
-
選取您建立的執行角色。
-
選擇刪除。
-
在文字輸入欄位中輸入角色的名稱,然後選擇刪除。
刪除 S3 儲存貯體
-
開啟 Amazon S3 主控台。
-
選擇您建立的儲存貯體。
-
選擇 刪除 。
-
在文字輸入欄位中輸入儲存貯體的名稱。
-
選擇刪除儲存貯體。