LambdaでSQSにメッセージを登録

## SQSにダミーメッセージを登録する方法
SQSをプロジェクトで活用しており、
ダミーデータを手動で登録するのが面倒なので、Lambdaを活用したデータ登録を行いました。

## 簡単なイメージ
![Lambda-SQS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/415982/98b1a2a4-80d0-884b-2f47-fbda8c9da331.png)


## コード
```python
import json
import boto3
import logging
from datetime import datetime
from typing import List, Dict

# ロガーの設定
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# SQSクライアントの初期化
sqs = boto3.client("sqs")

# SQSキューのURL（定数として定義）
QUEUE_URL: str = "https://sqs.ap-northeast-1.amazonaws.com/xxxxxxxxxxx/xxx"

# 1回の送信バッチ数（SQSの上限は10件）
BATCH_SIZE: int = 10


def lambda_handler(event: Dict, context: Dict) -> Dict[str, str]:
    """
    Lambda のエントリーポイント
    """
    num_messages: int = 1000  # 送信するメッセージの数
    send_messages_to_sqs(num_messages)
    return {"statusCode": 200, "body": json.dumps("Messages sent successfully!")}


def generate_dummy_data(index: int) -> Dict[str, str]:
    """
    ダミーデータを生成する関数
    """
    return {
        "url": "https://test.com/index",
        "title": f"[test]{index}",
        "contents": "テストです",
        "id": index,
        "created_at": datetime.utcnow().isoformat() + "Z",
    }


def send_messages_to_sqs(num_messages: int) -> None:
    """
    SQS にメッセージを送信する関数（バッチ処理）
    """
    messages: List[Dict[str, str]] = [
        {"Id": str(i), "MessageBody": json.dumps(generate_dummy_data(i))}
        for i in range(1, num_messages + 1)
    ]
    send_messages_in_batches(messages)


def send_messages_in_batches(messages: List[Dict[str, str]]) -> None:
    """
    SQS へバッチ送信する関数
    """
    for i in range(0, len(messages), BATCH_SIZE):
        batch: List[Dict[str, str]] = messages[i : i + BATCH_SIZE]  # 10件ずつ送信
        response = sqs.send_message_batch(QueueUrl=QUEUE_URL, Entries=batch)
        logger.info(f"Batch sent successfully: {response}")

```

### lambda_handler
#### 概要
Lambda 関数のエントリーポイントです。
Lambda が呼び出されると最初に実行されます。
この関数は、指定された数のメッセージを SQS（Simple Queue Service）に送信するための処理を呼び出します。

#### 引数
- event: Lambda がトリガーされたときに送られてくるイベント情報（Dict 型）。
- context: Lambda 実行環境に関する情報を含むコンテキスト（Dict 型）。

#### 戻り値
- HTTP ステータスコード 200 とメッセージの JSON 文字列を返します。

#### 処理内容
- num_messages 変数で指定された数のメッセージを SQS に送信する処理を呼び出します。

### generate_dummy_data
#### 概要
ダミーデータを生成するための関数です。
テストやデモンストレーションのために、指定されたインデックスをもとにユニークなデータを作成します。

#### 引数
- index: ダミーデータの識別子として使われる整数（int 型）。
#### 戻り値
- ダミーデータを格納した辞書（Dict[str, str] 型）。URL、タイトル、内容、ID、作成日時などを含みます。
#### 処理内容
- index を基にしたダミーデータを生成し、辞書として返します。生成されるデータは、テスト用の URL、タイトル、内容、ID、作成日時（ISO 8601形式）を含みます。

### send_messages_to_sqs
#### 概要
指定された数のメッセージを SQS に送信するための関数です。
この関数は、generate_dummy_data を使用してダミーデータを生成し、メッセージをまとめて SQS に送信します。

#### 引数
- num_messages: 送信するメッセージの数（int 型）。

#### 戻り値
- 戻り値は None です。この関数はメッセージを送信する副作用を持ち、明示的な戻り値はありません。

#### 処理内容
- 引数として渡された num_messages 数に基づいて、メッセージを生成します。生成したメッセージは send_messages_in_batches 関数を使って、バッチ処理で SQS に送信されます。


### send_messages_in_batches
#### 概要
複数のメッセージをバッチ単位で SQS に送信する関数です。AWS SQS の制限により、1回の送信で最大 10 件のメッセージしか送信できないため、この関数ではメッセージを 10 件ずつのバッチに分けて送信します。

#### 引数
- messages: 送信するメッセージのリスト（List[Dict[str, str]] 型）。各メッセージは辞書形式で格納されており、Id と MessageBody を含みます。

#### 戻り値
- 戻り値は None です。この関数も副作用があり、メッセージを SQS に送信します。

#### 処理内容
- メッセージを 10 件ずつに分割して、send_message_batch メソッドを用いて SQS にバッチ送信します。送信結果はログとして出力されます。

## まとめ
Lambda を利用して、ダミーデータを指定された数だけ生成し、AWS SQS に送信する一連の処理を実行します。
ダミーデータは、簡単にテストやデモ用のデータを作成するために利用でき、SQS への送信処理はバッチ処理を使用して効率的に行われます。

## SAMテンプレート
```yaml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: 'sample SAM Template for create-sample-log '
Parameters:
  Environment:
    Type: String
  SampleFunctionRoleName:
    Type: String
Resources:
  CreateSampleLogFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName:
        Fn::Sub: create-sample-log
      CodeUri: functions/create-sample-log/
      Handler: app.lambda_handler
      Runtime: python3.11
      Timeout: 60
      MemorySize: 128
      Architectures:
      - x86_64
      Environment:
        Variables:
          Environment:
            Ref: Environment
      Role:
        Fn::GetAtt:
        - SampleFunctionRole
    Metadata:
      SamResourceId: CreateSampleLogFunction
  SampleFunctionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName:
        Ref: SampleFunctionRoleName
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - lambda.amazonaws.com
          Action:
          - sts:AssumeRole
      ManagedPolicyArns:
      - Ref: LambdaExecutionPolicy
    Metadata:
      SamResourceId: SampleFunctionRole
Outputs:
  CreateSampleLogFunction:
    Description: CreateSampleLog Lambda Function ARN
    Value:
      Fn::GetAtt:
      - CreateSampleLogFunction
      - Arn
```