🌲

ローカル環境でお手軽Terraform入門 (LocalStack)

に公開

LocalStackは、ローカルで実行可能なAWSサービスエミュレータです。
慣れないユーザが実際のAWS環境でTerraformを試すのは意図せぬコスト発生等のリスクからハードルが高いため、LocalStackを用いてローカル環境で完結させます。

LocalStackを起動する

以下のいずれかの方法で起動してください。すべての場合において事前にDocker環境が構築されている必要があります。

1. Dockerコンテナを直接起動する

docker run --rm -it -p 4566:4566 -p 4510-4559:4510-4559 localstack/localstack

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

2. LocalStack CLIを使用する

↓のインストールガイドに従って導入します。
https://docs.localstack.cloud/getting-started/installation/

以下のコマンドで起動します。

localstack start

3. LocalStack Desktopを使用する

LocalStackにサインアップします。
サインアップ後の画面でDownload Desktopを選択します。(左下あたりにリンクがあります。)
https://www.localstack.cloud/
インストール後、LocalStack Desktopからコンテナを起動します。

awslocalコマンドを試す

起動したコンテナ名を確認します。

docker ps

コンテナ内でbashコマンドを実行します。

docker exec -it コンテナ名 bash

上記コマンドを実行後、以下を実行します。
コンテナ内ではawslocalコマンドが使用可能になっています。

awslocal s3 ls

Terraformをインストールする

1. tenvを用いてTerraformをインストールする (推奨)

tenvは、Terraformで利用可能なバージョンマネージャーです。Terraform以外にもOpenTofu,Terragrunt,Terramate,Atmosに対応しています。

↓のインストールガイドに従って導入します。
https://github.com/tofuutils/tenv

2. Terraformを直接インストールする

↓のインストールガイドに従って導入します。
https://developer.hashicorp.com/terraform/install

インストーラの確認

terraformコマンドを実行し、Terraformが正しくインストールされていることを確認します。

terraform -v

Terraformを用いてリソースを定義する

main.tfとprovider.tfを作成します。
今回はシンプルにS3バケット一つを作成します。
LocalStackを使用する際の注意点として、awsプロバイダの設定において以下が必要です。

  skip_credentials_validation = true
  skip_requesting_account_id  = true
  s3_use_path_style = true
  endpoints {
    s3             = "http://localhost:4566"
  }
main.tf
resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-localstack-bucket"
}

# Enable versioning for the bucket
resource "aws_s3_bucket_versioning" "my_bucket_versioning" {
  bucket = aws_s3_bucket.my_bucket.id
  versioning_configuration {
    status = "Enabled"
  }
}

# Configure bucket to prevent public access
resource "aws_s3_bucket_public_access_block" "my_bucket_public_access_block" {
  bucket = aws_s3_bucket.my_bucket.id
}
provider.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region                      = "ap-northeast-1"
  access_key                  = "sample"
  secret_key                  = "sample"
  skip_credentials_validation = true
  skip_requesting_account_id  = true
  s3_use_path_style = true
  endpoints {
    s3             = "http://localhost:4566"
  }
}

リソースを更新する

以下を順に実行します。
terraform initコマンドは、Terraformのワーキングディレクトリを初期化するものです。

terraform init

terraform planコマンドは、terraform applyで適用される変更をプレビューします。この時点ではリソースに変更は加えられません。

terraform plan

terraform applyコマンドで実際にリソースを更新します。

terraform apply

まとめ

LocalStackが動いているコンテナ内で以下を実行して、実際にS3バケットが作成されていることを確認します。

awslocal s3 ls

以上になります。
LocalStackを用いてローカル環境でaws環境をエミュレートし、Terraformを用いてS3バケットを定義・作成しました。

今回使用したコードは以下で公開しています。
https://github.com/koukiito/terraform-localstack-hands-on

フォロー、X(Twitter)フォローもよろしくお願いいたします。
https://twitter.com/kouki__ito

Discussion