😺
【s3rver】localhost以外のhost名でアクセスする方法
はじめに
docker-compose で serverless framework の 開発環境(ローカル) を構築する際に、s3rverへlocalhostではないhost名でアクセスしようとして苦戦したため、備忘録として投稿させていただきます。
実現したかったこと
- ブラウザから s3rverに保存したオブジェクトの閲覧
- 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({ // 省略 });
// → 失敗
解決方法
- s3rverコンテナにs3サブドメインを付与する
- s3rver起動時に「serviceEndpoint」オプションでhost名を設定する
- オブジェクトを操作するときに、s3サブドメインを付与してリクエストする
修正後
docker-compose
- 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
- s3rver起動時に「serviceEndpoint」オプションでhost名を設定する
main.js
new S3rver({
address: '0.0.0.0',
port: 4569,
+ serviceEndpoint: 's3rver',
// 省略
});
s3rver
- オブジェクトを操作するときに、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