AWSのリソースをエミュレートするLocalstackでS3を使ってみる

※本ブログはアフィリエイトで収益を得ています

はじめに

最近、AWSの認定資格の勉強をしています。アソシエイトレベルであれば参考書と演習問題で取得は可能ですが、それでは勉強する意味がないと思い、実際に手を動かして勉強することにしました。

しかし、AWSのリソースを使うためには、お金がかかります。そのため、ローカル環境でAWSのリソースをエミュレートすることができるLocalstackを使って勉強しようと考えました。

Local Stackとは

公式サイト:Localstack

前述した通り、LocalstackはAWSのリソースをエミュレートするためのツールです。Dockerコンテナとして提供されており、Dockerコンテナを起動することで、ローカル環境でAWSのリソースをエミュレートすることができます。

LocalStackには料金プランが存在します。無料プランと有料プランがあり、無料プランでは一部の機能が制限されています。 実は「Hobby Subscription」というプランが存在し、無料で有料プラン相当の機能を利用することができます。ただし、個人利用に限定されるため、利用規約を守ってご利用ください。

準備

LocalStackのインストール

LocalStackのインストール方法は公式サイトに丁寧に記載があるため、そちらをご確認ください。

Localstackの起動

Localstackを起動するために、以下のコマンドを実行します。

localstack start

実装

CloudFormationの作成

Localstackを使ってS3バケットを作成するために、CloudFormationのテンプレートを作成します。CloudFormationは所謂IaC(Infrastructure as Code)のツールで、AWSのリソースをコードで管理することができます。テンプレートは、YAML形式で記述します。

# CloudFormationテンプレートのフォーマットバージョンを指定
AWSTemplateFormatVersion: '2010-09-09'

# テンプレートの説明
Description: 'S3 Bucket for HTML Hosting'

# リソースの定義開始
Resources:
  # カスタム名(ここでは MyS3Bucket)でS3バケットリソースを定義
  MyS3Bucket:
    Type: AWS::S3::Bucket  # リソースのタイプ指定(S3バケット)
    Properties:            # バケットに関するプロパティ
      AccessControl: PublicRead  # バケットのアクセスコントロール(公開読み取り)
      WebsiteConfiguration:      # ウェブサイトとしてのバケット設定
        IndexDocument: index.html # インデックスドキュメントとして使用するファイル

# スタックのデプロイ後に出力される情報
Outputs:
  BucketName:
    Description: "Name of S3 bucket"
    Value: !Ref MyS3Bucket         # バケットの名前を出力

  WebsiteURL:
    Description: "URL of the hosted website"
    Value: !GetAtt MyS3Bucket.WebsiteURL  # ホステッドウェブサイトのURLを出力

スタックの作成

CloudFormationのテンプレートを使って、Localstack上にS3バケットを作成します。Localstackを起動している状態で、以下のコマンドを実行します。ファイル名は自分で作成したファイル名に合わせてください、

aws --endpoint-url=http://localhost:4566 cloudformation create-stack --stack-name my-stack --template-body file://[ファイル名]

スタックステータスの確認

スタックの作成が完了したら、スタックのステータスを確認します。

aws --endpoint-url=http://localhost:4566 cloudformation describe-stacks --stack-name my-stack

下記の結果が出ました。“my-stack-mys3bucket-2a155b59"というS3バケットの作成に成功しました。

{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:ap-northeast-1:000000000000:stack/my-stack/a88ac3ce",
            "StackName": "my-stack",
            "Description": "S3 Bucket for HTML Hosting",
            "CreationTime": "2024-01-14T13:00:56.034000Z",
            "LastUpdatedTime": "2024-01-14T13:00:56.034000Z",
            "RollbackConfiguration": {},
            "StackStatus": "CREATE_COMPLETE",
            "DisableRollback": false,
            "NotificationARNs": [],
            "Outputs": [
                {
                    "OutputKey": "BucketName",
                    "OutputValue": "my-stack-mys3bucket-2a155b59", # ここがバケット名
                    "Description": "Name of S3 bucket"
                },
                {
                    "OutputKey": "WebsiteURL",
                    "OutputValue": "http://my-stack-mys3bucket-2a155b59.s3-website.localhost.localstack.cloud:4566",
                    "Description": "URL of the hosted website"
                }
            ],
            "Tags": [],
            "EnableTerminationProtection": false,
            "DriftInformation": {
                "StackDriftStatus": "NOT_CHECKED"
            }
        }
    ]
}

HTMLファイルをS3にアップロードする

S3バケットにHTMLファイルをアップロードします。今回は下記のHTMLファイルをアップロードします。

<!DOCTYPE html>
<html>
<head>
    <title>Hello World Page</title>
</head>
<body>
    <h1>Hello World!</h1>
    <p>This is a simple HTML page saying "Hello World".</p>
</body>
</html>

アップロードするために、下記のコマンドを実行します。バケット名は自分の環境に合わせて変更してください。

aws --endpoint-url=http://localhost:4566 s3 cp index.html s3://[バケット名]/

ブラウザで確認する

S3バケットにアップロードしたHTMLファイルをブラウザで確認します。ブラウザで下記のURLにアクセスします。バケット名は自分のものに合わせて変更してください。

http://localhost:4566/[バケット名]/index.html

下記のように表示されれば成功です。

Example Image

まとめ

Localstackを使って、ローカル環境でS3バケットを作成し、HTMLファイルをアップロードし、ブラウザで確認することができました。Localstackを使うことで、AWSのリソースをエミュレートすることができるため、AWSの勉強をする際には非常に便利です。