はじめに
前回、下記の記事を書きました。今回は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にアクセスし、下記のようなページが表示されたら成功です。
まとめ
今回は、Terraformを利用しLocalstack上でAWSのS3バケットを作成し、HTMLファイルをアップロードし、ブラウザで確認する手順を解説しました。AWSのリソースをエミュレートするLocalstackの利用は、AWSの学習に非常に便利でした。