TerraformでLocalStack上にS3ウェブサイトを構築する

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

はじめに

前回、下記の記事を書きました。今回はCloudFormationではなく、Terraformを使って同じことを実現しようと思います。

Terraformのコード

まずは、Terraformのコードを書いていきます。

# AWSプロバイダの設定
provider "aws" {
  region                      = "us-east-1" # AWSのリージョン
  access_key                  = "mock_access_key" # AWSのアクセスキー
  secret_key                  = "mock_secret_key" # AWSのシークレットキー
  skip_credentials_validation = true # 資格情報の検証をスキップ
  skip_metadata_api_check     = true # メタデータAPIチェックをスキップ
  skip_requesting_account_id  = true # アカウントIDのリクエストをスキップ

  endpoints {
    s3 = "http://0.0.0.0:4566" # S3のエンドポイントをLocalStackに設定
  }
}

# S3バケットの作成
resource "aws_s3_bucket" "bucket" {
  bucket = "my-bucket" # バケット名
}

# S3バケットのウェブサイト設定
resource "aws_s3_bucket_website_configuration" "bucket" {
  bucket = aws_s3_bucket.bucket.id # この設定を適用するバケットのID

  index_document {
    suffix = "index.html" # ウェブサイトのインデックスドキュメント
  }
}

# S3バケットのACL設定
resource "aws_s3_bucket_acl" "bucket" {
  bucket = aws_s3_bucket.bucket.id # このACLを適用するバケットのID
  acl    = "public-read" # バケットのアクセス制御リスト(ACL)設定
}

# S3バケットのポリシー設定
resource "aws_s3_bucket_policy" "s3_bucket" {
  bucket = aws_s3_bucket.bucket.id # このポリシーを適用するバケットのID

  policy = jsonencode({
    Version = "2012-10-17" # ポリシーのバージョン
    Statement = [
      {
        Sid       = "PublicReadGetObject" # ステートメントのID
        Effect    = "Allow" # 許可するアクション
        Principal = "*" # アクションを許可する主体
        Action    = "s3:GetObject" # 許可するアクションの種類
        Resource = [
          aws_s3_bucket.bucket.arn, # ポリシーが適用されるリソース
          "${aws_s3_bucket.bucket.arn}/*", # ポリシーが適用されるリソース
        ]
      },
    ]
  })
}

# S3バケットにオブジェクトをアップロード
resource "aws_s3_object" "object" {
  depends_on   = [aws_s3_bucket.bucket] # バケットが作成された後でオブジェクトをアップロード
  bucket        = aws_s3_bucket.bucket.bucket # バケット名
  key           = "index.html" # アップロードするファイルのS3上での名前
  source        = "./index.html" # ローカルのファイルパス
  content_type  = "text/html" # ファイルのコンテンツタイプ
  acl           = "public-read" # ファイルのアクセス制御
}

# バケット名の出力
output "bucket_id" {
  description = "The name of the bucket"
  value       = aws_s3_bucket.bucket.id # バケットのID
}

# バケットのドメイン名の出力
output "domain" {
  description = "Domain name of the bucket"
  value       = aws_s3_bucket_website_configuration.bucket.website_domain # バケットのウェブサイトドメイン
}

# バケットのウェブサイトエンドポイントの出力
output "website_endpoint" {
  description = "The website endpoint of the bucket"
  value       = "http://0.0.0.0:4566/${aws_s3_bucket.bucket.bucket}/index.html" # バケットのウェブサイトエンドポイント
}

実行

Terraformのコードを実行していきます。

まずは下記を実行します。

terraform init

次に下記を実行します。

terraform apply

これで出力されたURLにアクセスし、下記のようなページが表示されたら成功です。

Example Image

まとめ

今回は、Terraformを利用しLocalstack上でAWSのS3バケットを作成し、HTMLファイルをアップロードし、ブラウザで確認する手順を解説しました。AWSのリソースをエミュレートするLocalstackの利用は、AWSの学習に非常に便利でした。