【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を使用するには、下記の条件があります。

  1. python3.7~3.10
  2. pip
  3. docker
  4. awscli
  5. awscli-local(任意)

1-1. 事前準備編 pip、python3

まずはpippython3がインストールされているかを確認しましょう。
すでに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をインストールしたら、動作確認です。

# 動作確認
❯ 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の公式ドキュメントでも紹介されているため、このタイミングで導入すると良いでしょう。

LocalStack AWS CLI (awslocal)

下記コマンドでインストールしましょう。

# インストール
❯ 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つダウンロードしてください。

ゆるくてかわいい無料イラスト・アイコン素材屋「ぴよたそ」

自分はこれにしました。

何もしてないのに壊れましたと主張するひよこ(GIFアニメ)

ダウンロードが終わったら、先ほど作成した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バケットの作成

では、準備ができたので、コマンドで作成しましょう。

  1. パラメータストア用cfnテンプレート
  2. 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
コマンド説明
configLocalStackの設定を確認する
infraLocalStackのインフラを操作する(非推奨コマンド)
loginアカウント情報を使ってログインする
logsLocalStackコンテナのログを表示する
ssh実行中のLocalStackコンテナでシェルを取得する
startLocalStackの起動
statusLocalStackのランタイムに関するステータス情報を表示する
stop実行中のLocalStackコンテナを停止する
updateLocalStackコンポーネントのアップデート
waitLocalStackコンテナが起動するのを待つ

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 を使ってみる

今日の一言

ぴよたそはかわいい