😀

今すぐできる!コストゼロでAWSを触ってみよう!

2025/02/27に公開

はじめに

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