我在通过 terraform 定义的 localstack 中设置了一个非常简单的 S3:
provider "aws" {
region = "us-east-1" # Change to your desired region
access_key = "test" # Access key for LocalStack
secret_key = "test" # Secret key for LocalStack
skip_credentials_validation = true
skip_requesting_account_id = true
skip_metadata_api_check = true
endpoints {
s3 = "http://locahost:4566"
}
}
resource "aws_s3_bucket" "images_bucket" {
bucket = "images-bucket"
acl = "private"
tags = {
Environment = "Development"
}
}
我知道 S3 服务可用并且正在运行,因为我可以通过终端呼叫
awslocal s3api create-bucket --bucket sample-bucket
。然而,当我运行 terraform apply
并说“是”时,它告诉我它正在“创建”S3 存储桶 20 秒左右,然后抛出:
Error: Error creating S3 bucket: RequestError: send request failed
│ caused by: Put "http://images-bucket.localhost:4566/": dial tcp: lookup images-bucket.127.0.0.1 on [2603:7000:4df0:8610::1]:53: no such host
│
│ with module.S3_module.aws_s3_bucket.images_bucket,
│ on S3/main.tf line 1, in resource "aws_s3_bucket" "images_bucket":
│ 1: resource "aws_s3_bucket" "images_bucket" {
在我看来,terraform 以某种方式将存储桶名称附加到定义的端点的前面。我不确定这就是错误的原因,但考虑到
terraform
的定义是如此基本,这似乎很可能。为什么要将存储桶名称添加到端点前面?我怎样才能防止这种情况发生?
我可以在另一篇post中看到其他人对此有疑问。那里的答案建议将(terraform 等效项)
s3_force_path_style = true
添加到提供者定义中。这仍然会引发相同的错误,但现在路径为 http://localhost:4566/images-bucket
。
需要明确的是,我还在此端点定义了一系列其他资源,并且它们工作正常。
Docker ps
确认端口已正确映射。
在这种情况下,您可以将 S3 端点用作:
s3 = "http://localhost.localstack.cloud"
在 LocalStack 中,S3 的工作方式与其他服务不同,尤其是其端点的设置方式。您可以在 S3 文档中找到此内容:https://docs.localstack.cloud/user-guide/aws/s3/