帮帮我,Localstack。你是我唯一的希望。
Source: Dev.to
请提供您希望翻译的文章正文内容(除代码块和 URL 之外的文字),我将把它翻译成简体中文并保持原有的 Markdown 格式。谢谢!
介绍
去年我在 Discord 上的一个小组学习了 Terraform。讲师提供了扎实的入门介绍,涵盖了如何使用最新的 Amazon Linux 2023 AMI 在特定的 VPC 和子网中设置 AWS EC2 实例,并将 Terraform 状态存储在 S3 桶中。这为我奠定了坚实的基础,但如果没有定期练习,知识会逐渐淡化。
由于我的日常工作不涉及 AWS,我需要一种安全的方式来持续练习。使用真实的 AWS 账户即使在免费套餐下也有意外费用的风险。
LocalStack 在本地模拟 AWS 服务,使您能够在不产生费用的情况下练习 Terraform。
安装 LocalStack
-
按照官方的安装指南为您的操作系统进行安装。
-
启动 LocalStack:
localstack start -
在另一个终端中,验证它是否正在运行:
curl http://localhost:4566/_localstack/health
如果返回的 JSON 响应列出了可用的服务,则表示 LocalStack 正常工作。
为 LocalStack 配置 AWS CLI 配置文件
即使 LocalStack 不会验证凭证,你仍然需要一个 AWS 配置文件。
创建一个名为 localstack 的配置文件:
aws configure --profile localstack
使用以下虚拟值:
- AWS Access Key ID:
test - AWS Secret Access Key:
test - Default region name:
us-east-1 - Default output format:
json
编辑 ~/.aws/config 并添加端点 URL:
[profile localstack]
region = us-east-1
output = json
endpoint_url = http://localhost:4566
注意: 确保使用的是 AWS CLI v2.13.0 或更高版本,旧版本可能会忽略配置文件中的
endpoint_url。
检查版本:
aws --version
你应该会看到类似 aws-cli/2.13.0 Python/3.x 的输出。如有必要,请升级。
Source: …
Terraform 设置
在新目录中创建以下两个文件。
terraform.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.92"
}
}
required_version = ">= 1.2"
}
main.tf
provider "aws" {
profile = "localstack"
region = "us-east-1"
s3_use_path_style = true
skip_credentials_validation = true
skip_metadata_api_check = true
endpoints {
s3 = "http://s3.localhost.localstack.cloud:4566"
}
default_tags {
tags = {
Environment = "tutorial"
Project = "localstack-terraform"
}
}
}
resource "aws_s3_bucket" "example" {
bucket_prefix = "localstack-terraform"
}
main.tf 说明
| 块 | 目的 |
|---|---|
provider "aws" | 声明 Terraform 使用的 AWS 提供者。 |
profile = "localstack" | 使用之前配置的 AWS CLI 配置文件。 |
region = "us-east-1" | LocalStack 需要此区域设置,即使它在本地运行。 |
s3_use_path_style = true | 强制使用路径式 S3 URL(LocalStack 所必需)。 |
skip_credentials_validation = true | 跳过凭证检查,因为 LocalStack 不会验证凭证。 |
skip_metadata_api_check = true | 禁用对 EC2 元数据服务的调用。 |
endpoints { s3 = "http://s3.localhost.localstack.cloud:4566" } | 将所有 S3 请求指向 LocalStack。 |
default_tags | 自动为该提供者创建的每个资源添加指定的标签。 |
resource "aws_s3_bucket" "example" | 创建一个以 localstack-terraform 为前缀的唯一 S3 桶。 |
应用配置
初始化工作目录并应用配置:
terraform init
terraform apply
Terraform 将在 LocalStack 中创建 S3 存储桶。这演示了如何在本地测试 AWS 资源,而无需真实的 AWS 账户。
使用 tflocal 减少样板代码
手动配置服务端点、提供者标志以及其他 LocalStack‑特定设置可能会变得繁琐。
tflocal 包装器通过自动处理端点并减少 Terraform 代码中所需的配置量来简化此过程。在更大的项目中,使用 tflocal 在使用 LocalStack 时可以使 Terraform 文件更简洁、更易维护。