今すぐできる!コストゼロでAWSを触ってみよう!
はじめに
AWS (Amazon Web Services) は、クラウドサービスの代表格として、様々なサービスを提供しています。しかし、AWSのサービスを利用するには、従量課金制のためどうしてもコストが気になってしまう方もいるのではないでしょうか?
特にAWSの学習を始めたばかりの方や、新しいサービスを試してみたい方にとって、コストは大きな障壁になりがちです。
そこで今回は LocalStack を使って、AWSのサービスを無料で動かせる環境を構築していきます。
具体的にはLocalStack、AWS CLI、Terraformを組み合わせて、AWSクラウドを疑似的に再現し、実際のAWS環境と同じように操作することができる環境を構築します。これにより、AWSの様々なサービスをコストを気にせず気軽に試すことができます。
LocalStack とは
「LocalStack」は、AWS(Amazon Web Services)を、あたかも自分のPCやVM上で動作させているかのように扱うことができるツールです。AWSの様々なサービスをローカル環境で模倣することで、実際のAWSクラウド環境に接続することなく、開発やテストを効率的に進めることが可能になります。
AWSとは、Amazonが提供するクラウドサービスのことで、インターネットを経由して、サーバーやデータベース、AI、IoTなど、多岐にわたるサービスを利用できます。これらのサービスは非常に便利ですが、実際に利用すると、使用量に応じて料金が発生します。例えば、クラウドストレージサービスである「S3」を利用した場合、保存するデータ量や利用期間に応じて料金を支払う必要があります。
LocalStackを活用すれば、AWSのS3のようなサービスを自分のPCやVM上で仮想的に実行できます。これにより、AWSクラウドに接続せずとも、ローカル環境でAWSの各種サービスを体験したり、アプリケーションの開発やテストを行ったりすることができるのです。
LocalStackには、無料版と有料版があります。違いについては、LocalStackのドキュメント で確認してください。Proとついているものが有料版で使用できるAWSサービスです。
ちなみに無料使えるAWSサービスは以下になります。
$ 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 │
└──────────────────────────┴──────────────┘
LocalStackのメリット
LocalStackを使うことのメリットはたくさんありますが、特に大きいのはAWSのコストを気にせず気軽に使用できるという点です。
AWSのサービスは便利ですが、使った分だけ料金が発生します。学習や開発の段階で、コストを気にせずに自由にAWSのサービスを試せたら嬉しいですよね。LocalStackならそれが可能です。
LocalStackは自分のPCやVM上で動作するので、AWS側の障害(めったに起こるものではないですが...)を気にする必要はありません。また、AWSではAPIを呼び出す回数に制限がありますが、LocalStackではそのような制限も気にする必要もありません。
対象者
LocalStackは、以下のような方に特におすすめです。
- AWSの学習を始めたばかりの方
- AWS CLIやTerraformを試してみたい方
- コストを抑えながら開発・テストを行いたい方
AWS CLIとは
AWS CLIは、Amazon Web Services (AWS) のサービスをコマンドラインから操作するためのツールです。
通常、AWSのサービスを使うには、AWSのWebサイトにログインして、マウスでポチポチと操作するのを最初に思い浮かべるかもしれませんが、実はコマンドラインからも操作ができるんです。
AWS CLIを使うと、コマンドラインから、つまりキーボードで文字を入力するだけで、AWSのサービスを操作することができます。
例えば、AWSのS3というサービスにファイルをアップロードしたい場合、AWS CLIでは以下のようなコマンドを実行します。
aws s3 cp my-file.txt s3://my-bucket/
このコマンドを実行すると、my-file.txt というファイルが、my-bucket というS3バケットにアップロードされます。
AWS CLIを使うと、Webサイトにログインしなくても、AWSのサービスを操作することができ、スクリプトを作成して自動化したり、他のツールと連携したりする際に非常に便利です。
AWS CLIは、AWSのほぼ全てのサービスをサポートしており、非常に多くのコマンドが用意されています。最初は覚えるのが大変かもしれませんが、一度慣れてしまえば、AWSのサービスを効率的に操作することができます。
Terraformとは
Terraformは、AWSやGCP、Azureといった様々なクラウドサービス(クラウドサービス以外もあるよ!)のインフラをコードで定義し、管理するためのツールです。
Terraformを使わない場合は、サーバーやネットワーク機器などの設定を手作業で行う必要がありますが、Terraformを使うと、これらの設定をコードで記述しておくことで、インフラ部分の構築、設定変更、削除をすべて自動化できます。
例えば、AWSのS3バケットを作成する場合、Terraformでは以下のようなコードを記述します。
resource "aws_s3_bucket" "example" {
bucket = "my-tf-test-bucket"
tags = {
Name = "My bucket"
Environment = "Dev"
}
}
このコードを実行すると(厳密にはプロバイダーの設定やらAWSアクセスキーの設定やらが必要です)、Terraformが自動的にAWSのAPIを呼び出し、S3バケットを作成してくれます。
Terraformでインフラを管理することには、以下のようなメリットがあります。
- 効率化: インフラストラクチャの構築や変更を自動化することで、作業効率を大幅に向上させることができます。
- 再現性: 同じコードを実行すれば、常に同じインフラストラクチャが構築されるため、環境の再現性が保証されます。
- バージョン管理: コードをバージョン管理システムで管理することで、変更履歴を管理したり、以前の状態に戻したりすることができます。
- 再利用性: 作成したコードをモジュール化することで、他のプロジェクトで再利用することができます。
環境構築
今回の環境では、Google Cloud Shell を使用します。
Google Cloud Shellとは、Google Cloud Platform (GCP) が提供する、ブラウザからアクセスできる仮想マシン環境です。
Google Cloud Shellのメリット
- 無償で利用可能: Googleのアカウントがあれば、誰でも無料でCloud Shellを利用することができます。(1週間あたり、50時間の利用制限あり)
- すぐに利用可能: ブラウザからアクセスするだけで、すぐに利用することができます。
- 豊富な機能: 5GBの永続ディスク、GitやTerraformが事前にインストールされているなど、豊富な開発ツールなどが提供されています。
Google Cloudコンソールへアクセスし、右上の『Cloud Shellをアクティブにする』をクリック
初回は利用規約への同意が表示されたような... もし表示されたら『同意して続行』してください。
こんな画面になったらOK
「セッション情報」→「使用量の割り当て」から、あとどれだけ使用できるかが分かります。
Docker
事前にインストールされてるはず
$ docker version
Client: Docker Engine - Community
Version: 28.0.0
API version: 1.48
Go version: go1.23.6
Git commit: f9ced58
Built: Wed Feb 19 22:11:04 2025
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 28.0.0
API version: 1.48 (minimum version 1.24)
Go version: go1.23.6
Git commit: af898ab
Built: Wed Feb 19 22:11:04 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.25
GitCommit: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
runc:
Version: 1.2.4
GitCommit: v1.2.4-0-g6c52b3f
docker-init:
Version: 0.19.0
GitCommit: de40ad0
↑のような応答があればヨシ
LocalStack
公式手順に従う
インストール
$ curl --output localstack-cli-4.2.0-linux-arm64-onefile.tar.gz \
--location https://github.com/localstack/localstack-cli/releases/download/v4.2.0/localstack-cli-4.2.0-linux-arm64-onefile.tar.gz
$ sudo tar xvzf localstack-cli-4.2.0-linux-*-onefile.tar.gz -C /usr/local/bin
確認
$ localstack --version
4.2.0
↑のような応答があればヨシ
起動
$ localstack start -d
__ _______ __ __
/ / ____ _________ _/ / ___// /_____ ______/ /__
/ / / __ \/ ___/ __ `/ /\__ \/ __/ __ `/ ___/ //_/
/ /___/ /_/ / /__/ /_/ / /___/ / /_/ /_/ / /__/ ,<
/_____/\____/\___/\__,_/_//____/\__/\__,_/\___/_/|_|
- LocalStack CLI: 4.2.0
- Profile: default
- App: https://app.localstack.cloud
[12:18:07] starting LocalStack in Docker mode 🐳 localstack.py:512
preparing environment bootstrap.py:1321
configuring container bootstrap.py:1329
container image not found on host bootstrap.py:1310
[12:18:42] download complete bootstrap.py:1314
starting container bootstrap.py:1339
[12:18:46] detaching
↑のような応答があればヨシ
AWS CLI
公式手順に従う
インストール
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
確認
$ aws --version
aws-cli/2.24.13 Python/3.12.9 Linux/6.6.72+ exe/x86_64.ubuntu.24
↑のような応答があればヨシ
awslocal
LocalStack環境専用のAWS CLI、と覚えてもらえれば一旦大丈夫です。
LocalStack環境ではaws
コマンドではなくawslocal
コマンドを使います。
詳しく知りたい方は調べてください。
公式手順に従う
インストール
$ python3 -m pip install awscli-local
$ echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
$ exec $SHELL -l
確認
$ awslocal --version
aws-cli/2.24.13 Python/3.12.9 Linux/6.6.72+ exe/x86_64.ubuntu.24
↑のような応答があればヨシ
Terraform
事前にインストールされてるはず(ちょっと古いバージョンだけど...)
$ terraform version
Terraform v1.5.7
on linux_amd64
↑のような応答があればヨシ
tflocal
awslocal
と同様、LocalStack環境専用のTerraform、と覚えてもらえれば一旦大丈夫です。
LocalStack環境ではterraform
コマンドではなくtflocal
コマンドを使います。
詳しく知りたい方は調べてください。
インストール
$ python3 -m pip install terraform-local
確認
$ tflocal version
Terraform v1.5.7
on linux_amd64
↑のような応答があればヨシ
ちょこっと触ってみる
AWS CLI
試しにAWS CLIでS3バケットを作成してみる
S3バケットを作成
$ awslocal s3 mb s3://my-bucket
make_bucket: my-bucket
make_bucket
と表示されてれば作成できています
バケットの一覧を表示
$ awslocal s3 ls
2025-02-27 12:40:53 my-bucket
さっき作成したバケットが表示されるはず
適当にファイルを作ってバケットにをアップロード
$ touch my-file.txt
$ awslocal s3 cp ./my-file.txt s3://my-bucket
upload: ./my-file.txt to s3://my-bucket/my-file.txt
アップロードされてるか確認
$ awslocal s3 ls s3://my-bucket
2025-02-27 12:42:18 0 my-file.txt
さっきアップロードしたファイルが表示されるはず
バケット削除
$ awslocal s3 rb s3://my-bucket --force
delete: s3://my-bucket/my-file.txt
remove_bucket: my-bucket
バケットの一覧を表示
$ awslocal s3 ls
削除したから何も表示されないはず
Terraform
試しにTerraformでS3バケットを作成してみる
Terraformの実行に必要なファイルを準備
$ vi s3.tf
以下を貼り付ける
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.88.0"
}
}
}
resource "aws_s3_bucket" "my-bucket" {
bucket = "my-bucket"
}
init
を実行(Terraformを実行するための準備)
$ tflocal init
Terraform has been successfully initialized!
と表示されてればOK
apply
を実行してS3バケットを作成
$ tflocal apply
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_s3_bucket.my-bucket will be created
+ resource "aws_s3_bucket" "my-bucket" {
+ acceleration_status = (known after apply)
+ acl = (known after apply)
+ arn = (known after apply)
+ bucket = "my-bucket"
+ bucket_domain_name = (known after apply)
+ bucket_prefix = (known after apply)
+ bucket_regional_domain_name = (known after apply)
+ force_destroy = false
+ hosted_zone_id = (known after apply)
+ id = (known after apply)
+ object_lock_enabled = (known after apply)
+ policy = (known after apply)
+ region = (known after apply)
+ request_payer = (known after apply)
+ tags_all = (known after apply)
+ website_domain = (known after apply)
+ website_endpoint = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes ← yesと入力してEnter
aws_s3_bucket.my-bucket: Creating...
aws_s3_bucket.my-bucket: Creation complete after 0s [id=my-bucket]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Apply complete!
を表示されてればOK
バケットの一覧を表示
$ awslocal s3 ls
2025-02-27 13:27:40 my-bucket
さっき作成したバケットが表示されるはず
destroy
でS3バケット削除
$ tflocal destroy
aws_s3_bucket.my-bucket: Refreshing state... [id=my-bucket]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# aws_s3_bucket.my-bucket will be destroyed
- resource "aws_s3_bucket" "my-bucket" {
- arn = "arn:aws:s3:::my-bucket" -> null
- bucket = "my-bucket" -> null
- bucket_domain_name = "my-bucket.s3.amazonaws.com" -> null
- bucket_regional_domain_name = "my-bucket.s3.us-east-1.amazonaws.com" -> null
- force_destroy = false -> null
- hosted_zone_id = "Z3AQBSTGFYJSTF" -> null
- id = "my-bucket" -> null
- object_lock_enabled = false -> null
- region = "us-east-1" -> null
- request_payer = "BucketOwner" -> null
- tags = {} -> null
- tags_all = {} -> null
- grant {
- id = "75aa57f09aa0c8caeab4f8c24e99d10f8e7faeebf76c078efc7c6caea54ba06a" -> null
- permissions = [
- "FULL_CONTROL",
] -> null
- type = "CanonicalUser" -> null
}
- server_side_encryption_configuration {
- rule {
- bucket_key_enabled = false -> null
- apply_server_side_encryption_by_default {
- sse_algorithm = "AES256" -> null
}
}
}
- versioning {
- enabled = false -> null
- mfa_delete = false -> null
}
}
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value: yes ← yesと入力してEnter
aws_s3_bucket.my-bucket: Destroying... [id=my-bucket]
aws_s3_bucket.my-bucket: Destruction complete after 0s
Destroy complete! Resources: 1 destroyed.
Destroy complete!
と表示されてればOK
バケットの一覧を表示
$ awslocal s3 ls
さっき作成したバケットを削除したから何も表示されないはず
最後に
もっと詳しく知りたい、触ってみたいという方は、以下の公式ドキュメントをご確認ください!
Discussion