

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 處理 Amazon S3 事件 AWS SAM
<a name="serverless-example-s3"></a>

透過此範例應用程式，您可以建置在先前範例中學到的內容，並安裝更複雜的應用程式。此應用程式包含由 Amazon S3 物件上傳事件來源調用的 Lambda 函數。本練習說明如何透過 Lambda 函數存取 AWS 資源和進行 AWS 服務呼叫。

此範例無伺服器應用程式會在 Amazon S3 中處理物件建立事件。對於上傳至儲存貯體的每個映像，Amazon S3 會偵測物件建立的事件並叫用 Lambda 函數。Lambda 函數會叫用 Amazon Rekognition 來偵測影像中的文字。然後，它會將 Amazon Rekognition 傳回的結果儲存在 DynamoDB 資料表中。

**注意**  
使用此範例應用程式，您可以執行與先前範例略有不同的步驟。這是因為此範例需要建立 AWS 資源並設定 IAM 許可，*才能*在本機測試 Lambda 函數。我們將利用 CloudFormation 來建立資源並為您設定許可。否則，您需要手動執行此操作，才能在本機測試 Lambda 函數。  
由於此範例較為複雜，請務必先熟悉安裝先前的範例應用程式，再執行此範例應用程式。

## 開始之前
<a name="serverless-example-s3-prereq"></a>

請確定您已在 中完成必要的設定[安裝 AWS SAM CLI](install-sam-cli.md)。

## 步驟 1：初始化應用程式
<a name="serverless-example-s3-setup-local-app"></a>

在本節中，您會下載範例應用程式，其中包含 AWS SAM 範本和應用程式程式碼。

**初始化應用程式**

1. 在命令提示字元中 AWS SAM CLI執行下列命令。

   ```
   sam init \
   --location https://github.com/aws-samples/cookiecutter-aws-sam-s3-rekognition-dynamodb-python \
   --no-input
   ```

1. 檢閱命令所建立目錄的內容 (`aws_sam_ocr/`)：
   + `template.yaml` – 定義 Amazon S3 應用程式所需的三個 AWS 資源：Lambda 函數、Amazon S3 儲存貯體和 DynamoDB 資料表。範本也會定義這些資源之間的映射和許可。
   + `src/` 目錄 – 包含 Amazon S3 應用程式碼。
   + `SampleEvent.json` – 用於本機測試的範例事件來源。

## 步驟 2：封裝應用程式
<a name="serverless-example-s3-package-serverless-app"></a>

在本機測試此應用程式之前，您必須使用 AWS SAM CLI 來建立部署套件，用來將應用程式部署到 AWS 雲端。此部署會建立在本機測試應用程式所需的必要 AWS 資源和許可。

**建立 Lambda 部署套件**

1. 在要儲存封裝程式碼的位置建立一個 S3 儲存貯體。如果您想使用現有的 S3 儲存貯體，請跳過此步驟。

   ```
   aws s3 mb s3://bucketname
   ```

1. 在命令提示中執行下列 `package` CLI 命令來建立部署套件。

   ```
   sam package \
       --template-file template.yaml \
       --output-template-file packaged.yaml \
       --s3-bucket bucketname
   ```

   在下一個步驟中部署應用程式時`packaged.yaml`，您可以指定新的範本檔案 。

## 步驟 3：部署應用程式
<a name="serverless-example-s3-deploy-serverless-app"></a>

現在您已建立部署套件，您可以使用它將應用程式部署到 AWS 雲端。然後，您可以在 AWS 雲端中調用應用程式來進行測試。

**將無伺服器應用程式部署至 AWS 雲端**
+ 在 中 AWS SAM CLI，使用 `deploy`命令來部署您在範本中定義的所有資源。

  

  ```
  sam deploy \
      --template-file packaged.yaml \
      --stack-name aws-sam-ocr \
      --capabilities CAPABILITY_IAM \
      --region us-east-1
  ```

  在 命令中， `--capabilities` 參數允許 CloudFormation 建立 IAM 角色。

  CloudFormation 會建立範本中定義的 AWS 資源。您可以在 CloudFormation 主控台中存取這些資源的名稱。

**在 AWS 雲端中測試無伺服器應用程式**

1. 將映像上傳至您為此範例應用程式建立的 Amazon S3 儲存貯體。

1. 開啟 DynamoDB 主控台並尋找已建立的資料表。如需 Amazon Rekognition 傳回的結果，請參閱 資料表。

1. 確認 DynamoDB 資料表包含新記錄，其中包含 Amazon Rekognition 在上傳影像中找到的文字。

## 步驟 4：在本機測試應用程式
<a name="serverless-example-s3-test-locally"></a>

您必須先擷取由 建立 AWS 的資源名稱，才能在本機測試應用程式 CloudFormation。
+ 從中擷取 Amazon S3 金鑰名稱和儲存貯體名稱 CloudFormation。透過取代物件金鑰、儲存貯體名稱和儲存貯體 ARN 的值來修改`SampleEvent.json`檔案。
+ 擷取 DynamoDB 資料表名稱。此名稱用於下列`sam local invoke`命令。

使用 AWS SAM CLI產生範例 Amazon S3 事件並叫用 Lambda 函數：

```
TABLE_NAME=Table name obtained from CloudFormation console sam local invoke --event SampleEvent.json
```

`TABLE_NAME=` 部分會設定 DynamoDB 資料表名稱。`--event` 參數會指定檔案，其中包含要傳遞給 Lambda 函數的測試事件訊息。

您現在可以根據 Amazon Rekognition 傳回的結果，驗證已建立預期的 DynamoDB 記錄。

## 後續步驟
<a name="serverless-example-s3-next-steps"></a>

若要繼續了解 AWS SAM，請參閱下列資源：
+ **[Serverless Land](https://serverlessland.com/patterns?framework=AWS+SAM)** – 將無伺服器模式、程式碼範例和學習資源集合在一起的網站，專門用於 AWS SAM 應用程式。