

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

# 教學課程：使用跨帳戶 Amazon SQS 佇列做為事件來源
<a name="with-sqs-cross-account-example"></a>

在本教學課程中，您會建立 Lambda 函數，使用來自不同 AWS 帳戶中 Amazon Simple Queue Service (Amazon SQS) 佇列的訊息。本教學課程涉及兩個 AWS 帳戶：**帳戶 A** 是指包含 Lambda 函數的帳戶，**帳戶 B** 是指包含 Amazon SQS 佇列的帳戶。

## 先決條件
<a name="with-sqs-cross-account-prepare"></a>

### 安裝 AWS Command Line Interface
<a name="install_aws_cli"></a>

如果您尚未安裝 AWS Command Line Interface，請依照[安裝或更新最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)中的步驟進行安裝。

本教學課程需使用命令列終端機或 Shell 來執行命令。在 Linux 和 macOS 中，使用您偏好的 Shell 和套件管理工具。

**注意**  
在 Windows 中，作業系統的內建終端不支援您常與 Lambda 搭配使用的某些 Bash CLI 命令 (例如 `zip`)。若要取得 Ubuntu 和 Bash 的 Windows 整合版本，請[安裝適用於 Linux 的 Windows 子系統](https://docs.microsoft.com/en-us/windows/wsl/install-win10)。

## 建立執行角色 (帳戶 A)
<a name="with-sqs-cross-account-create-execution-role"></a>

在**帳戶 A** 中，建立 [執行角色](lambda-intro-execution-role.md)，授予您的函數存取所需 AWS 資源的許可。

**若要建立執行角色**

1. 在 AWS Identity and Access Management (IAM) 主控台中開啟[角色頁面](https://console.aws.amazon.com/iam/home#/roles)。

1. 選擇建**立角色**。

1. 建立具備下列屬性的角色。
   + **信任實體** – **AWS Lambda**。
   + **許可** - **AWSLambdaSQSQueueExecutionRole**
   + **角色名稱** - **cross-account-lambda-sqs-role**。

**AWSLambdaSQSQueueExecutionRole** 政策具備函數自 Amazon SQS 讀取項目以及寫入日誌到 Amazon CloudWatch Logs 時所需的許可。

## 建立函數 (帳戶 A)
<a name="with-sqs-cross-account-create-function"></a>

在**帳戶 A** 中建立 Lambda 函數，它會處理 Amazon SQS 訊息。該 Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域。

下列 Node.js 程式碼範例將每則訊息寫入 CloudWatch Logs 的日誌中。

**Example index.mjs**  

```
export const handler = async function(event, context) {
  event.Records.forEach(record => {
    const { body } = record;
    console.log(body);
  });
  return {};
}
```

**建立函數**
**注意**  
遵循這些步驟，建立 Node.js 函式。對於其他語言，步驟類似，但有些細節不同。

1. 將程式碼範例儲存為名為 `index.mjs` 的檔案。

1. 建立部署套件。

   ```
   zip function.zip index.mjs
   ```

1. 使用 `create-function` AWS Command Line Interface (AWS CLI) 命令建立 函數。將 `arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role` 取代為先前建立之執行角色的 ARN。

   ```
   aws lambda create-function --function-name CrossAccountSQSExample \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role {{arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role}}
   ```

## 測試函數 (帳戶 A)
<a name="with-sqs-cross-account-create-test-function"></a>

在**帳戶 A** 中，使用 `invoke` AWS CLI 命令和範例 Amazon SQS 事件手動測試 Lambda 函數。

如果處理常式均正常傳回而無例外情況，Lambda 會認為訊息已成功處理，並開始讀取佇列中的新訊息。成功處理訊息之後，Lambda 從佇列中自動刪除它。如果處理常式擲出例外情況，Lambda 會認為訊息批次未成功處理，並且 Lambda 會調用具有相同訊息批次的函數。

1. 將下面的 JSON 儲存為名為 `input.txt` 的檔案。

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

   上述 JSON 會模擬 Amazon SQS 可能傳送至 Lambda 函數的事件，其中 `"body"` 包含佇列中的實際訊息。

1. 執行下列 `invoke` AWS CLI 命令。

   ```
   aws lambda invoke --function-name CrossAccountSQSExample \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

   如果您使用的是第 2 AWS CLI 版，則需要 **cli-binary-format**選項。若要讓此成為預設的設定，請執行 `aws configure set cli-binary-format raw-in-base64-out`。若要取得更多資訊，請參閱*《AWS Command Line Interface 使用者指南第 2 版》*中 [AWS CLI 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。

1. 在檔案 `outputfile.txt` 中確認輸出。

## 建立 Amazon SQS 佇列 (帳戶 B)
<a name="with-sqs-cross-account-configure-sqs"></a>

在**帳戶 B** 中，建立**帳戶 A** 中 Lambda 函數可用作事件來源的 Amazon SQS 佇列。該 Lambda 函數和 Amazon SQS 佇列必須位於相同的 AWS 區域。

**建立佇列**

1. 開啟 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs)。

1. 選擇 **建立佇列** 。

1. 建立具備下列屬性的佇列。
   + **Type** (類型) - **Standard** (標準)
   + **Name** (名稱) - **LambdaCrossAccountQueue**
   + **Configuration** (組態) - 保留預設設定。
   + **存取政策** - 選擇**進階**。貼入下列 JSON 政策中。取代以下的值：
     + `111122223333`**帳戶 A** 的 ： AWS 帳戶 ID
     + `444455556666`**帳戶 B** 的 ： AWS 帳戶 ID

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Id": "Queue1_Policy_UUID",
         "Statement": [
             {
                 "Sid": "Queue1_AllActions",
                 "Effect": "Allow",
                 "Principal": {
                     "AWS": [
                         "arn:aws:iam::{{111122223333}}:role/cross-account-lambda-sqs-role"
                     ]
                 },
                 "Action": "sqs:*",
                 "Resource": "arn:aws:sqs:us-east-1:{{444455556666}}:LambdaCrossAccountQueue"
             }
         ]
     }
     ```

------

     此政策許可**帳戶 A** 中的 Lambda 執行角色取用此 Amazon SQS 佇列中的訊息。

1. 建立佇列後，記錄其 Amazon Resource Name (ARN)。在下個步驟中，將佇列與您的 Lambda 函數建立關聯時會需要用到它。

## 設定事件來源 (帳戶 A)
<a name="with-sqs-cross-account-event-source"></a>

在**帳戶 A** 中，執行下列`create-event-source-mapping` AWS CLI 命令，在**帳戶 B** 中的 Amazon SQS 佇列與 Lambda 函數之間建立事件來源映射。將 `arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue` 取代為您在上一個步驟中建立的 Amazon SQS 佇列 ARN。

```
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:{{444455556666}}:LambdaCrossAccountQueue
```

若要取得事件來源映射的清單，請執行下列命令。

```
aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \
--event-source-arn arn:aws:sqs:us-east-1:{{444455556666}}:LambdaCrossAccountQueue
```

## 測試設定
<a name="with-sqs-final-integration-test-no-iam"></a>

現在您可以測試設定，如下所示：

1. 在**帳戶 B** 中，開啟 [Amazon SQS 主控台](https://console.aws.amazon.com/sqs)。

1. 選擇您先前建立的 **LambdaCrossAccountQueue**。

1. 選擇**傳送及接收訊息**。

1. 在 **Message body** (訊息主體) 中，輸入測試訊息。

1. 選擇**傳送訊息**。

**帳戶 A** 中您的 Lambda 函數應該會收到訊息。Lambda 會繼續輪詢佇列是否有更新。當有新訊息時，Lambda 會使用佇列中的此新事件資料來調用您的函數。您的函數會執行並在 Amazon CloudWatch 中建立日誌。可在 [CloudWatch 主控台](https://console.aws.amazon.com/cloudwatch)中檢視日誌。

## 清除您的資源
<a name="cleanup"></a>

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

在**帳戶 A** 中，清除您的執行角色和 Lambda 函數。

**刪除執行角色**

1. 開啟 IAM 主控台中的 [角色頁面](https://console.aws.amazon.com/iam/home#/roles) 。

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

1. 選擇**刪除**。

1. 在文字輸入欄位中輸入角色的名稱，然後選擇 **刪除** 。

**若要刪除 Lambda 函數**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇您建立的函數。

1. 選擇 **Actions** (動作)、**Delete** (刪除)。

1. 在文字輸入欄位中輸入 **confirm**，然後選擇 **刪除** 。

在**帳戶 B** 中，清除 Amazon SQS 佇列。

**刪除 Amazon SQS 佇列**

1. 登入 AWS 管理主控台 並開啟位於 https：//[https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/) 的 Amazon SQS 主控台。

1. 選取您建立的佇列。

1. 選擇 **刪除** 。

1. 在文字輸入欄位中輸入 **confirm**。

1. 選擇 **刪除** 。