最近ちょっと円高に振れましたが、依然として円安(142円)のために AWSの料金($ベース)が高くなってしまって困っているユーザーが多いでしょう。
円高の時でさえ検証のために AWS(のみならず他のパブリッククラウドも)を使うのは割高だと言うのに、貧乏サーバーエンジニアや貧乏プログラマーにとっては死活問題です。
こういう時こそお金をかけずにタダでやりくりするのがこのサイトです。
ここでは AWSエミュレーターをご紹介します。
LocalStack
今これを書いているのが 2023年12月31日で、先月の11月16日に 3.0のリリースが発表されました。
AWSの諸々のサービスを Dockerコンテナでエミュレートするもので、カバーしているサービスの一覧はこちらです。
AWS Service Feature Coverage
ぶっちゃけると少ないのでガッカリしないで下さい。
$30/月 くらい払うとほとんど使えるようになりますのでそれも手かと思います。
ここでは、LocalStackの無償版を Ubuntu Server 22.04.3にインストールします。
Ubuntu Serverについては、
「Ubuntu Linux Serverをインストール」と
「Ubuntu Serverの初期設定」に書いた手順で作っています。
上記の通り Dockerが必要ですので、その環境構築は
「Dockerエンジン インストール」に書いた手順でやりました。
いくつかインストール方法がありますが、ここでは「LocalStack CLI」方式にします。
インストール手順は以下に載っています。
LocalStack CLI
ここに OS毎のインストール方法がタブで分かれていますので、[Linux]タブを選びます。
以下、インストールは公式の手順に沿って進めます。
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に対して以下の作業をしてみます。
- S3に [testbucket]バケットを作る
- [aaa.txt]ファイルを [testbucket]バケットに入れる
- [aaa.txt]ファイルを消す
- [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円 |
AWSの基本・仕組み・重要用語が全部わかる教科書 [ 川畑光平 ] 価格:2970円 |