

# チュートリアル: クロスアカウント Amazon SQS キューをイベントソースとして使用する
<a name="with-sqs-cross-account-example"></a>

このチュートリアルでは、別のAWSアカウントで、 Amazon Simple Queue Service (Amazon SQS) キューからのメッセージを使用する Lambda 関数を作成します。　 このチュートリアルには 2 つの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)」にある手順に従ってインストールしてください。

このチュートリアルでは、コマンドを実行するためのコマンドラインターミナルまたはシェルが必要です。Linux および macOS では、任意のシェルとパッケージマネージャーを使用してください。

**注記**  
Windows では、Lambda でよく使用される一部の Bash CLI コマンド (`zip` など) が、オペレーティングシステムの組み込みターミナルでサポートされていません。Ubuntu および Bash の Windows 統合バージョンを取得するには、[Windows Subsystem for Linux をインストール](https://docs.microsoft.com/en-us/windows/wsl/install-win10)します。

## 実行ロールを作成する (アカウント A)
<a name="with-sqs-cross-account-create-execution-role"></a>

**アカウント A** で、必要なAWSリソースにアクセスするためのアクセス許可を関数に付与する[実行ロール](lambda-intro-execution-role.md)を作成します。

**実行ロールを作成するには**

1. AWS Identity and Access Management (IAM) コンソールの [[Roles page (ロールページ)](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]** で、Amazon SQS メッセージを処理する Lambda 関数を作成します。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"
           }
       ]
   }
   ```

   `"body"`にキューからの実際のメッセージが含まれている場合、先行する JSON は、Amazon SQS が Lambda 関数に送信する可能性のあるイベントをシミュレートします。

1. 次の `invoke` AWS CLI コマンドを実行します。

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

   AWS CLI バージョン 2 を使用している場合、**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. 次のプロパティでキューを作成します。
   + **タイプ** – **スタンダード**
   + **名前** – **LambdaCrossAccountQueue**
   + **設定** – デフォルト設定のままにします。
   + **アクセスポリシー** – [**Advanced (アドバンスト)**] を選択します。次の 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 リソースネーム (ARN)を記録します。こちらは、次のセクションでキューを Lambda 関数と関連付ける際に必要になります。

## イベントソースを設定する (アカウント A)
<a name="with-sqs-cross-account-event-source"></a>

**[アカウント A]** で、**[アカウント B]** の Amazon SQS キューと Lambda 関数の間に、次の `create-event-source-mapping` AWS CLIコマンドを実行してイベントソースマッピングを作成します。`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. **[メッセージ本文]** にテストメッセージを入力します。

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. **[アクション]** で、**[削除]** を選択します。

1. テキスト入力フィールドに **confirm** と入力し、**[削除]** を選択します。

**[アカウント B]** で、Amazon SQS キューをクリーンアップします。

**Amazon SQS キューを削除するには**

1. AWS マネジメントコンソール にサインインし、Amazon SQS コンソール ([https://console.aws.amazon.com/sqs/](https://console.aws.amazon.com/sqs/)) を開きます。

1. 作成したキューを選択します。

1. **[削除]** を選択します。

1. テキスト入力フィールドに **confirm** を入力します。

1. **[Delete]** (削除) をクリックします。