AWSを無料で触りたい: LocalStackを導入してみた

## はじめに
AWSの無料枠はあるものの、「誤って課金されるのが怖い」と感じて、触るのを諦めたことはありませんか？
そんなときに便利なのが LocalStack です（たぶんね）。
LocalStack（無料版でOK！）を使えば、AWSの主要なサービスをローカル環境でシミュレーションできるため、課金の心配なく試すことができます。
今回は、LocalStackをDockerで立ち上げ、S3のバケットを作成し、HTMLファイルをアップロードするまでの流れを試してみようと思います。

## LocalStackの設定

まず、LocalStackをDockerで立ち上げるための設定を行います。
以下の内容を `compose.yml` に記載します。

```yaml
version: "3.8"

services:
  localstack:
    container_name: localstack
    image: localstack/localstack
    ports:
      - "127.0.0.1:4566:4566"            # LocalStack Gateway
      - "127.0.0.1:4510-4559:4510-4559"  # external services port range
    environment:
      # LocalStack configuration: https://docs.localstack.cloud/references/configuration/
      - DEBUG=${DEBUG:-0}
    volumes:
      - ./localstack:/var/lib/localstack
      - "/var/run/docker.sock:/var/run/docker.sock"
```

この設定では、`LocalStack`をローカルのポート `4566` で公開しています。
AWSの各サービスもそれぞれポートを通じてアクセス可能になります。

## LocalStackの起動

次に、上記の `compose.yml` が保存されているディレクトリで以下のコマンドを実行して、LocalStackを起動します。
`-d`オプションをつけることで、バックグラウンドで起動できます。

```bash
docker compose up -d
```

起動後、サービスの状態を確認してみます。

## サービス確認

```bash
curl http://localhost:4566/_localstack/health | jq
```

このコマンドを実行すると、以下のようなレスポンスが表示され、LocalStackが立ち上がっていることが確認できます。

```json
{
  "services": {
    "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"
  },
  "edition": "community",
  "version": "4.3.1.dev3"
}
```

## S3バケットの作成

お試しでS3バケットを作成してみます。
まず、コンテナに入ります。

```bash
docker compose exec -it localstack bash
```

コンテナ内で`awslocal`コマンドを使って、S3バケットを作成します。

```bash
awslocal s3 mb s3://sample-bucket
```

バケットが作成されると、以下のようなメッセージが表示されます。

```bash
make_bucket: sample-bucket
```

その後、バケットが作成されているか確認します。

```bash
awslocal s3 ls
2025-03-30 15:46:48 sample-bucket
```

これで、S3バケットがローカル環境に作成されました。

## S3バケットにHTMLファイルをアップロード
続いて、作成したS3バケットにHTMLファイルをアップロードし、ブラウザで表示してみます。
まず、アップロード用のHTMLファイルを作成します。
```bash
echo "<html><head><meta charset="UTF-8"><title>静的ホスティング</title></head><body><h1>Hello World</h1></body></html>" > sample.html
```

次に、`awslocal` コマンドを使って `sample.html` を sample-bucket にアップロードします。
```bash
awslocal s3 cp sample.html s3://sample-bucket/
```
成功すると、以下のようなメッセージが表示されます。
```bash
upload: ./sample.html to s3://sample-bucket/sample.html
```

http://localhost:4566/sample-bucket/sample.html

ブラウザでアクセスし、`Hello World` と表示されていれば成功です。

![スクリーンショット 2025-04-01 1.14.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3639213/8242b4bb-d4da-4dc1-96b4-2efe30713934.png)



## まとめ

想像以上に簡単にLocalStackを立ち上げることができ、無料でS3を試すことができました。
これならAWSの課金を気にせず、安心して検証できそうですね。
次回は、Goを使ってS3バケットに画像をアップロードする方法を試してみようと思います。

---
### 参考
- https://hub.docker.com/r/localstack/localstack