Slide 1

Slide 1 text

S3 を使うアプリケーションを ローカル完結で動かすことに 全力を注いでみた 2026-08-07 多摩.dev #4 Daisuke Garaike

Slide 2

Slide 2 text

課題 1 AWS が外部サービス

Slide 3

Slide 3 text

終 制作・著作 gara

Slide 4

Slide 4 text

LocalStack を使う ● Docker ● compose.yaml services: app: environment: AWS_S3_ENDPOINT: http://localstack:4566/ localstack: image: localstack/localstack-pro:latest environment: LOCALSTACK_AUTH_TOKEN: ${TOKEN} 4

Slide 5

Slide 5 text

課題 2 ブラウザから 署名付き URL が叩けない

Slide 6

Slide 6 text

署名付き URL ● バックエンドを経由せずに S3 のファイルを使える ● ブラウザからアクセスする 6

Slide 7

Slide 7 text

なぜブラウザから署名付き URL が叩けないのか services: app: environment: AWS_S3_ENDPOINT: http://localstack:4566/ ● アプリが発行する署名付き URL は、 http://[BUCKET].localstack:4566/ ● もちろん名前解決できない 7

Slide 8

Slide 8 text

*.localhost.localstack.cloud ● localhost に名前解決される ○ *.localhost.localstack.cloud -> localhost.localstack.cloud -> localhost 8

Slide 9

Slide 9 text

アプリで localstack に向ける必要がある services: app: environment: AWS_S3_ENDPOINT: http://s3.localhost.localstack.cloud:4566/ localstack: image: localstack/localstack-pro:latest networks: default: aliases: - s3.localhost.localstack.cloud environment: 9 LOCALSTACK_AUTH_TOKEN: ${TOKEN}

Slide 10

Slide 10 text

無事にブラウザから署名付き URL が叩ける ● [BUCKET].s3.localhost.localstack.cloud:4566 -> localhost.localstack.cloud:4566 -> localhost:4566 ○ LocalStack のコンテナが 4566 を ローカルにマッピングする必要あり 10

Slide 11

Slide 11 text

終 制作・著作 gara

Slide 12

Slide 12 text

課題 3 え? オフラインで動かない?

Slide 13

Slide 13 text

LocalStack はオフラインでは動かない services: localstack: image: localstack/localstack-pro:latest environment: LOCALSTACK_AUTH_TOKEN: ${TOKEN} ● トークン認証 ● 公開 DNS による *.localhost.localstack.cloud 解決 13

Slide 14

Slide 14 text

LocalStack やめよう ● MinIO を使おう ○ 追記: MinIO は登壇時点でメンテナンスを 終了しているようです。 使用する際は自己責任でお願いいたします。 MinIO の他にも S3 フェイクを実現する サービスはあるので、それらを使うことを 推奨いたします。 14

Slide 15

Slide 15 text

トークン認証は解決するが、公開 DNS 問題は? ● *.localhost は、localhost になる ○ RFC 6761 “Special-Use Domain Names” (2013) ○ 外部の DNS に問い合わせずにループバック ● MinIO に自分は s3.localhost だと 思わせれば勝ち ○ [BUCKET].s3.localhost -> localhost ○ MINIO_DOMAIN で指定可能 15

Slide 16

Slide 16 text

オフラインでも動くローカル完結アプリの完成 services: app: environment: AWS_S3_ENDPOINT: http://s3.localhost:9000/ minio: image: minio/minio:latest networks: default: aliases: - s3.localhost environment: MINIO_DOMAIN: s3.localhost 16

Slide 17

Slide 17 text

S3 は ローカルでかつ オフラインで 動かせる 終 制作・著作 gara