I have this issue regarding creating s3 bucket using AWS localstack, Terraform using docker-compose. I am using docker-compose with TF to create a bucket and creating the bucket is given connection refused. The http://localhost:4566/health on the browser is running and return the services for the AWS localstack.
Error :
Error: creating Amazon S3 (Simple Storage) Bucket (bucket-c): RequestError: send request failed
terraform | │ caused by: Put "http://localhost:4566/bucket-c": dial tcp 127.0.0.1:4566: connect: connection refused
terraform | │
terraform | │ with aws_s3_bucket.bucket["bucket-c"],
terraform | │ on main.tf line 1, in resource "aws_s3_bucket" "bucket":
| │ 1: resource "aws_s3_bucket" "bucket" {
The docker compose :
version: '3'
services:
localstack:
image: localstack/localstack
container_name: localstack
network_mode: bridge
ports:
- "127.0.0.1:4566:4566" # LocalStack Gateway
- "127.0.0.1:4510-4559:4510-4559" # external services port range
- "127.0.0.1:443:443" # LocalStack HTTPS Gateway
networks:
- test-net
hostname: localstack
environment:
- AWS_DEFAULT_REGION=eu-west-2
- AWS_ACCESS_KEY_ID=test
- AWS_SECRET_ACCESS_KEY=test
- DEBUG=${DEBUG:-1}
- DOCKER_HOST=unix:///var/run/docker.sock
- LS_LOG=WARN
- HOSTNAME_EXTERNAL=localstack
- SERVICES=s3,kafka
- HOST_TMP_FOLDER=${TMPDIR}
- DATA_DIR=/tmp/localstack/data
- PERSISTENCE=${PERSISTENCE-}
volumes:
- "${TMPDIR:-/tmp}/localstack:/var/lib/localstack"
- "/Users/devops/.rd/docker.sock:/var/run/docker.sock"
- "localstack_data:/tmp/localstack"
terraform:
image: hashicorp/terraform:latest # Use an official Terraform image
working_dir: /app
volumes:
- ./terraform:/app
depends_on:
- localstack
environment:
AWS_ACCESS_KEY_ID: test
AWS_SECRET_ACCESS_KEY: test
AWS_DEFAULT_REGION: eu-west-2
entrypoint: ["sh", "/app/run-terraform.sh"]
volumes:
kafka-data:
localstack_data:
The tf for the s3 bucket is :
provider "aws" {
region = "eu-west-2"
access_key = "test"
secret_key = "test"
skip_credentials_validation = true
skip_metadata_api_check = true
skip_requesting_account_id = true
s3_use_path_style = true
endpoints {
s3 = "http://localhost:4566"
}
}
resource "aws_s3_bucket" "bucket" {
for_each = toset(["bucket-a", "bucket-b", "bucket-c"])
bucket = each.key
}
resource "aws_s3_bucket_acl" "s3_bucket" {
for_each = aws_s3_bucket.bucket
bucket = aws_s3_bucket.bucket[each.key].id
acl = "public-read-write"
}
resource "aws_s3_bucket_policy" "s3_bucket_policy" {
for_each = aws_s3_bucket.bucket
bucket = each.value.id
policy = jsonencode({
Version = "2012-10-17",
Statement = [
{
Sid = "PublicReadGetObject",
Effect = "Allow",
Principal = "*",
Action = "s3:GetObject",
Resource = [
"${each.value.arn}/*",
],
},
],
})
}