1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Lambda(SAM)からAWS SQS(LocalStack) へメッセージ送信/受信を行う方法 メモ

Posted at
  • LocalStack上で動くAWS SQSのキューに対してAWS SAM CLIで動くLambdaからメッセージ送受信を行う方法をメモする。

構成

sam-sqs.png

LocalStack準備

  • docker-compose.yml

    version: "3.8"
    networks:
      container-link:
        name: docker.internal
    services:
      localstack:
        container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}"
        image: localstack/localstack
        ports:
          - "127.0.0.1:53:53"                # only required for Pro
          - "127.0.0.1:53:53/udp"            # only required for Pro
          - "127.0.0.1:443:443"              # only required for Pro
          - "127.0.0.1:4510-4530:4510-4530"  # only required for Pro
          - "127.0.0.1:4566:4566"
          - "127.0.0.1:4571:4571"
        environment:
          - SERVICES=${SERVICES- }
          - DEBUG=${DEBUG- }
          - DATA_DIR=${DATA_DIR- }
          - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR- }
          - LOCALSTACK_API_KEY=${LOCALSTACK_API_KEY- }  # only required for Pro
          - HOST_TMP_FOLDER=${TMPDIR:-/tmp/}localstack
          - DOCKER_HOST=unix:///var/run/docker.sock
        volumes:
          - "${TMPDIR:-/tmp}/localstack:/tmp/localstack"
          - "/var/run/docker.sock:/var/run/docker.sock"
        networks:
          - container-link
    
  • 起動

    docker-compose up
    

SQS準備

キュー作成

aws sqs create-queue --queue-name test-queue --endpoint-url http://localhost:4566 --profile localstack 
{
    "QueueUrl": "http://localhost:4566/000000000000/test-queue"
}

キューの確認

aws sqs list-queues --endpoint-url http://localhost:4566 --profile localstack 
{
    "QueueUrls": [
        "http://localhost:4566/000000000000/test-queue"
    ]
}

Lambda準備

Lambda

  • ひな形作成

    sam init
    

    ※ランタイムはPython3.8を選択。

  • template.yml

    • Hello World Exampleを利用する。

    • POST(メッセージ送信)/GET(メッセージ受信)用に以下修正

      Events:
              SendMessage:
                Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
                Properties:
                  Path: /message
                  Method: post
              ReceiveMessage:
                Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api
                Properties:
                  Path: /message
                  Method: get
      
  • requrements.txt

    requests
    boto3
    

    ※SQSアクセス用にboto3追加

  • Lambda処理(app.py)修正

    import json
    from boto3.session import Session
    from datetime import datetime
    
    # SQS 接続設定
    session = Session(
        aws_access_key_id='dummy',
        aws_secret_access_key='dummy',
        region_name='ap-northeast-1'
    )
    client = session.client(
        service_name='sqs', 
        endpoint_url='http://localstack:4566'
    )
    
    
    def lambda_handler(event, context):
        # キューURL
        queue_url="http://localstack:4566/000000000000/test-queue"
        if event["httpMethod"] == "POST":
            # メッセージ送信
            response = client.send_message(QueueUrl=queue_url, MessageBody=json.dumps(event["body"]))
            res = {"MD5OfMessageBody":response["MD5OfMessageBody"],"MessageId":response["MessageId"]}
            return {
                "statusCode": 200,
                "body": json.dumps(res),
            }
        if event["httpMethod"] == "GET":
            # メッセージ受信
            response = client.receive_message(QueueUrl=queue_url, MaxNumberOfMessages=1, VisibilityTimeout=60)
            # メッセージ削除
            for message in response["Messages"]:
                client.delete_message(QueueUrl=queue_url, ReceiptHandle=message["ReceiptHandle"])
    
            return {
                "statusCode": 200,
                "body": json.dumps(response["Messages"][0]),
            }
    
    

動作確認

  • ビルド

    sam build
    
  • 実行

    sam local start-api --docker-network docker.internal
    
  • メッセージ送信

    • リクエスト

      POST /message HTTP/1.1
      Host: localhost:3000
      Content-Type: application/json
      Content-Length: 34
      
      {
          "message":"test message1"
      }
      
    • レスポンス

      {
          "MD5OfMessageBody": "65b7b348e7f42918ad0d487de1a20c47", 
          "MessageId": "2cafdcd9-2620-14b4-645a-da15dbddf8b5"
      }
      
  • メッセージ受信

    • リクエスト

      GET /message HTTP/1.1
      Host: localhost:3000
      Content-Type: application/json
      
    • レスポンス

      {
          "MessageId": "2cafdcd9-2620-14b4-645a-da15dbddf8b5", 
          "ReceiptHandle": "imvqeantfgqrgtkzhwowwzywsxmtdrakkhjdqkwyybxlevsltiefnfjrmoksniovizimonlkixhdixufzqlmejbmtwcxvwuaintwwojbompbfqjhsmokjtojxdlnxquvqslbrevmrinvzxeymkrcpstcmzrtfzhlclwpmkcuokfqjdahkiqhlxcli", 
          "MD5OfBody": "65b7b348e7f42918ad0d487de1a20c47", 
          "Body": "\"{\\n    \\\"message\\\":\\\"test message1\\\"\\n}\""
      }
      

参考情報

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?