【localstack】AWSのリソースをローカルで使ってみた。
2022-07-29
こんにちは、0371です。
AWSサービスをローカル環境で擬似的に使用できるlocalstack
が正式リリースされたということで、実際に使ってみました。
>Announcing LocalStack 1.0 General Availability!
localstackとは?
locakstack
とは、AWSのサービスをローカル環境でエミュレートできるサービスです。
>LocalStack - A fully functional local cloud stack
githubページはこちら
>localstack/localstack: A fully functional local AWS cloud stack ...
ドキュメントはこちら
>Overview | Docs
localstack
を使用することによって、AWSマネジメントコンソールにアクセスすることなく開発やテストを実施することができます。
AWSのアカウントも必要ないため、アカウントを作成することができない方や不正課金が怖い方などにもおすすめです。
1.事前準備編
それでは、localstack
のインストールに必要な準備を進めましょう。
localstack
を使用するには、下記の条件があります。
- python3.7~3.10
- pip
- docker
- awscli
- awscli-local(任意)
1-1. 事前準備編 pip、python3
まずはpip
、python3
がインストールされているかを確認しましょう。
すでにPython
を使用している方なら、日常的にpip
を使用していると思います。
自分のPCには入っていて、以下のような実行結果になります。
# pipのバージョン確認
❯ python3 -m pip --version
pip 22.1 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)
もし、pip
が存在しない場合は、追加する必要があります。
python3.4
以降にはpip
が自動的にインストールされるので、特に理由がなければpython3
自体のアップデートを行うのがいいと思います。
Mac版は以下の通り。
# homebrewの場合
❯ brew update && brew upgrade python3
❯ python3 --version
# インストーラーからの場合
# 下記サイトからインストーラをダウンロードして実行し、アップデートする。
https://www.python.org/downloads/macos/
# pipのバージョン確認
❯ python3 -m pip --version
Windows版は以下の通り。
# 下記サイトからインストーラをダウンロードして実行し、アップデートする。
https://www.python.org/downloads/windows/
python3
自体がない場合はpython3
をインストールしましょう。
Mac版は以下の通り。
# homebrewのインストール
❯ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
# パッケージリストの更新
❯ brew update && brew upgrade
# python3のインストール
❯ brew install python3
# pipのバージョン確認
❯ python3 -m pip --version
Windows版は以下の通り。
# 下記サイトにアクセスする。
https://www.python.org/downloads/windows/
# Stable Releasesの最新版を選択する。(執筆時点の最新版は以下の通り)
https://www.python.org/downloads/release/python-3105/
# filesから、「Windows installer (64bit)をダウンロードする。」
https://www.python.org/ftp/python/3.10.5/python-●.●.●-amd64.exe
1-2. 事前準備編 Docker
Docker
はコンテナ型の仮想環境を管理するソフトウェアです。
localstack
では、Docker
を使用してAWSの仮想実行環境を作成しています。
Docker
のインストールについては、以下の公式ドキュメントを参考に行なってください。
Docker
をインストールしたら、動作確認です。
# 動作確認
❯ docker --version
Docker version 20.10.8, build 3967b7d
1-2. 事前準備編 awscli、awscli-local
awscli
はAWSのサービスをCLIで操作することのできるパッケージです。
下記コマンドでインストールしましょう。
# インストール
❯ python3 -m pip install awscli
# 動作確認
❯ aws --version
aws-cli/2.7.6 Python/3.9.11 Darwin/21.3.0 exe/x86_64 prompt/off
awscli-local
は、localstack
でのコマンド操作が楽になるパッケージです。
コマンド実行時のエンドポイントオプションの記述を省略できるようになったり、タブ補完をしてくれます。
locakstack
の公式ドキュメントでも紹介されているため、このタイミングで導入すると良いでしょう。
下記コマンドでインストールしましょう。
# インストール
❯ python3 -m pip install awscli-local
# 動作確認
❯ awslocal --version
aws-cli/2.7.6 Python/3.9.11 Darwin/21.3.0 exe/x86_64 prompt/off
長くなりましたが、これでlocakstack
をインストールするための事前準備は終了です。
2. 始め方(localstack導入編)
localstack
のインストールコマンドは以下の通りです。
❯ python3 -m pip install localstack
インストールが終わったら、バージョンの確認を行い、実際に動くか確かめてみましょう。
# バージョン確認
❯ localstack --version
1.0.3
このように表示されたらインストール成功です。
3. localstackでS3を触る
それでは、locakstack
を使用していきます。
3-1. localstackの起動
まずは、localstack
のコンテナを起動します。
# localstackの実行(裏でDockerが動くので、初回は表示までに30秒~1分ほどかかります。)
❯ localstack start -d
__ _______ __ __
/ / ____ _________ _/ / ___// /_____ ______/ /__
/ / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
/ /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
/_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|
💻 LocalStack CLI 1.0.3
[17:55:15] starting LocalStack in Docker mode 🐳
preparing environment
[17:55:16] configuring container
starting container
[17:55:18] detaching
これで、localstack
のコンテナが起動しました。
このコンテナが起動した状態で、各種コマンドを実行していきます。
3-2. S3バケットの作成
まずはlocalstack
の環境内に「S3バケット」を作成してみたいと思います。
awscli-local
をインストールしているので、awscli
のようにコマンドを実行できます。
# S3バケットの作成
❯ awslocal s3 mb s3://localstack-bucket
make_bucket: localstack-bucket
# 作成できたかの確認
❯ awslocal s3 ls
2022-07-30 22:14:20 localstack-bucket
この通り、S3バケットを簡単に作成することができました。
3-2. S3バケットに画像をアップロード
作成したS3バケットの中には何も入っていません。
# 「localstack-bucket」バケット内の一覧
❯ awslocal s3 ls s3://localstack-bucket
# 何もないので空白でプロンプトが返ってくる
❯
このままだと悲しいので、画像を入れてあげたいと思います。
下記フリー素材サイトから任意の画像を1つダウンロードしてください。
自分はこれにしました。
ダウンロードが終わったら、先ほど作成したS3バケットに画像をアップロードします。
# 画像をS3バケットにアップロード
❯ awslocal s3 cp ~/nanimoshitenai.gif s3://localstack-bucket
upload: Desktop/nanimoshitenai.gif to s3://localstack-bucket/nanimoshitenai.gif
アップロードされたかどうかをコマンドで確認します。
# 画像をS3バケットにアップロード
❯ awslocal s3 ls s3://localstack-bucket
2022-07-30 22:58:32 531614 nanimoshitenai.gif
3-3. ブラウザでファイルの閲覧確認
それでは無事にアップロードができたことが確認できたので、ブラウザ上でも確認しましょう。
下記の例を参考に、URLをブラウザに入力し、アップロードした画像にアクセスしてください。
# URL例
http://localhost:4566/S3バケット名/画像名.拡張子
# 自分の場合
http://localhost:4566/localstack-bucket/nanimoshitenai.gif
4566
は、LocalStackが使用するポート番号です。
ブラウザ上で画像が表示されたら、成功です。
3-4. 後片付け
最後に、作成したものをもとに戻しましょう。
localstack
は、初期設定では作成したサービスの永続化は行われません。
ですので、localstack
のコンテナを停止するだけで後片付けは終了です。
下記のコマンドで、localstack
のコンテナを停止できます。
locakstack stop
S3バケットが消えたことを確認するために、再度コンテナを起動します。
# localstackの実行(今回は起動が早いです)
❯ localstack start -d
__ _______ __ __
/ / ____ _________ _/ / ___// /_____ ______/ /__
/ / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
/ /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
/_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|
💻 LocalStack CLI 1.0.3
[17:55:15] starting LocalStack in Docker mode 🐳
preparing environment
[17:55:16] configuring container
starting container
[17:55:18] detaching
# S3バケットの一覧
❯ awslocal s3 ls
# コンテナの停止によってAWSサービスが消えたので、空白でプロンプトが返ってくる
❯
これで基本的な動作は出来ました。
3章以降を進める方は、このままコンテナを起動し続けてください。
ここで終了する方は、メモリがもったいないので、コンテナを停止しましょう。
5. localstack上でCloudFormationを実行する
次は、4章で作成したS3バケットをCloudFormation
を介して作成してみたいと思います。
CloudFormation
はAWSのIaCサービスで、インフラの環境をコードで管理することができます。
コードで管理することで、必要な時にサービスを追加したり削除したりが楽になります。
5-1. cfnテンプレートの作成
CloudFormation
のコードを作成していきます。
ファイル形式はjson
形式とyaml
形式がありますが、今回はyaml
形式で作成します。
yaml
形式の方が、コメントを残すことができるのでおすすめです。
なお、拡張子はyaml
でもyml
でもどちらでも問題なく認識されます。
CloudFormation
のコードを書いたファイルのことを「cfnテンプレート」と呼びます。
それでは、前置きが長くなりましたが、進めていきます。
新規ファイルを作成し、下記コードをコピーして貼り付けてください。
「localstack-cfn-s3.yml」
AWSTemplateFormatVersion: "2010-09-09"
Description: Template generated by rain
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: localstack-cfn-bucket
記述について軽く説明します。
「localstack-cfn-bucket」という名前のバケットを一つ作成するだけです。
...見れば分かる? それはそうです。
5-2. cfnテンプレートの実行
保存したら、以下のコマンドを実行しましょう。
※AWS CLIのバージョン1をインストールしろと言われますが、今回は無視していきます。
# cfnテンプレートをもとに、S3バケットを作成する(少し時間がかかる)
❯ awslocal cloudformation deploy --stack-name localstack-cfn-s3 --template-file "./localstack-cfn-s3.yml"
!NOTE! awslocal does not currently work with the cloudformation package/deploy commands supplied bythe AWS CLI v2. Please run "pip install awscli" to install version 1 of the AWS CLI
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - localstack-cfn-s3
cloudformation
で言う「stack」とは、AWSで実行後のcfnテンプレートという解釈でいいと思います。
ニアリーイコールです。
実行が完了されたら、作成されたか確認します。
# 作成できたかの確認
❯ awslocal s3 ls
2022-08-01 20:01:32 localstack-cfn-bucket
こうして問題なく、S3バケットが作成されました。
5-3. cfnテンプレートの削除
それでは、後片付けです。
先ほどは、コンテナの停止によってS3バケットを削除しましたが、今回はコマンドで削除します。
まずはスタック名を確認します。
windowsの方は、grep
オプションなしでも良いです。
# StackNameを確認する。
❯ awslocal cloudformation list-stacks | grep StackName
"StackName": "localstack-cfn-s3",
次に、スタック名を指定して削除を行います。
# stackの削除
❯ awslocal cloudformation delete-stack --stack-name localstack-cfn-s3
S3バケットが表示されないことを確認しましょう。
# S3バケットの一覧
❯ awslocal s3 ls
# stackの削除によってS3バケットも消えたので、空白でプロンプトが返ってくる
❯
これで、CloudFormation
を使用したS3バケットの作成が完了です。
5章で、S3バケットの中に画像を入れた場合は、S3バケットの削除に失敗する可能性があります。
その場合は、コンテナの停止を行うか、画像をコマンドで消した後にstackを削除しましょう。
6. パラメータストアを使用して、cloudformationによるS3バケットの作成を行う
ハンズオンとしては最終章です。
今回は、5章の内容に加え、パラメータストアというサービスを使用します。
S3バケットのバケット名(変数)をAWS(localstack)で管理し、実際に使うところまで行います。
6-1. cfnテンプレートの再利用
先ほど使用したcfnテンプレートを再利用します。
CloudFormation
のいいところは、インフラの構築設定を再利用できるところです。
自分はそのまま上書き編集を行いますが、必要な方はバックアップを取るなどしてください。
cp -ab ./localstack-cfn-s3.yml ./localstack-cfn-s3.yml.backup
では、localstack-cfn-s3.ymlを編集していきます。
「localstack-cfn-s3.yml」
AWSTemplateFormatVersion: "2010-09-09"
Description: Template generated by rain
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
- BucketName: localstack-cfn-bucket
+ BucketName: '{{resolve:ssm:S3BucketName:1}}'
- と + で変更箇所を表現してますが、伝わりますでしょうか?
- は消すべき行で、+ は追加する行です。
パラメータストアの「S3BucketName」という名前の変数を呼び出す記述に変更しました。
これで、S3バケット側の準備はOKです。
6-2. パラメータストアの利用
次は、パラメータストア用のcfnテンプレートを新規作成します。
変数一つだけなら、コマンドで登録もできます。
しかし、CloudFormation
を使っているので、せっかくだし...ということでcfnテンプレートを作成します。
localstack-cfn-parm.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: Template generated by rain
Resources:
SSMParameterForS3BucketName:
Type: "AWS::SSM::Parameter"
Properties:
Name: "S3BucketName"
Type: "String"
Value: "localstack-cfn-parm-s3bucket"
なんとなく書いていることはわかると思います。
変数「S3BucketName」に、「localstack-cfn-parm-s3bucket」という文字列型の値を代入してパラメータストアに登録する記述です。
6-3. パラメータストアとCloudFormationによるS3バケットの作成
では、準備ができたので、コマンドで作成しましょう。
- パラメータストア用cfnテンプレート
- S3バケット用cfnテンプレート
の順番で実行していきます。
# cfnテンプレートをもとに、パラメータストアの変数を作成する
❯ awslocal cloudformation deploy --stack-name localstack-cfn-parm --template-file "./localstack-cfn-parm.yml"
パラメータストアの変数が作成されたかを確認します。
# 変数の確認
❯ awslocal ssm get-parameters-by-path --path "/"
{
"Parameters": [
{
"Name": "S3BucketName",
"Type": "String",
"Value": "localstack-cfn-parm-s3bucket",
"Version": 1,
"LastModifiedDate": "2022-08-01T21:19:04.282000+09:00",
"ARN": "arn:aws:ssm:us-east-1:000000000000:parameter/S3BucketName",
"DataType": "text"
}
]
}
無事に作成されました。
それでは、S3バケットを作成します。
# cfnテンプレートをもとに、S3バケットを作成する
❯ awslocal cloudformation deploy --stack-name localstack-cfn-s3 --template-file "./localstack-cfn-s3.yml"
S3バケットの名前を確認してみましょう。
# S3バケットの一覧確認
❯ awslocal s3 ls
2022-08-01 21:32:25 localstack-cfn-parm-s3bucket
パラメータストアで指定したバケット名になっていますね!
これで、パラメータストアを使用したCloudFormation
によるS3バケットの作成が完了です。
あとは、下記コマンドでコンテナの停止をしましょう。
お疲れ様でした!
localstack stop
7. コマンド
localstack
の主要なコマンド一覧です。
# 主要なコマンド一覧を表示
localstack --help
コマンド | 説明 |
---|---|
config | LocalStackの設定を確認する |
infra | LocalStackのインフラを操作する(非推奨コマンド) |
login | アカウント情報を使ってログインする |
logs | LocalStackコンテナのログを表示する |
ssh | 実行中のLocalStackコンテナでシェルを取得する |
start | LocalStackの起動 |
status | LocalStackのランタイムに関するステータス情報を表示する |
stop | 実行中のLocalStackコンテナを停止する |
update | LocalStackコンポーネントのアップデート |
wait | LocalStackコンテナが起動するのを待つ |
localstack start --help
などで、オプションの一覧などを確認することもできます。
「何を指定することができるんだ?」となったら取りあえず--help
すると良いでしょう。
8.利用可能なサービス
利用可能なサービスを確認するには下記のコマンドを使用します。
無料版だと、下記のサービスが使用可能です。
❯ 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 │
│ secretsmanager │ ✔ available │
│ ses │ ✔ available │
│ sns │ ✔ available │
│ sqs │ ✔ available │
│ ssm │ ✔ available │
│ stepfunctions │ ✔ available │
│ sts │ ✔ available │
│ support │ ✔ available │
│ swf │ ✔ available │
└──────────────────────────┴─────────────┘
サーバレスなアプリであれば作れそうです。(作ったことはありませんが)
9. サービスの開発頻度、AWSサービス網羅率、料金など
githubページを確認すると、1週間に一度はバージョンアップしています。
開発頻度としては高く、v1リリース時点では採用しても問題ないと思います。
AWSサービスをどのくらいカバーできているかは、以下のページで確認できます。
>LocalStack Coverage
>AWS Service Feature Coverage
料金に関しては、以下のページを参照ください。
>Pricing
業務で使用するのであれば、Pro版の登録が必要だと思います。
参考サイト
CloudFormation - Use AWS CloudFormation with LocalStack
Python 3 Installation & Setup Guide
LocalStackを調べたのでまとめ
LocalStack CLI を使ってみる
今日の一言
ぴよたそはかわいい