😺

s3rverにlocalhost以外のhost名でアクセスする方法

2022/01/20に公開約2,100字

はじめに

docker-compose で serverless framework の 開発環境(ローカル) を構築する際に、s3rverへlocalhostではないhost名でアクセスしようとして苦戦したため、備忘録として投稿させていただきます。

実現したかったこと

  1. ブラウザから s3rverに保存したオブジェクトの閲覧
  2. appコンテナ から、s3rverコンテナ へのアップロード

修正前

docker-compose

docker-compose.yml
version: '3'
services:
  app:
    image: app
    restart: always
    ports:
      - 3000:3000
  s3rver:
    image: s3rver
    container_name: s3rver
    restart: always
    ports:
      - 4569:4569

s3rver

特別な設定は行わずにs3rverを起動。

main.js
new S3rver({
  address: '0.0.0.0',
  port: 4569,
  // 省略
});

app

s3rverのコンテナをエンドポイントにして、オブジェクトをアップロード。

handler.js
// S3クライアントをインスタンス化
const S3 = new AWS.S3({
    // 省略
    endpoint: new AWS.Endpoint('http://s3rver:4569'),
    // 省略
  });

// S3にオブジェクトをアップロード
S3.putObject({ // 省略 });
// → 失敗

解決方法

  1. s3rverコンテナにs3サブドメインを付与する
  2. s3rver起動時に「serviceEndpoint」オプションでhost名を設定する
  3. オブジェクトを操作するときに、s3サブドメインを付与してリクエストする

修正後

docker-compose

  1. s3rverコンテナにs3サブドメインを付与する
docker-compose.yml
version: '3'
services:
  app:
    image: app
    restart: always
    ports:
      - 3000:3000
- s3rver:
+ s3.s3rver:
    image: s3rver
_   container_name: s3rver
+   container_name: s3.s3rver
    restart: always
    ports:
      - 4569:4569

app

  1. s3rver起動時に「serviceEndpoint」オプションでhost名を設定する
main.js
new S3rver({
  address: '0.0.0.0',
  port: 4569,
+ serviceEndpoint: 's3rver',
  // 省略
});

s3rver

  1. オブジェクトを操作するときに、s3サブドメインを付与してリクエストする
handler.js
// S3クライアントをインスタンス化
const S3 = new AWS.S3({
    // 省略
-   endpoint: new AWS.Endpoint('http://s3rver:4569'),
+   endpoint: new AWS.Endpoint('http://s3.s3rver:4569'),
    // 省略
  });

// S3にオブジェクトをアップロード
S3.putObject({ // 省略 });
// → 成功

参考

Discussion

ログインするとコメントできます