2025/10/27エンジニア

    PythonでLocalStackのS3を使う

    執筆:  S.K

    はじめに

    今回紹介するのは「LocalStack」になります。LocalStackはAWS(S3など)の主要サービスをローカルで再現でき、開発・テストが低コストかつ安全に行えます。LocalStackとPythonアプリケーションをどちらもDockerコンテナで動かす方法を紹介します。

    前提

    ・Docker

    ・Docker Compose

    プロジェクト構成

    まずはプロジェクトのディレクトリ構成例です。

    ├── Dockerfile

    ├── compose.yaml

    ├── .env

    ├── localstack

    │   └── init_s3.sh

    └── src

        ├── hello.txt

        └── main.py

    実装してみよう

    ・compose.yaml

    LocalStackの公式イメージを使用します。コンテナの起動時に/etc/localstack/init/ready.d/init-aws.shが実行されるためここにバケットを作成する初期化スクリプトを配置します。

    ・Dockerfile

    Pythonコンテナ用のDockerfileです。S3を使用するためboto3をインストールしています。

    ・.env
    .envにはAWSのcredentialsを設定します。LocalStackを使用する時は実際のキー情報ではなく適当な値でいいです。

    ・init_s3.sh

    LocalStackコンテナ起動時に実行されるスクリプトです。awslocalを使用してバケットの作成などをします。以下はバケット作成とCORSの設定をする例です。

    ・main.py

    LocalStackのS3にアップロードするスクリプトです。endpoint_urlを設定することでLocalStackのS3を対象にできます。

    ・main.py

    LocalStackのS3にアップロードするスクリプトです。endpoint_urlを設定することでLocalStackのS3を対象にできます。

    起動

    docker compose up -d でコンテナを起動します。Localstackのコンテナログを確認すると初期化スクリプトが実行されていることを確認できます。

    pythonコンテナに入りmain.pyを実行してhello.txtをLocalStackのアップロードしてみます。

    ホストマシンでhttp://localhost:4566/test-bucket001/test/hello.txtにアクセスするとアップロードしたファイルを確認できます。

    まとめ

    LocalStackを使えば、AWS S3の操作もローカルで簡単に開発・テストできます。本番環境に移行するときも、エンドポイントをAWSの実際のURLに変更するだけで済むのでとても便利です。

    参考文献

    https://zenn.dev/toc/articles/6a5fc2a0be2571

    https://www.localstack.cloud/