symfonyamazon-sqslocalstack

How can I disable ssl upon sqs on localstack?


Upon a symfony app I try to use localstack for local sqs:

services:
    php:
        container_name: php
        build:
            context: ./php
            args:
                TIMEZONE: ${TIMEZONE}
        volumes:
            - ../:/var/www/symfony:cached
            - symfony_app_var:/var/www/symfony/var
            - symfony_app_vendor:/var/www/symfony/vendor
        networks:
            - symfony_app
        extra_hosts:
            - "host.docker.internal:host-gateway"    php:
        container_name: php
        build:
            context: ./php
            args:
                TIMEZONE: ${TIMEZONE}
        volumes:
            - ../:/var/www/symfony:cached
            - symfony_app_var:/var/www/symfony/var
            - symfony_app_vendor:/var/www/symfony/vendor
        networks:
            - symfony_app
        extra_hosts:
            - "host.docker.internal:host-gateway"
  localstack:
    container_name: localstack
    image: localstack/localstack
    ports:
      - "4566:4566"        # main edge port for all services
      - "4510-4559:4510-4559"  # optional: service-specific ports
    environment:
      - SERVICES=sqs       # only start SQS (you can add more: s3,sns,etc.)
      - DEBUG=1
      - DATA_DIR=/tmp/localstack/data
      - LOCALSTACK_API_KEY=${LOCALSTACK_API_KEY-}  # optional, for Pro
    volumes:
      - "./localstack:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
    networks:
      - symfony_app

Then I install all nessesary packages:

composer require symfony/amazon-sqs-messenger 

Symfony was configured like:

framework:
    messenger:
        transports:
            async: '%env(MESSENGER_TRANSPORT_DSN)%'
            failed: 'doctrine://default?table_name=failed_messages'
            sqs_channel_manager:
              dsn: 'sqs://localstack:4566'
              serializer: App\Infrastructure\Messenger\SqsJsonSerializer
              options:
                  access_key: '%env(AWS_ACCESS_KEY_ID)%'
                  secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
                  region: '%env(AWS_REGION)%'
                  queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'
                  sslmode: false

And then I listen to my queue:

php -d memory_limit=-1 bin/console messenger:consume async sqs_channel_manager -vv

But I get the following error:

18:32:12 INFO      [messenger] Try #1 after 1056ms: SSL: no alternative certificate subject name matches target host name 'localstack' for "https://localstack:4566/". ["count" => 1,"delay" => 1056]

Why??? Is there a way to disable ssl?


Solution

  • In order to disable ssl upon localstack and symfony you need to configure:

    Symfony

    messages.yaml

    framework:
        messenger:
            transports:
                async: '%env(MESSENGER_TRANSPORT_DSN)%'
                failed: 'doctrine://default?table_name=failed_messages'
                sqs_channel_manager:
                  dsn: 'sqs://localstack:4566'
                  serializer: App\Infrastructure\Messenger\SqsJsonSerializer
                  options:
                      access_key: '%env(AWS_ACCESS_KEY_ID)%'
                      secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
                      region: '%env(AWS_REGION)%'
                      queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'
                      endpoint: 'http://localstack:4566'
                      sslmode: disable # <<<<< Set disable here
    

    An alternative approach is via providing upon messages.yaml:

    framework:
        messenger:
            transports:
                async: '%env(MESSENGER_TRANSPORT_DSN)%'
                failed: 'doctrine://default?table_name=failed_messages'
                sqs_channel_manager:
                  dsn: 'sqs://localstack:4566'
                  serializer: App\Infrastructure\Messenger\SqsJsonSerializer
                  options:
                      access_key: '%env(AWS_ACCESS_KEY_ID)%'
                      secret_key: '%env(AWS_SECRET_ACCESS_KEY)%'
                      region: '%env(AWS_REGION)%'
                      queue_name: '%env(CHANNEL_MANAGER_QUEUE_NAME)%'
                      endpoint: 'http://localstack:4566'
    

    But set it upon .env as:

    MESSENGER_TRANSPORT_DSN='sqs://localstack:4566?sslmode=disable'
    

    Pay attention upon sslmode=disable when providing the DSN, this disable ssl.

    Localstack:

    services:
    
    # rest of services go here ommited fopr simplicitty
    
      localstack:
        container_name: localstack
        image: localstack/localstack
        ports:
          - "4566:4566"
          - "4510-4559:4510-4559"
        environment:
          - SERVICES=sqs
          - DEBUG=1
          - DATA_DIR=/tmp/localstack/data
          - LOCALSTACK_API_KEY=${LOCALSTACK_API_KEY-}  # optional, for Pro
          - USE_SSL=false << Disable ssl here
        volumes:
          - "./localstack:/var/lib/localstack"
          - "/var/run/docker.sock:/var/run/docker.sock"
        networks:
          - symfony_app