Help us understand the problem. What is going on with this article?

LocalStackをDockerコンテナ内で使う場合に、SQSのQueueUrlがlocalhostになって困った話(解決済み)

More than 1 year has passed since last update.

はじめに

LocalStackは、AWSの各サービスをローカルで再現するためのフェイク環境です。
公式のDockerイメージを使うと便利です。

localstackは、AWS Summit Tokyo 2017での@twadaの講演で聞いたことがありましたが、今回初めて使いました。

Dockerコンテナ内でLocalStackを使う

下記のように、Dockerコンテナを構成していたとします。

# docker-compose.yml
version: '3'
services:
  app:
    build: .
    env_file: .env
    volumes:
      - .:/app
      - ~/.aws:/root/.aws
    working_dir: /app
    links:
      - localstack
  localstack:
    image: localstack/localstack
    ports:
      - '8080:8080'
      - '4576:4576' # For SQS

appコンテナから任意のQueueにメッセージを送信しようとすると、QueueUrlhttp://localhost:4576/queue/{QueueName}となり、下記のようにエラーが発生します。

Aws\Sqs\Exception\SqsException: Error executing "SendMessage" on "http://localhost:4576/queue/{QueueName}"; 
AWS HTTP error: cURL error 7: Failed to connect to localhost port 4576: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

appコンテナとlocalstackコンテナは、別のIPアドレスになるわけで、localhostではなくホスト名のlocalstackでアクセスしたいのですが、何故かlocalhostQueueUrlを返してきます。
もちろん、endpointは、http://localstack:4576を指定しています。

解決方法

READMEに解決方法が記載されていました。

`HOSTNAME_EXTERNAL`: Name of the host to expose the services externally (defaults to `localhost`). 
This host is used, e.g., when returning queue URLs from the SQS service to the client.

要するに、環境変数HOSTNAME_EXTERNALlocalstackを指定すればいいのです。

# docker-compose.yml
  localstack:
    image: localstack/localstack
    environment:
      - HOSTNAME_EXTERNAL=localstack

無事、QueueUrlhttp://localstack:4576/queue/{QueueName}となり、メッセージを送受信できるようになりました。

おわりに

@twadaが講演の中でおっしゃっていますが、LocalStackのようなFake Objectを使うことで、テストのために、依存ライブラリをインストールする必要がなくなり、テストもスッキリしますし、素早く開発が行えます。

今回のように、つまづくポイントがあったら、一つ一つ記事にしていきたいと思います。
ではでは。

photocreate
ITの力で、写真を通じて感動があふれかえる社会を実現する「フォトライフ構想」を目指すWebサービスを展開しています
https://www.photocreate.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした