タダで 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
有償版も以前よりサービス価格が細分化されて却って高くなった印象です。
$39/月でやっと一番弱い有償版の「Base」が使えますが、毎月となるとお勉強代としてはちょっと高過ぎるか…。
1.環境
ここでは、LocalStackの無償版を Ubuntu Server 24.04にインストールします。
Ubuntu Serverについては、
「Ubuntu 24.04 Server インストール」に書いた手順で作っています。
上記の通り Dockerが必要ですので、その環境構築は
「Dockerエンジン インストール」に書いた手順でやりました。
いくつかインストール方法がありますが、ここでは「LocalStack CLI」方式にします。
インストール手順は以下に載っています。
Installing LocalStack CLI
ここに OS毎のインストール方法がタブで分かれていますので、[Linux]タブを選びます。
以下、インストールは公式の手順に沿って進めます。
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 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に対して以下の作業をしてみます。
- S3に [testbucket]バケットを作る
- ローカルの [aaa.txt]ファイルを [testbucket]バケットに入れる
- ローカルの [aaa.txt]ファイルを消す
- [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は無償版でも動く!