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

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

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

先決條件

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

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

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

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

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

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

在您註冊 AWS 帳戶 之後,請建立管理使用者,讓您可以不使用根使用者處理日常作業。

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

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

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

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

建立管理使用者
  • 對於您的日常管理工作,請將管理存取權授予 AWS IAM Identity Center (successor to AWS Single Sign-On) 中的管理使用者。

    如需說明,請參閱《AWS IAM Identity Center (successor to AWS Single Sign-On) 使用者指南》中的入門

以管理員的身分登入
  • 若要使用您的 IAM 身分中心使用者登入,請使用建立 IAM 身分中心使用者時傳送至您電子郵件地址的登入 URL。

    如需使用 IAM 身分中心使用者登入的說明,請參閱《AWS 登入 使用者指南》中的登入 AWS 存取入口網站

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

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

遵照這些步驟建立 Amazon S3 儲存貯體並上傳物件。

  1. 開啟 Amazon S3 主控台

  2. 選擇 建立儲存貯體

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

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

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

  4. 選擇 建立儲存貯體

  5. 物件上傳至儲存貯體 (例如 HappyFace.jpg)。

    您必須先建立此範例物件,才能測試您的 Lambda 函數。在本教學課程的後續階段中手動測試函數時,需將範例事件資料傳遞至指定來源儲存貯體名稱和物件名稱的函數。

建立 Lambda 函數

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

從主控台中的藍圖建立 Lambda 函數
  1. 開啟 Lambda 主控台中的 函數頁面

  2. 選擇 建立函數

  3. 選擇 使用藍圖

  4. 開啟 選取藍圖 下拉式清單,然後搜尋 取得 S3 物件。選取藍圖的 python3.7nodejs14.x 版本。

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

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

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

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

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

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

  7. 選擇 建立函數

檢閱函數程式碼

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. 程式碼來源 下的 程式碼 標籤中 ,選擇 測試 旁邊的箭號,然後從下拉式清單中選擇 設定測試事件

  2. 設定測試事件 視窗中,執行以下操作:

    1. 選擇 建立新測試事件

    2. 事件範本 請選擇 S3 Put (s3-put)。

    3. 針對 事件名稱,輸入測試事件的名稱。例如 mys3testevent

    4. 事件 JSON 中,取代下列值:

      • us-east-1 – 您建立 Amazon S3 儲存貯體和 Lambda 函數的 AWS 區域。

      • example-bucket – 您之前建立的 Amazon S3 儲存貯體。

      • test%2Fkey – 您上傳至儲存貯體的範例物件名稱 (例如 HappyFace.jpg)。

      { "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": "example-bucket", "ownerIdentity": { "principalId": "EXAMPLE" }, "arn": "arn:aws:s3:::example-bucket" }, "object": { "key": "test%2Fkey", "size": 1024, "eTag": "0123456789abcdef0123456789abcdef", "sequencer": "0A1B2C3D4E5F678901" } } } ] }
    5. 選擇 儲存

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

    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 主控台的 儲存貯體頁面 上,選擇您先前建立的來源儲存貯體名稱。

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

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

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

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

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

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

清除您的資源

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

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

  2. 選擇您建立的函數。

  3. 選擇 動作刪除

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

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

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

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

  4. 選擇 刪除

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

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

  3. 選擇 刪除

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

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

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

  3. 選擇 刪除

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

  5. 選擇 刪除儲存貯體

後續步驟

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