教學課程:使用 Amazon S3 觸發條件叫用 Lambda 函數 - AWS Lambda

教學課程:使用 Amazon S3 觸發條件叫用 Lambda 函數

在本教學課程中,您將使用主控台建立 Lambda 函數,並設定 Amazon Simple Storage Service (Amazon S3) 的觸發條件。每次物件新增至 Amazon S3 儲存貯體時,觸發條件都會叫用您的函數。

建議您先完成以主控台為基礎的教學課程,然後再嘗試建立縮圖映像的教學課程

Prerequisites

若要使用 Lambda 及其他 AWS 服務,您需要 AWS 帳戶。如果您沒有帳戶,請造訪 aws.amazon.com,並選擇 Create an AWS Account (建立 AWS 帳戶)。如需說明,請參閱如何建立和啟用新的 AWS 帳戶?

此教學課程假設您具備基本的 Lambda 操作知識並了解 Lambda 主控台。若您尚未了解,請遵循 開始使用 Lambda 中的指示,建立您的第一個 Lambda 函數。

建立儲存貯體並上傳範例物件

建立一個 Amazon S3 儲存貯體並將測試文件上傳至您的新儲存貯體。當您從主控台測試函數時,您的 Lambda 函數會擷取有關此檔案的資訊。

使用主控台建立 Amazon S3 儲存貯體

  1. 開啟 Amazon S3 主控台

  2. 選擇 Create bucket (建立儲存貯體)。

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

    1. 對於 Bucket name (儲存貯體名稱),輸入一個唯一名稱。

    2. 對於 AWS Region (區域),選擇一個區域。請注意,您必須在同一區域中建立 Lambda 函數。

  4. 選擇 Create bucket (建立儲存貯體)。

建立儲存貯體後,Amazon S3 會開啟 Buckets (儲存貯體) 頁面,此頁面會顯示目前區域中帳戶中所有儲存貯體的清單。

使用 Amazon S3 主控台上傳測試物件

  1. 在 Amazon S3 主控台的 Buckets (儲存貯體) 頁面上,選擇您建立的儲存貯體名稱。

  2. Objects (物件)標籤上,選擇 Upload (上傳)

  3. 將測試檔案從本機電腦拖曳至 Upload (上傳) 頁面。

  4. 選擇 Upload (上傳)。

建立 Lambda 函數

使用 function blueprint (函數藍圖) 建立 Lambda 函數。藍圖會提供示範如何搭配其他 AWS 服務使用 Lambda 的範例函數。此外,藍圖包含特定執行時間的範例程式碼和函數組態預設集。在本教學課程中,您可以選擇 Node.js 或 Python 執行時間的藍圖。

從主控台中的藍圖建立 Lambda 函數

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

  2. 選擇 Create function (建立函數)。

  3. Create function (建立函數) 頁面上,選擇 Use a blueprint (使用藍圖)

  4. Blueprints (藍圖) 下,在搜尋方塊中輸入 s3

  5. 在搜尋結果中,執行下列任一項動作:

    • 針對 Node.js 函數,請選擇 s3-get-object

    • 針對 Python 函數,請選擇 s3-get-object-python

  6. 請選擇 Configure (設定)。

  7. Basic information (基本資訊) 下,請執行下列動作:

    1. 針對 Function name (函數名稱),請輸入 my-s3-function

    2. 針對 Execution role (執行角色),選擇從 AWS 政策範本建立新角色

    3. 針對 Role name (角色名稱),請輸入 my-s3-function-role

  8. S3 trigger (S3 觸發條件) 下,選擇您先前建立的 S3 儲存貯體。

    當您使用 Lambda 主控台設定 S3 觸發條件時,主控台會修改函數的資源型政策,以允許 Amazon S3 叫用函數。

  9. 選擇 Create function (建立函數)。

檢閱函數程式碼

Lambda 函數會從收到的事件參數擷取來源 S3 儲存貯體名稱和上傳物件的金鑰名稱。該函數會使用 Amazon S3 getObject API 來擷取物件的內容類型。

Lambda 主控台中查看您的函數時,您可以在 Code source (程式碼來源) 下的 Code (程式碼) 標籤中查看函數程式碼。程式碼看起來如下:

Node.js

範例 index.js

console.log('Loading function'); const aws = require('aws-sdk'); const s3 = new aws.S3({ apiVersion: '2006-03-01' }); exports.handler = async (event, context) => { //console.log('Received event:', JSON.stringify(event, null, 2)); // Get the object from the event and show its content type const bucket = event.Records[0].s3.bucket.name; const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' ')); const params = { Bucket: bucket, Key: key, }; try { const { ContentType } = await s3.getObject(params).promise(); console.log('CONTENT TYPE:', ContentType); return ContentType; } catch (err) { console.log(err); const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`; console.log(message); throw new Error(message); } };
Python

範例 lambda-function.py

import json import urllib.parse import boto3 print('Loading function') s3 = boto3.client('s3') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=bucket, Key=key) print("CONTENT TYPE: " + response['ContentType']) return response['ContentType'] except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e

在主控台中測試

使用範例 Amazon S3 事件資料手動叫用 Lambda 函數。

使用主控台測試 Lambda 函數

  1. Code source (程式碼來源) 下的 Code (程式碼) 標籤中 ,選擇 Test (測試) 旁邊的箭號,然後從下拉式清單中選擇 Configure test events (設定測試事件)

  2. Configure test event (設定測試事件) 視窗中,執行以下操作:

    1. 選擇 Create new test event (建立新測試事件)

    2. 針對 Event template (事件模板),請選擇 Amazon S3 Put (s3-put)。

    3. 針對 Event name (事件名稱),輸入測試事件的名稱。例如: 。mys3testevent

    4. 在測試事件 JSON 中,將 S3 儲存貯體名稱 (example-bucket) 和物件金鑰 (test/key) 取代為儲存貯體名稱和測試檔案名稱。您的測試事件應該類似以下內容:

      { "Records": [ { "eventVersion": "2.0", "eventSource": "aws:s3", "awsRegion": "us-west-2", "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": "my-s3-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" }, "object": { "key": "HappyFace.jpg", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. 選擇 Create (建立)

  3. 若要使用測試事件叫用函數,請在 Code source (程式碼來源) 下選擇 Test (測試)

    Execution results (執行結果) 標籤會顯示回應、函數日誌和請求 ID,類似以下內容:

    Response "image/jpeg" Function Logs START RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Version: $LATEST 2021-02-18T21:40:59.280Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO INPUT BUCKET AND KEY: { Bucket: 'my-s3-bucket', Key: 'HappyFace.jpg' } 2021-02-18T21:41:00.215Z 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 INFO CONTENT TYPE: image/jpeg END RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 REPORT RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Duration: 976.25 ms Billed Duration: 977 ms Memory Size: 128 MB Max Memory Used: 90 MB Init Duration: 430.47 ms Request ID 12b3cae7-5f4e-415e-93e6-416b8f8b66e6

使用 S3 觸發條件進行測試

當您將文件上傳至 Amazon S3 來源儲存貯體時,請叫用您的函數。

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

  1. 在 Amazon S3 主控台的 Buckets (儲存貯體) 頁面上,選擇您先前建立的來源儲存貯體名稱。

  2. Upload (上傳) 頁面上,將幾個 .jpg 或 .png 影像檔案上傳至儲存貯體。

  3. 開啟 Lambda 主控台中的 Functions (函數) 頁面

  4. 選擇函數的名稱 (my-s3-function)。

  5. 若要確認函數針對您上傳的每個檔案執行一次,請選擇 Monitor (監控) 標籤。此頁面會顯示 Lambda 傳送給 CloudWatch 之指標的圖形。Invocations (叫用)圖形中的計數應與您上傳至 Amazon S3 儲存貯體的檔案數量相符。

    如需這些圖形的詳細資訊,請參閱監控 Lambda 控制台上的函數

  6. (選用) 若要在 CloudWatch 主控台中檢視日誌,請選擇 View logs in CloudWatch (在 CloudWatch 中檢視日誌)。選擇日誌串流,以檢視其中一個函數叫用的日誌輸出。

清除您的資源

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

若要刪除 Lambda 函數

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

  2. 選擇您建立的函數。

  3. 選擇 Actions (動作),然後選擇 Delete (刪除)

  4. 選擇 Delete (刪除)。

刪除 IAM 政策

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

  2. 選取 Lambda 為您建立的政策。政策名稱以 AWSLambdaS3ExecutionRole- 為開頭。

  3. 選擇 Policy actions (政策動作),然後 Delete (刪除)

  4. 選擇 Delete (刪除)。

若要刪除執行角色

  1. 開啟 IAM 主控台中的 Roles page (角色頁面)。

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

  3. 選擇 Delete role (刪除角色)。

  4. 選擇 Yes, delete (是,刪除)

刪除 S3 儲存貯體

  1. 開啟 Amazon S3 主控台

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

  3. 選擇 Delete (刪除)。

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

  5. 選擇 Confirm (確認)

後續步驟

嘗試更進階的教學課程。在本教學課程中,S3 觸發條件會叫用函數,為上傳至 S3 儲存貯體的每個影像檔案 create a thumbnail image (建立縮圖影像)。本教學課程需要中等水平的 AWS 和 Lambda 領域知識。您可以使用 AWS Command Line Interface (AWS CLI) 來建立資源,並為您的函數及其相依性建立 .zip 檔案封存部署套件。