4
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 1 year has passed since last update.

LocalStackを用いたSNSとSQSのファンアウトパターン検証方法 メモ

Posted at
  • LocalStack上で動作するAmazon SNSとAmazon SQSを使用してファンアウトパターンを試したので、メモしておく。

ファンアウトパターンとは

  • 一つの入力に対して複数の出力を接続する設計パターン。

  • 複数の処理を並列処理したい場合に利用する。

  • Amazon SNS トピックをAmazon SQSキューでサブスクライブする形で構成されることがある。

    fanout.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
    

動作確認

  • 1つのSNSトピックを3つのSQSキューでサブスクライブさせる。

SNSトピック作成

# トピック:test-fanout-topic
aws sns create-topic --name test-fanout-topic --endpoint-url http://localhost:4566 --profile localstack 
{
    "TopicArn": "arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic"
}

SQSキュー作成

  • キューを3つ作成する。
# キュー:test-fanout-queue1
aws sqs create-queue --queue-name test-fanout-queue1 --endpoint-url http://localhost:4566 --profile localstack 
{
    "QueueUrl": "http://localhost:4566/000000000000/test-fanout-queue1"
}

# キュー:test-fanout-queue2
aws sqs create-queue --queue-name test-fanout-queue2 --endpoint-url http://localhost:4566 --profile localstack 
{
    "QueueUrl": "http://localhost:4566/000000000000/test-fanout-queue2"
}

# キュー:test-fanout-queue3
aws sqs create-queue --queue-name test-fanout-queue3 --endpoint-url http://localhost:4566 --profile localstack 
{
    "QueueUrl": "http://localhost:4566/000000000000/test-fanout-queue3"
}

SQSからSNSトピックに対するサブスクライブ設定

# キュー:test-fanout-queue1のサブスクライブ設定
aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic --protocol sqs --notification-endpoint http://localhost:4566/000000000000/test-fanout-queue1 --endpoint-url=http://localhost:4566 --profile localstack
{
    "SubscriptionArn": "arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic:c883bc57-1dcb-47a5-a74b-6926302f88db"
}

# キュー:test-fanout-queue2のサブスクライブ設定
aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic --protocol sqs --notification-endpoint http://localhost:4566/000000000000/test-fanout-queue2 --endpoint-url=http://localhost:4566 --profile localstack
{
    "SubscriptionArn": "arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic:44e79398-c90b-4e77-b132-37bb77b7152e"
}

# キュー:test-fanout-queue3のサブスクライブ設定
aws sns subscribe --topic-arn arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic --protocol sqs --notification-endpoint http://localhost:4566/000000000000/test-fanout-queue3 --endpoint-url=http://localhost:4566 --profile localstack
{
    "SubscriptionArn": "arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic:8421bcac-9726-4cc2-9d31-ac0a75f81212"
}

SNSトピックへのメッセージ配信

  • "Hello Fanout Pattern"というメッセージとSNSトピックtest-fanout-topicに対して配信する。
aws sns publish --topic-arn arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic --message "Hello Fanout Pattern" --endpoint-url http://localhost:4566 --profile localstack
{
    "MessageId": "91712e1b-c67e-4d30-9ba1-f0372fff0b73"
}

SQSキューでメッセージ確認

※SNSトピックへ配信したメッセージを各キューで受け取れていることがわかる。

#test-fanout-queue1
aws sqs receive-message --queue-url 'http://localhost:4566/000000000000/test-fanout-queue1' --endpoint-url http://localhost:4566 --profile localstack
{
    "Messages": [
        {
            "MessageId": "6b1af479-0dba-9866-f186-1fe62bcd2aed",
            "ReceiptHandle": "kpmqgrtpkamdehqljgjadtsvoyijpdnuzsckgabebzspjitxqygwlimsttzkoazqfmmzcysupuepacwiuewdwretedegxpbtdddyeraocgtprvcgelqjftjrpqbqjhvcmhundzpgdwaamngsoeakxtxkswhcahgsrpsgxixcfdoldnlrimomsbtcd",
            "MD5OfBody": "cce9d113a86c56f9f5b9855271124d01",
            "Body": "{\"Type\": \"Notification\", \"MessageId\": \"91712e1b-c67e-4d30-9ba1-f0372fff0b73\", \"TopicArn\": \"arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic\", \"Message\": \"Hello Fanout Pattern\", \"Timestamp\": \"2021-11-02T11:51:16.507Z\", \"SignatureVersion\": \"1\", \"Signature\": \"EXAMPLEpH+..\", \"SigningCertURL\": \"https://sns.us-east-1.amazonaws.com/SimpleNotificationService-0000000000000000000000.pem\"}"
        }
    ]
}

# test-fanout-queue2
aws sqs receive-message --queue-url 'http://localhost:4566/000000000000/test-fanout-queue2' --endpoint-url http://localhost:4566 --profile localstack
{
    "Messages": [
        {
            "MessageId": "8ae41e45-67ee-26ef-af44-df5150e0f65a",
            "ReceiptHandle": "whfwskrunpfadcvljmwkvsokhwniperievwlwpnraltgeyabzzqfvmmnawchscfyheatnwpkvrtyeuknaqmrdkiumocinzkadjvhdxpbdgznbokhxpkxsziifjycnpxssabhzfnzajlotitwgnfvoyipzdkxgtkxoikpmgacfzoxjwhppitjafpfl",
            "MD5OfBody": "10b73b458452f74549f7270ca793f203",
            "Body": "{\"Type\": \"Notification\", \"MessageId\": \"91712e1b-c67e-4d30-9ba1-f0372fff0b73\", \"TopicArn\": \"arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic\", \"Message\": \"Hello Fanout Pattern\", \"Timestamp\": \"2021-11-02T11:51:16.544Z\", \"SignatureVersion\": \"1\", \"Signature\": \"EXAMPLEpH+..\", \"SigningCertURL\": \"https://sns.us-east-1.amazonaws.com/SimpleNotificationService-0000000000000000000000.pem\"}"
        }
    ]
}

# test-fanout-queue3
aws sqs receive-message --queue-url 'http://localhost:4566/000000000000/test-fanout-queue3' --endpoint-url http://localhost:4566 --profile localstack
{
    "Messages": [
        {
            "MessageId": "59571140-f202-d66b-463c-b4e7f08ecefc",
            "ReceiptHandle": "myfqljrtunmvekzonlpieemugfpazlspgkdlpfgkgbjddtkvauvigfpttyzsotgaycvagdtscrtmtccntdhgabufomnnonpjmgahnbrbibjscidcdmnprazdvkvfyyxsekydxpfzqdwzjlhbncjbffautjuxhldoaxohnqzjnkhtzicnptfputkai",
            "MD5OfBody": "05609b51a112bb4ea1ea0dbca0d25c20",
            "Body": "{\"Type\": \"Notification\", \"MessageId\": \"91712e1b-c67e-4d30-9ba1-f0372fff0b73\", \"TopicArn\": \"arn:aws:sns:ap-northeast-1:000000000000:test-fanout-topic\", \"Message\": \"Hello Fanout Pattern\", \"Timestamp\": \"2021-11-02T11:51:16.576Z\", \"SignatureVersion\": \"1\", \"Signature\": \"EXAMPLEpH+..\", \"SigningCertURL\": \"https://sns.us-east-1.amazonaws.com/SimpleNotificationService-0000000000000000000000.pem\"}"
        }
    ]
}

参考情報

4
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
4
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?