執筆: 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に変更するだけで済むのでとても便利です。