はじめに
LocalStackを利用することで、ローカル環境でAWSサービスを再現し、開発やテストを行うことができます。
通常、AWS CLIやAWS SDKを使用してLocalStackリソースを操作しますが、ローカル環境にこれらのツールを直接インストールするのではなく、Dockerを使用することで、より簡単で効率的なクライアント環境を構築することができます。
本記事では、DockerでLocalStack用のクライアント環境を作成しましたので、その環境について解説します。
GitHubリポジトリ
本記事で解説するコードは以下のGitHubリポジトリからダウンロードできます。
https://github.com/hdkzkg/localstack-sample
コンテナ起動
VS Codeの拡張機能DevContainer
を使用しています。DevContainer
をインストールしていない方は、先にインストールしてください。
VS Codeを利用しない方も、docker compose
コマンドでコンテナを起動できます。
動作確認
動作確認はlocalstack-client
コンテナにログインする必要があります。
VS CodeのDevContainerでコンテナ起動した方は、VS Codeのターミナルを開くと、localstack-client
のターミナルが表示されます。
docker compose
コマンドでコンテナを起動した方は、以下のコマンドでlocalstack-client
にログインしてください。
docker exec -it localstack-client /bin/bash
AWS CLI
AWS CLIでバケットを作成します。以下のコマンドを実行してください。
awslocal s3api create-bucket --bucket sample-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1
バケット作成に成功すると以下のレスポンスが返ってきます。AWS CLIでバケットが作成できることが確認できました。
{
"Location": "http://sample-bucket.s3.localhost.localstack.cloud:4566/"
}
AWS SDKの確認用に別のバケットも作成します。
root@5a60ab62c85f:/workspace# awslocal s3api create-bucket --bucket sample-bucket2 --create-bucket-configuration LocationConstraint=ap-northeast-1
{
"Location": "http://sample-bucket2.s3.localhost.localstack.cloud:4566/"
}
AWS SDK
AWS SDKはPythonのboto3を使用して、S3のバケット一覧を取得しています。以下のコマンドを実行してください。
python -m client.sdk_src.s3.lists
以下の結果となり、AWS CLIで作成したバケットが取得できました。
sample-bucket
sample-bucket2
コード解説
docker-compose.yml
今回作成したdocker-compose.ymlファイルは下記の通りです。
version: "3.8"
services:
localstack:
container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}"
image: localstack/localstack
ports:
- "127.0.0.1:4566:4566" # LocalStack Gateway
- "127.0.0.1:4510-4559:4510-4559" # external services port range
environment:
# LocalStack configuration: https://docs.localstack.cloud/references/configuration/
- DEBUG=${DEBUG:-0}
volumes:
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
- "/var/run/docker.sock:/var/run/docker.sock"
localstack_client:
container_name: localstack-client
build:
context: .
dockerfile: ./docker/client/Dockerfile
tty: true
environment:
- LOCALSTACK_HOST=host.docker.internal
- AWS_DEFAULT_REGION=ap-northeast-1
volumes:
- "./:/workspace"
depends_on:
- localstack
localstack
LocalStackのサービスです。公式ページのCommunity版のdocker-compose.yml
を使用しています。
Community版は無料で利用できますが、一部サービスが扱えない、コンテナを停止するとリソースが削除されるなどの制約があります。有料のPro版もあります。
localstack_client
ビルド対象のDockerfileは以下の通りです。
FROM python:3.10-slim
WORKDIR /workspace
RUN apt-get update
RUN pip install awscli awscli-local localstack-client
ポイント以下の通りです。
1行目 FROM python:3.10-slim
AWS SDKでは、Pythonを使用します。Pythonでは公式から後述するライブラリが提供されています。
4行目 RUN pip install awscli awscli-local localstack-client
awscli:AWS CLIを使用するためのツールです。
awscli-local:LocalStackへアクセスする際に使用する、awscliのラッパーです。
awscliでは、
aws --endpoint-url=http://localhost:4566 s3api create-bucket --bucket sample-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1
というように--endpoint-url
を都度指定する必要がありますが、awscli-localでは、
awslocal s3api create-bucket --bucket sample-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1
のように、--endpoint-url
を省略できます。
localstack-client:
LocalStackの公式からAWS SDK Pythonで簡単に利用できるためのライブラリが提供されているため、このライブラリを使用します。このライブラリを使用することで、boto3利用のコードを書く際にendpoint_url
などの指定をする必要がなくなるため便利です。
docker-compose.ymlのenvironment:
awslocal、localstack-clientでは、endpoint_url
のデフォルト値はhttp://localhost:4566
となっています。localstackとlocalstack-clientは別コンテナのためlocalstack-clientからlocalhost
でlocalstackコンテナを参照でないので、LOCALSTACK_HOST=host.docker.internal
としています。
まとめ
本記事では、LocalStackとLocalStackのクライアント環境構築について解説しました。クラウドサービスを直接利用することを避けたい場合は、こちらの環境を使って開発やAWSリソースを扱う練習をしていきたいと思います。
コメント