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

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

2023年12月31日

メニューへ戻る

最近ちょっと円高に振れましたが、依然として円安(142円)のために AWSの料金($ベース)が高くなってしまって困っているユーザーが多いでしょう。

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

こういう時こそお金をかけずにタダでやりくりするのがこのサイトです。

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

今これを書いているのが 2023年12月31日で、先月の11月16日に 3.0のリリースが発表されました。

AWSの諸々のサービスを Dockerコンテナでエミュレートするもので、カバーしているサービスの一覧はこちらです。
AWS Service Feature Coverage

※無償版で使えるのは「(Pro)」って付いてないもののみです。
ぶっちゃけると少ないのでガッカリしないで下さい。
$30/月 くらい払うとほとんど使えるようになりますのでそれも手かと思います。

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

Ubuntu Serverについては、
Ubuntu Linux Serverをインストール」と
Ubuntu Serverの初期設定」に書いた手順で作っています。

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

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

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

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


1.ダウンロード

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

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

subro@UbuntuServer2204-1:~$ curl -Lo localstack-cli-3.0.2-linux-amd64-onefile.tar.gz \
    https://github.com/localstack/localstack-cli/releases/download/v3.0.2/localstack-cli-3.0.2-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 35.4M  100 35.4M    0     0  8250k      0  0:00:04  0:00:04 --:--:-- 11.0M

subro@UbuntuServer2204-1:~$ ls -l localstack-cli-3.0.2-linux-amd64-onefile.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
-rw-rw-r-- 1 subro subro 37136120 12月 31 08:54 localstack-cli-3.0.2-linux-amd64-onefile.tar.gz

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


2.インストール

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

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

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

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


3.Localstack専用ユーザー作成

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

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

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

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

subro@UbuntuServer2204-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@UbuntuServer2204-1:~$ sudo usermod -G docker localstack

subro@UbuntuServer2204-1:~$ grep docker /etc/group
docker:x:999:localstack

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


4.Localstack開始

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

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

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

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

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

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

  The LocalStack Command Line Interface (CLI)

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

Commands:
  auth        (Beta) Authenticate with your LocalStack account
  completion  CLI shell completion
  config      Manage your LocalStack config
  logs        Show LocalStack logs
  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
  extensions  (Beta) Manage LocalStack extensions
  license     (Beta) Manage and verify your LocalStack license
  pod         Manage the state of your instance via Cloud Pods.
  state       (Beta) Export, restore, and reset LocalStack state.

Deprecated:
  login   (Deprecated) Login to the LocalStack Platform
  logout  (Deprecated) Log out from the LocalStack Platform

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

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

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

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

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

 💻 LocalStack CLI 3.0.2

[09:12:56] starting LocalStack in Docker mode 🐳                                                              localstack.py:495
───────────────── LocalStack Runtime Log (press CTRL-C to quit) ────────────────────────

LocalStack version: 3.0.3.dev
LocalStack Docker container id: be9281404c61
LocalStack build date: 2023-12-29
LocalStack build git hash: 563edf7a

2023-12-31T00:13:01.844  INFO --- [-functhread4] hypercorn.error            : Running on https://0.0.0.0:4566 (CTRL + C to quit)
2023-12-31T00:13:01.844  INFO --- [-functhread4] hypercorn.error            : Running on https://0.0.0.0:4566 (CTRL + C to quit)
Ready.

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

LocalStackの稼働状況を見てみます。

もう一つターミナルを開いて、Ubuntu Serverに [localstack]ユーザーでログインします。

localstack@UbuntuServer2204-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 │
└─────────────┴───────┘

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

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


5.Localstackで何かやってみる(S3の実験)

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

AWS用のコマンドラインツールとして、AWS CLI というのがありますが、「aws」コマンドをラッピングして「awslocal」というコマンドで簡単に LocalStackを使えるようにする Pythonのモジュールがあるようです。

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

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


次に AWS CLIをインストールします。

subro@Lubuntu2204:~$ sudo apt install -y awscli
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  docutils-common groff psutils python3-botocore python3-certifi python3-dateutil python3-docutils python3-idna python3-jmespath python3-pyasn1 python3-pygments python3-requests python3-roman
  python3-rsa python3-s3transfer python3-urllib3 sgml-base xml-core

〜〜〜 以下省略 〜〜〜

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

subro@Lubuntu2204:~$ sudo pip install awscli-local
Collecting awscli-local
  Downloading awscli-local-0.20.tar.gz (6.9 kB)
  Preparing metadata (setup.py) ... done
Collecting localstack-client
  Downloading localstack-client-2.0.tar.gz (10 kB)
  Preparing metadata (setup.py) ... done
Collecting boto3
  Downloading boto3-1.26.123-py3-none-any.whl (135 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 135.6/135.6 KB 5.5 MB/s eta 0:00:00

〜〜〜 以下省略 〜〜〜

rootでモジュール入れるな、と怒られていますが無視します。

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

subro@Lubuntu2204:~$ awslocal
To see help text, you can run:

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

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
aws: error: the following arguments are required: command

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

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

subro@Lubuntu2204:~$ 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

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

subro@Lubuntu2204:~$ cat .aws/config
[default]
region = us-east-1
output = json

subro@Lubuntu2204:~$ 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]ファイルにでも書いておけば良いと思います。

「UbuntuServer2204-1」は私の環境の Ubuntu Server 22.04.3のマシン名で、[/etc/hosts]ファイルで名前解決しています。

subro@Lubuntu2204:~$ export LOCALSTACK_HOST=UbuntuServer2204-1

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

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

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

ではやってみましょう。

subro@Lubuntu2204:~$ awslocal s3 mb s3://testbucket
make_bucket: testbucket

subro@Lubuntu2204:~$ awslocal s3 cp aaa.txt s3://testbucket
upload: ./aaa.txt to s3://testbucket/aaa.txt

subro@Lubuntu2204:~$ rm aaa.txt

subro@Lubuntu2204:~$ ls -l aaa.txt
ls: cannot access 'aaa.txt': No such file or directory

subro@Lubuntu2204:~$ awslocal s3 cp s3://testbucket/aaa.txt .
download: s3://testbucket/aaa.txt to ./aaa.txt

subro@Lubuntu2204:~$ ls -l aaa.txt
-rw-rw-r-- 1 subro subro 5 12月 31 09:28 aaa.txt

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


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

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

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


Lambdaは無償版でも動く!

AWS Lambda実践ガイド 第2版 (impress top gear) [ 大澤 文孝 ]

価格:3960円
(2023/12/31 09:33時点)
感想(0件)

AWSの基本・仕組み・重要用語が全部わかる教科書 [ 川畑光平 ]

価格:2970円
(2023/12/31 09:34時点)
感想(0件)