跳至內容

如何設定 Amazon S3 事件通知,以調用其他 AWS 帳戶中的 Lambda 函式?

3 分的閱讀內容
0

我希望 Amazon Simple Storage Service (Amazon S3) 儲存貯體呼叫另一個 AWS 帳戶中的 AWS Lambda 函式。

解決方法

若要設定您的 Amazon S3 儲存貯體,使其調用另一個 AWS 帳戶中的 Lambda 函式,請完成下列步驟:

  1. 更新 Lambda 函式的資源型權限政策,以向 Amazon S3 授予調用權限
  2. 建立調用 Lambda 函式的 Amazon S3 事件通知

**重要:**Lambda 函式必須與您的 S3 儲存貯體位於相同 AWS 區域。

如需如何遷移函式的資訊,請參閱如何使用 Lambda 主控台將 Lambda 函式遷移到另一個 AWS 帳戶或區域?

更新 Lambda 函式的資源型權限政策,以向 Amazon S3 授予調用權限

AWS 管理主控台

若要更新 Lambda 函式的資源型權限政策以向 Amazon S3 授予調用權限,請完成下列步驟:

  1. 使用您 Lambda 函式所在的 AWS 帳戶,開啟 Lambda 主控台上的 Functions page (函式頁面)。
  2. 選擇您希望由 Amazon S3 調用之 Lambda 函式的名稱。
  3. Configuration (組態) 索引標籤中,選擇 Permissions (權限)。
  4. Resource-based policy (資源型政策) 窗格中,選擇 Add permissions (新增權限)。
  5. Policy statement (政策陳述式) 窗格中,選擇 AWS service (AWS 服務)。這將顯示 Service (服務) 下拉式清單。
  6. Service (服務) 下拉式清單中,選擇 S3 以查看更多欄位。
  7. Statement ID (陳述式 ID) 中,輸入唯一的陳述式 ID,以區分您在政策內建立的陳述式。
  8. Source account (來源帳戶) 中,輸入託管您 S3 儲存貯體之帳戶的 AWS 帳戶 ID
  9. Source ARN (來源 ARN) 中,輸入您 S3 儲存貯體的 ARN。請使用以下格式:
    arn:aws:s3:::bucket_name
    **注意:**將 bucket_name 替換為您 S3 儲存貯體的名稱。
  10. Action (動作) 中,從下拉式清單中選取 lambda:InvokeFunction
  11. 選擇 Save (儲存)。

如需詳細資訊,請參閱在 Lambda 中使用資源型政策

AWS CLI

**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請參閱AWS CLI 錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本

更新 Lambda 函式的資源型權限政策,以使用 add-permission API 向 Amazon S3 授予調用權限,其類似於以下內容:

aws lambda add-permission \--function-name LambdaFunction_name \
--action lambda:InvokeFunction \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::bucket_name \
--source-account account-id \
--statement-id "unique_statement_ID"

**注意:**將 LambdaFunction_namebucket_nameunique_statement_ID 替換為您的變數。

建立調用 Lambda 函式的 Amazon S3 事件通知

AWS 管理主控台

依照說明使用 Amazon S3 主控台啟動並設定事件通知

AWS CLI

若要建立調用 Lambda 函式的 Amazon S3 事件通知,請使用 put-bucket-notification-configuration 命令。

**重要:**在使用 put-bucket-notification 命令之前,請先確認您的 S3 儲存貯體上沒有設定任何其他事件通知。put-bucket-notification-configuration 命令會對任何現有的通知組態執行替換作業,而不是附加作業。

若要檢查您的儲存貯體是否已有事件通知,請執行以下命令:

aws s3api get-bucket-notification-configuration --bucket bucket_name

如果上述命令傳回空的 JSON 物件或沒有回應,則表示您沒有現有的事件通知組態。使用下列組態建立並儲存一個名為 notification.json 的新檔案:

{
"LambdaFunctionConfigurations": [
    {
      "Id": "my-lambda-function-s3-event-configuration",
      "LambdaFunctionArn": "LambdaFunction_ARN",
      "Events": [ "s3:ObjectCreated:" ],
      "Filter": {
        "Key": {
          "FilterRules": [
            {
              "Name": "prefix"|"suffix",
              "Value": "string"
            }
          ]
        }
      }
    }
  ]
}

**注意:**將 LambdaFunction_ARN 替換為您的 Lambda 函式 ARN。將首碼和尾碼替換為篩選規則的變數。

如果 get-bucket-notification-configuration 傳回現有的事件通知組態 JSON,則將現有的 JSON 組態儲存為名為 notification.json 的檔案。將新的 Lambda 通知組態新增至現有的 LambdaFunctionConfigurations 金鑰,或使用下列範例中所示的 JSON 語法建立新金鑰。將金鑰新增至 notification.json 檔案:

{
... # Non Lambda event configurations like SNS, SQS etc. ,
"LambdaFunctionConfigurations": [
    {
      "Id": "my-lambda-function-s3-event-configuration",
      "LambdaFunctionArn": "LambdaFunction_ARN",
      "Events": [ "s3:ObjectCreated:" ],
      "Filter": {
        "Key": {
          "FilterRules": [
            {
              "Name": "prefix"|"suffix",
              "Value": "string"
            }
          ]
        }
      }
    },
    {...}, #Other pre-existing Lambda Function configurations
  ]
}

建立 notification.json 後,執行以下命令來更新您的 S3 事件通知組態:

aws s3api put-bucket-notification-configuration \
--bucket bucket_name \
--notification-configuration file://notification.json

**注意:**將 bucket_name 替換為您 S3 儲存貯體的名稱。

測試 Lambda 函式

若要使用 Lambda 主控台測試 Lambda 函式,請參閱使用虛擬事件測試 Lambda 函式。如果您的函式未由事件通知調用,請參閱為什麼我的 Amazon S3 事件通知未調用 Lambda 函式?

相關資訊

如何允許 Lambda 函式存取 Amazon S3 儲存貯體?

為什麼我在建立 Amazon S3 事件通知時,會收到「Unable to validate the following destination configurations」(無法驗證以下目的地組態) 錯誤?

AWS 官方已更新 2 年前