お金をかけずにサーバーの勉強をしよう

LocalStackを使う (AWSエミュレーター)

2025年8月9日

メニューへ戻る

タダで AWSを味わいたい

先日まで円高に振れていましたが、再び150円を突くなど依然として円安(147円)のために AWSの料金($ベース)が高くなってしまって困っているユーザーが多いでしょう。

円高の時でさえ検証のために AWS(のみならず他のパブリッククラウドも)を使うのは割高だと言うのに、貧乏ITエンジニアには死活問題です。

こういう時こそお金をかけずにタダでやりくりするのが弊ホームページであります。

ここでは AWSエミュレーターをご紹介します。
LocalStack

今これを書いている時点の最新版は 4.7となっており、着々とメンテナンスがされておりますね。

LocalStackは AWSの諸々のサービスを Dockerコンテナでエミュレートするもので、有償版・無償版(Free)それぞれがカバーしているサービスは以下の URLの「Compare all subscriptions」にある「LocalStack for AWS: Emulated Services」で一覧されています。
Choose your plan

※ぶっちゃけると無償版(Free)で使えるものはかなり少ないのでガッカリしないで下さい。
有償版も以前よりサービス価格が細分化されて却って高くなった印象です。
$39/月でやっと一番弱い有償版の「Base」が使えますが、毎月となるとお勉強代としてはちょっと高過ぎるか…。


1.環境

ここでは、LocalStackの無償版を Ubuntu Server 24.04にインストールします。

Ubuntu Serverについては、
Ubuntu 24.04 Server インストール」に書いた手順で作っています。

上記の通り Dockerが必要ですので、その環境構築は
Dockerエンジン インストール」に書いた手順でやりました。

いくつかインストール方法がありますが、ここでは「LocalStack CLI」方式にします。
インストール手順は以下に載っています。
Installing LocalStack CLI

ここに OS毎のインストール方法がタブで分かれていますので、[Linux]タブを選びます。
タブ選択 1

以下、インストールは公式の手順に沿って進めます。


2.ダウンロード

私は VMware Workstation Proの仮想マシンとして Ubuntu Serverの環境を作っていますから、手順にあるダウンロードの対象は [x86-64]の方になります。

curlコマンドを使ってダウンロードします。

subro@UbuntuServer2404-1:~$ curl --output localstack-cli-4.7.0-linux-amd64-onefile.tar.gz --location https://github.com/localstack/localstack-cli/releases/download/v4.7.0/localstack-cli-4.7.0-linux-amd64-onefile.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 39.3M  100 39.3M    0     0  8922k      0  0:00:04  0:00:04 --:--:-- 10.0M

subro@UbuntuServer2404-1:~$ ls -l localstack-cli-4.7.0-linux-amd64-onefile.tar.gz
-rw-rw-r-- 1 subro subro 41304373  8月  9 16:13 localstack-cli-4.7.0-linux-amd64-onefile.tar.gz

ダウンロードできました。


3.LocalStack CLI インストール

ダウンロードした圧縮ファイルを解凍します。
sudoコマンドを使っているので [root]ユーザーとして作業しているのと同じ扱いです。

subro@UbuntuServer2404-1:~$ sudo tar xvzf localstack-cli-4.7.0-linux-*-onefile.tar.gz -C /usr/local/bin
localstack

解凍して「Localstack CLI」と呼ばれる localstackコマンドが [/usr/local/bin]に展開されました。

これでインストール完了です。


4.Localstack専用ユーザー作成

これは公式の手順にありませんし、必須ではないのですが、サーバーの運用ではソフト毎に専用ユーザーを作ることはよくあります。

対象のソフトに関する環境変数を独自に持たせたい等の理由が多いですね。

Localstackにおいては Dockerを使う関係で、OSの [docker]グループに Localstackの管理ユーザーを含めたい(Docker利用に対してはセキュリティが緩くなる方向)ので、ユーザーを分けようというものです。

[localstack]ユーザーを新規作成することにします。

subro@UbuntuServer2404-1:~$ sudo adduser localstack
ユーザー `localstack' を追加しています...
新しいグループ `localstack' (1001) を追加しています...
新しいユーザー `localstack' (1001) をグループ `localstack' に追加しています...
ホームディレクトリ `/home/localstack' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい パスワード: [localstack]ユーザーの新規パスワードを入れる
新しい パスワードを再入力してください: パスワードをもう一回
passwd: パスワードは正しく更新されました
localstack のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
        フルネーム []: User for Localstack ←任意
        部屋番号 []:
        職場電話番号 []:
        自宅電話番号 []:
        その他 []:
以上で正しいですか? [Y/n] Y

[localstack]ユーザーができました。

[localstack]ユーザーが Docker使用時に root権限を必要としないよう、[docker]グループに所属させます。

subro@UbuntuServer2404-1:~$ sudo usermod -G docker localstack

subro@UbuntuServer2404-1:~$ grep docker /etc/group
docker:x:988:localstack

[localstack]ユーザーが、[/etc/group]ファイルの [docker]の行に追加され、同グループに所属していることがわかります。


5.Localstack開始

一度 Ubuntu Serverからログアウトして、[localstack]ユーザーでログインし直します。

バージョン確認をします。

localstack@UbuntuServer2404-1:~$ localstack --version
3.0.2

2023年12月31時点で 3.0.2 になりました。

localstackコマンドでヘルプを出してみます。

localstack@UbuntuServer2404-1:~$ localstack -h
Usage: localstack [OPTIONS] COMMAND [ARGS]...

  The LocalStack Command Line Interface (CLI)

Options:
  -v, --version       Show the version of the LocalStack CLI and exit
  -d, --debug         Enable CLI debugging mode
  -p, --profile TEXT  Set the configuration profile
  -h, --help          Show this message and exit.

Commands:
  auth        Authenticate with your LocalStack account
  completion  CLI shell completion
  config      Manage your LocalStack config
  logs        Show LocalStack logs
  restart     Restart LocalStack
  ssh         Obtain a shell in LocalStack
  start       Start LocalStack
  status      Query status info
  stop        Stop LocalStack
  update      Update LocalStack
  wait        Wait for LocalStack

Advanced:
  aws         Access additional functionality on LocalStack AWS Services
  dns         Manage LocalStack DNS host config
  ephemeral   (Preview) Manage ephemeral LocalStack instances
  extensions  (Preview) Manage LocalStack extensions
  license     (Preview) Manage and verify your LocalStack license
  pod         Manage the state of your instance via Cloud Pods.
  replicator  (Preview) Start a replication job or check its status
  state       (Preview) Export, restore, and reset LocalStack state.

Localstack CLIは使えるようになっていますね。

では実行してみましょう。

デフォルトのままだと [127.0.0.1](localhost) にバインドされてしまって外部からアクセスできませんでしたので、[GATEWAY_LISTEN] という変数を与えています。
Configuration(の Coreの段落)

localstack@UbuntuServer2404-1:~$ GATEWAY_LISTEN=0.0.0.0:4566 localstack start

     __                     _______ __             __
    / /   ____  _________ _/ / ___// /_____ ______/ /__
   / /   / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
  / /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
 /_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|

- LocalStack CLI: 4.7.0
- Profile: default
- App: https://app.localstack.cloud

[16:27:36] starting LocalStack in Docker mode 🐳                                 localstack.py:532
           container image not found on host                                      bootstrap.py:1298
[16:28:36] download complete                                                      bootstrap.py:1302
2025-08-09T16:28:36.604  WARN --- [  MainThread] localstack.utils.bootstrap : Non-prefixed environment
variable GATEWAY_LISTEN is forwarded to the LocalStack container! Please use `LOCALSTACK_GATEWAY_LISTEN`
instead of GATEWAY_LISTEN to explicitly mark this environment variable to be forwarded from the CLI to
the LocalStack Runtime.
──── LocalStack Runtime Log (press CTRL-C to quit) ───

LocalStack version: 4.7.1.dev29
LocalStack build date: 2025-08-08
LocalStack build git hash: c1d19e211

Ready.

動き出しました。
初回は Dockerコンテナのダウンロードでちょっと時間がかかります。

※[GATEWAY_LISTEN]環境変数の利用につきワーニングが出ていて、代わりに[LOCALSTACK_GATEWAY_LISTEN]環境変数を使うように書かれていますが、コレはマニュアルに記載なし。
[GATEWAY_LISTEN]環境変数はその名前のままコンテナに渡されてしまうんで「LocalStack CLIから渡したもの」と明確に分かるようにするため[LOCALSTACK_GATEWAY_LISTEN]環境変数を使えってことみたいです。
試しに [LOCALSTACK_GATEWAY_LISTEN]環境変数にして起動してみましたらワーニングが出なくなりましたが、[127.0.0.1]にバインドされてしまって他ノードからのアクセスができなくなってしまいました。
完全にローカルでやるなら [LOCALSTACK_GATEWAY_LISTEN]環境変数で良いとは思いますが、この辺がどうなんだか良く分かりませんでした。

LocalStackの稼働状況を見てみます。
もう一つターミナルを開いて、Ubuntu Serverに [localstack]ユーザーでログインします。

localstack@UbuntuServer2404-1:~$ localstack status services
┏━━━━━━━━━━━━━┳━━━━━━┓
┃ Service                  ┃ Status      ┃
┡━━━━━━━━━━━━━╇━━━━━━┩
│ acm                      │ ✔ available │
│ apigateway               │ ✔ available │
│ cloudformation           │ ✔ available │
│ cloudwatch               │ ✔ available │
│ config                   │ ✔ available │
│ dynamodb                 │ ✔ available │
│ dynamodbstreams          │ ✔ available │
│ ec2                      │ ✔ available │
│ es                       │ ✔ available │
│ events                   │ ✔ available │
│ firehose                 │ ✔ available │
│ iam                      │ ✔ available │
│ kinesis                  │ ✔ available │
│ kms                      │ ✔ available │
│ lambda                   │ ✔ available │
│ logs                     │ ✔ available │
│ opensearch               │ ✔ available │
│ redshift                 │ ✔ available │
│ resource-groups          │ ✔ available │
│ resourcegroupstaggingapi │ ✔ available │
│ route53                  │ ✔ available │
│ route53resolver          │ ✔ available │
│ s3                       │ ✔ available │
│ s3control                │ ✔ available │
│ scheduler                │ ✔ available │
│ secretsmanager           │ ✔ available │
│ ses                      │ ✔ available │
│ sns                      │ ✔ available │
│ sqs                      │ ✔ available │
│ ssm                      │ ✔ available │
│ stepfunctions            │ ✔ available │
│ sts                      │ ✔ available │
│ support                  │ ✔ available │
│ swf                      │ ✔ available │
│ transcribe               │ ✔ available │
└─────────────┴──────┘

一通り動いている…のだと思います。

一杯サービスが上がっているようでいて、無料版だと殆ど使えないのが悲しい…。


6.Localstackを外部から使うための準備

私が普段使いしている Lubuntu 24.04のクライアントから何かやってみましょう。

AWS用のコマンドラインツールとして「AWS CLI」というのがありますが、これは(本物の)AWSを相手に動作するものです。

一方で「AWS CLI」の awsコマンドをラッピングした LocalStack専用の awslocalコマンドというもので簡単に LocalStackを使えるようにする Pythonのモジュールがあるようです。

Pythonの [pip]コマンドを使えるようにパッケージをインストールしておきましょう。

subro@Lubuntu2404:~$ sudo apt install python3-pip


次にコマンド本体の AWS CLIをインストールします。
(以前は aptリポジトリかららの取得でしたが、今は snap版ができています。)

subro@Lubuntu2404:~$ sudo snap install aws-cli --classic
aws-cli (v2/stable) 2.27.53 from Amazon Web Services (aws✓) installed

LocalStack用の Pythonモジュールで、awsコマンドを awslocalコマンドにするラッパーをインストールします。

このページの本筋ではないのですが…
Ubuntuで Pythonモジュールを Ubuntuの管理ではない外部から得ようとすると怒られるので、回避策として先に Pythonの仮想環境を作ります。

[python3.12-venv]パッケージをインストールします。

subro@Lubuntu2404:~$ sudo apt -y install python3.12-venv

インストールできました。

Pythonの仮想環境を「localstack-env」という名前で作ります。

subro@Lubuntu2404:~$ python3 -m venv localstack-env

何も出ませんが [localstack-env]仮想環境ができました。

[localstack-env]仮想環境利用に移ります。

subro@Lubuntu2404:~$ source localstack-env/bin/activate

(localstack-env) subro@Lubuntu2404:~$

コマンドプロンプトの頭に仮想環境名が現れています。

これでやっとラッパーをインストールできます。

(localstack-env) subro@Lubuntu2404:~$ sudo localstack-env/bin/pip3 install awscli-local
Collecting awscli-local
  Downloading awscli_local-0.22.2-py3-none-any.whl.metadata (8.0 kB)
Collecting localstack-client (from awscli-local)
  Downloading localstack_client-2.10.tar.gz (11 kB)
  Installing build dependencies ... done
  Getting requirements to build wheel ... done
  Preparing metadata (pyproject.toml) ... done
Collecting boto3 (from localstack-client->awscli-local)
〜〜〜 以下省略 〜〜〜

インストールできました。

awslocalコマンドを実行してみます。

(localstack-env) subro@Lubuntu2404:~$ awslocal
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

aws: error: the following arguments are required: command

動いていますがヘルプは awsコマンドそのまんまです。

awsコマンドを使う時の初期設定をします。
(これは awslocalコマンドではなく awsコマンドでやるようです)
設定値は適当で、jsonだけ本当です。

(localstack-env) subro@Lubuntu2404:~$ aws configure
AWS Access Key ID [None]: TEST
AWS Secret Access Key [None]: TEST
Default region name [None]: us-east-1
Default output format [None]: json

こんなファイルができました。

(localstack-env) subro@Lubuntu2404:~$ cat .aws/config
[default]
region = us-east-1
output = json

(localstack-env) subro@Lubuntu2404:~$ cat .aws/credentials
[default]
aws_access_key_id = TEST
aws_secret_access_key = TEST

これでやっと AWS CLI(のラッパーの awslocalコマンド)を使って作業ができるのですが、awsコマンドそのものではなく awslocalコマンドを使う利点は何でしょうか。

awsコマンドは本物の AWSを相手にするコマンドなので、LocalStackを使う場合は一々 [--endpoint-url]オプションでアクセス先を LocalStackのサーバーへと指定しないといけないのです。
これは面倒臭いし、コマンドも長くなってしまっていけません。

これに対し awslocalコマンドは [LOCALSTACK_HOST]環境変数を拾ってくれるので、この変数に LocalStackサーバーの IPかホスト名を指定しておけば [--endpoint-url]を指定したのと同じことになるのでコマンドがスッキリします。

今回はシェル上で環境変数を直接設定しますが、[~/.profile]ファイルか [~/.bashrc]ファイルにでも書いておけば良いと思います。

[LOCALSTACK_HOST]環境変数を設定します。
(私の Lubuntu 24.04では「UbuntuServer2404-1」というマシン名を [/etc/hosts]ファイルで名前解決していますのでマシン名指定にしています。)

(localstack-env) subro@Lubuntu2404:~$ export LOCALSTACK_HOST=UbuntuServer2404-1

環境変数設定ができました。

これで準備は OKです。


7.Localstackの S3を使ってみる

LocalStackに対して以下の作業をしてみます。

  1. S3に [testbucket]バケットを作る
  2. ローカルの [aaa.txt]ファイルを [testbucket]バケットに入れる
  3. ローカルの [aaa.txt]ファイルを消す
  4. [testbucket]バケットからローカルに [aaa.txt]ファイルを戻す

ではやってみましょう。

(localstack-env) subro@Lubuntu2404:~$ echo "AAAAA" > aaa.txt

(localstack-env) subro@Lubuntu2404:~$ awslocal s3 mb s3://testbucket
make_bucket: testbucket

(localstack-env) subro@Lubuntu2404:~$ awslocal s3 cp aaa.txt s3://testbucket
upload: ./aaa.txt to s3://testbucket/aaa.txt

(localstack-env) subro@Lubuntu2404:~$ rm aaa.txt

(localstack-env) subro@Lubuntu2404:~$ ls -l aaa.txt
ls: 'aaa.txt' にアクセスできません: そのようなファイルやディレクトリはありません

(localstack-env) subro@Lubuntu2404:~$ awslocal s3 cp s3://testbucket/aaa.txt .
download: s3://testbucket/aaa.txt to ./aaa.txt

(localstack-env) subro@Lubuntu2404:~$ ls -l aaa.txt
-rw-rw-r-- 1 subro subro 6  8月  9 17:45 aaa.txt

ちゃんとバケットに入れたファイルを戻せました。


==========
ここでやってみたのは LocalStackの数ある機能の 1つに過ぎません。
2017年頃に触っていた頃はまだ対応している機能が少なかった気がしますが、いつの間にか随分と充実したようです。

LocalStackのホームページでは開発・テストを LocalStackでやって本番(AWS)へのデプロイという絵を描いていましたから、AWSのお勉強や教育には最適な環境じゃないかと思います。

でも本当に残念なのは無償版だと使える機能が少ないこと。
有償版を使いたいけど、個人ではキツいかな〜。
円安が恨めしい…


Lambdaは無償版でも動く!