【技術検証】AWSのSQSとLambdaを連携してみたので、簡単にまとめてみました

## はじめに

今回は、Amazon SQS に送信されたメッセージをトリガーに、AWS Lambda 関数を自動実行する構成について技術検証を行った内容をまとめます。

今回の内容は前回の記事の続きとなる技術検証です。興味のある方は、まずそちらから読んでいただくとスムーズに理解できると思います！

https://qiita.com/free-honda/items/7a9a1b6ad4f0df4b57b8

余談ですが、Qiitaのイベントに参加していると、記事のプレビュー画像がとてもかっこよく表示されていて、なんだか嬉しくなりますね！笑

## 書こうと思ったきっかけ

前回の記事では、CloudFormation を使って SQS を作成しましたが、今回はその作成した SQS に対して Lambda 関数をトリガーして実行する技術検証を進めていきます。

**こんな感じの簡易的な検証になっています！（今回はSQS と Lambda の連携の部分です。）**

![Screenshot 2025-06-22 at 12.37.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6cc11b3b-af68-471f-9741-5f918e86beb8.png)

引用元：https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs-example.html

SQSについては、まだまだ手を動かして学ぶ必要があると感じているため、今後も積極的に触れていきたいサービスのひとつです〜

## 実際にやってみた

SQS (例: MyQueue.fifo) からのメッセージで Lambda を動作させるための手順を解説します。この構成により、バックエンドの非同期処理やイベント駆動のワークフローをシンプルかつスケーラブルに構築できると思っています。

### 1. Lambda 関数の作成

まず、SQS からメッセージを受け取り、その内容をログに出力するだけのシンプルな Lambda 関数を作成します。以下は Python ランタイム (3.13) で実装した例です。

```python
def lambda_handler(event, context):
    for record in event['Records']:
        print("メッセージ ID:", record['messageId'])
        print("本文:", record['body'])
    return {
        'statusCode': 200,
        'body': 'SQS メッセージを正常に処理しました'
    }
```

このコードでは、受け取ったメッセージを1件ずつループし、CloudWatch Logs に出力しています。

**こんな感じで作成済みです！**

![Screenshot 2025-06-22 at 12.41.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c3218a80-b914-4a9e-a5a3-3a55b298048d.png)


今後の拡張として、メッセージ本文を解析して他のサービスと連携することも可能です。

### 2. Lambda 実行用 IAM ロール

Lambda 関数が正しく動作するためには、CloudWatch Logs にログを出力する権限、および SQS キューからメッセージを受信・削除する権限が必要です。

検証を簡易に行うために、今回は AWS が提供しているマネージドポリシー `AmazonSQSFullAccess` を使用します。これは SQS に関するすべての操作を許可するポリシーです。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "sqs:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

:::note alert
**補足： このポリシーはあくまで検証・学習用で使用し、実運用では最小権限の原則に基づいて適切に絞り込んだカスタムポリシーを使うことが強く推奨されます。**
:::

イメージとしては、Lambda関数にはデフォルトの実行ポリシーに加えて、SQSに関するマネージドポリシーもアタッチしている状態です。

![Screenshot 2025-06-22 at 12.43.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/75c07049-3677-4590-abf5-ea4b194d3384.png)

### 3. イベントソースマッピング

SQS からのメッセージを自動的に Lambda に渡すには、イベントソースマッピングを設定します。これにより、ポーリングなどを自分で実装する必要はありません。

```bash
aws lambda create-event-source-mapping \
  --function-name MyLambdaFunction \
  --event-source-arn arn:aws:sqs:ap-northeast-1:123456789012:MyQueue.fifo \
  --batch-size 1 \
  --enabled
```

ここで `batch-size` は、一度に処理するメッセージ数を指定します。今回は 1 件ずつ処理する設定にしています。

**問題なくトリガーされていました！**

![Screenshot 2025-06-22 at 12.45.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e0c77fff-fca2-45c5-bdc7-43799f981d8c.png)

### 4. SQS にメッセージを送信

Lambda を呼び出すには、SQS にメッセージを送信する必要があります。FIFO キューを使用している場合は `--message-group-id` の指定が必須です。

前回作成したのが FIFO キューだったため、今回は以下のコマンドを使ってテスト用のメッセージを送信してみました。

![Screenshot 2025-06-22 at 12.48.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d7c95588-bc3a-454c-a9c7-a4b07335c39e.png)

なお、メッセージが正しく送信されているかどうかは、マネジメントコンソール上で確認できますので、参考にしてみてください！

```bash
aws sqs send-message \
  --queue-url https://sqs.ap-northeast-1.amazonaws.com/123456789012/MyQueue.fifo \
  --message-body "こんにちは Lambda" \
  --message-group-id "group-1"
```

このコマンドを実行すると、Lambda 関数が即座にトリガーされ、メッセージの内容がログに記録されます。

### 5. ログ確認 (CloudWatch Logs)

Lambda の動作確認には CloudWatch Logs を使用します。想定通りメッセージが記録されていることが確認できましたので、検証としては成功になります！

![Screenshot 2025-06-22 at 12.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ad522cc6-2c6e-4ef2-ad87-64af0234b847.png)

関数も正常に実行されていることを確認できたため、安心しました。

![Screenshot 2025-06-22 at 12.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/802254b5-1c9d-4eea-975f-5f0b5b673464.png)

## まとめ

ここまで読んでいただき、ありがとうございました！SQS から Lambda をトリガーで動作させることにより、非同期処理を実現できるサーバーレス構成が少しだけ試せました。

次回は、今回構築した構成を CloudFormation を用いて自動化し、再現性の高いインフラ管理に挑戦していこうと思います...！！

## 参考文献

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs-example.html

https://qiita.com/suiwave/items/b9538389e62a87c89683

https://qiita.com/hiroky_814/items/b40af0c3172aed2b9090