執筆:  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

services:
  localstack-container:
    image: localstack/localstack
    ports:
      - "4566:4566"
    environment:
      - SERVICES=s3
      - DEBUG=1
    volumes:
      - ./localstack/init_s3.sh:/etc/localstack/init/ready.d/init-aws.sh
  python-app:
    build:
      context: .
    tty: true
    env_file: .env
    volumes:
      - ./src:/app/src

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

・Dockerfile

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

FROM python:3.13-slim-bullseye

RUN pip install boto3

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

AWS_ACCESS_KEY_ID=test
AWS_SECRET_ACCESS_KEY=test
AWS_DEFAULT_REGION=test

・init_s3.sh

#!/bin/bash

BUCKET_NAME="test-bucket001"

# バケット作成
awslocal s3 mb "s3://${BUCKET_NAME}"

# CORSの設定
CORS_CONFIG='{
    "CORSRules": [
        {
            "AllowedHeaders": ["*"],
            "AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
            "AllowedOrigins": ["*"],
            "ExposeHeaders": ["ETag"]
        }
    ]
}'
awslocal s3api put-bucket-cors --bucket "${BUCKET_NAME}" \
  --cors-configuration "$CORS_CONFIG"

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

・main.py

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

・main.py

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

import boto3

ENDPOINT_URL = 'http://localstack-container:4566'
s3 = boto3.client('s3', endpoint_url=ENDPOINT_URL)
# ファイルをアップロード
with open('/app/src/hello.txt', 'rb') as f:
    s3.upload_fileobj(f, 'test-bucket001', 'test/hello.txt')

起動

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/