Refactor LocalStack configuration and add Terraform scripts for AWS resources
This commit is contained in:
@@ -7,7 +7,7 @@ services:
|
|||||||
- "127.0.0.1:4510-4559:4510-4559" # external services port range
|
- "127.0.0.1:4510-4559:4510-4559" # external services port range
|
||||||
environment:
|
environment:
|
||||||
# LocalStack configuration: https://docs.localstack.cloud/references/configuration/
|
# LocalStack configuration: https://docs.localstack.cloud/references/configuration/
|
||||||
- DEBUG=${DEBUG:-0}
|
DEBUG: ${DEBUG:-0}
|
||||||
volumes:
|
volumes:
|
||||||
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
|
- "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock"
|
- "/var/run/docker.sock:/var/run/docker.sock"
|
||||||
|
47
readme.md
Normal file
47
readme.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# LocalStack
|
||||||
|
|
||||||
|
LocalStack is a fully functional local AWS cloud stack. This project is designed to help you develop and test cloud applications offline.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Fully functional local AWS cloud stack
|
||||||
|
- Supports a wide range of AWS services
|
||||||
|
- Easy to use and deploy
|
||||||
|
- Fast and reliable
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install LocalStack, you can use the docker compose setup and run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
This starts the LocalStack services in the background.
|
||||||
|
There is also a second service named terraform that can be used to manage Terraform configurations onto the LocalStack environment.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec terraform /bin/sh
|
||||||
|
```
|
||||||
|
|
||||||
|
The terraform container already mounted the terraform folder the includes basic terraform configurations.
|
||||||
|
|
||||||
|
To run the Terraform commands, you can use the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose exec terraform /bin/sh
|
||||||
|
```
|
||||||
|
|
||||||
|
This will give you access to a shell inside the terraform container, where you can run Terraform commands as needed.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform init
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform apply
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
terraform destroy
|
||||||
|
```
|
11
terraform/scripts/compute.tf
Normal file
11
terraform/scripts/compute.tf
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
resource "aws_instance" "web" {
|
||||||
|
ami = var.ami_id
|
||||||
|
instance_type = var.instance_type
|
||||||
|
subnet_id = aws_subnet.public_a.id
|
||||||
|
vpc_security_group_ids = [aws_security_group.web_sg.id]
|
||||||
|
associate_public_ip_address = true
|
||||||
|
|
||||||
|
tags = {
|
||||||
|
Name = "${var.project_name}-web"
|
||||||
|
}
|
||||||
|
}
|
14
terraform/scripts/dns.tf
Normal file
14
terraform/scripts/dns.tf
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
resource "aws_route53_zone" "primary" {
|
||||||
|
name = var.hosted_zone_name
|
||||||
|
comment = "primary hosted zone for ${var.project_name} localstack"
|
||||||
|
}
|
||||||
|
|
||||||
|
# In real AWS you'd use alias to ALB; LocalStack may not fully resolve alias, but we include it.
|
||||||
|
resource "aws_route53_record" "web" {
|
||||||
|
zone_id = aws_route53_zone.primary.zone_id
|
||||||
|
name = var.domain_name
|
||||||
|
type = "A"
|
||||||
|
ttl = 60
|
||||||
|
# direct connect to instance because alb is not supported in free localstack
|
||||||
|
records = [aws_instance.web.private_ip]
|
||||||
|
}
|
@@ -1,27 +0,0 @@
|
|||||||
provider "aws" {
|
|
||||||
region = "us-west-2"
|
|
||||||
access_key = "anaccesskey"
|
|
||||||
secret_key = "asecretkey"
|
|
||||||
s3_use_path_style = true
|
|
||||||
skip_credentials_validation = true
|
|
||||||
skip_metadata_api_check = true
|
|
||||||
skip_requesting_account_id = true
|
|
||||||
|
|
||||||
endpoints {
|
|
||||||
ec2 = "http://localstack:4566"
|
|
||||||
s3 = "http://localstack:4566"
|
|
||||||
lambda = "http://localstack:4566"
|
|
||||||
dynamodb = "http://localstack:4566"
|
|
||||||
# Add more services as needed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resource "aws_instance" "app_server" {
|
|
||||||
# LocalStack doesn't validate real AMI IDs; use a dummy ID
|
|
||||||
ami = "ami-12345678"
|
|
||||||
instance_type = "t2.micro"
|
|
||||||
|
|
||||||
tags = {
|
|
||||||
Name = "hashicorp-learn"
|
|
||||||
}
|
|
||||||
}
|
|
20
terraform/scripts/outputs.tf
Normal file
20
terraform/scripts/outputs.tf
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
output "instance_id" {
|
||||||
|
value = aws_instance.web.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "instance_private_ip" {
|
||||||
|
value = aws_instance.web.private_ip
|
||||||
|
description = "Private IP"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "domain_record" {
|
||||||
|
value = aws_route53_record.web.fqdn
|
||||||
|
}
|
||||||
|
|
||||||
|
output "security_group_id" {
|
||||||
|
value = aws_security_group.web_sg.id
|
||||||
|
}
|
||||||
|
|
||||||
|
output "vpc_id" {
|
||||||
|
value = aws_vpc.main.id
|
||||||
|
}
|
28
terraform/scripts/provider.tf
Normal file
28
terraform/scripts/provider.tf
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
terraform {
|
||||||
|
required_version = ">= 1.5.0"
|
||||||
|
required_providers {
|
||||||
|
aws = {
|
||||||
|
source = "hashicorp/aws"
|
||||||
|
version = ">= 5.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provider "aws" {
|
||||||
|
region = var.region
|
||||||
|
access_key = "test"
|
||||||
|
secret_key = "test"
|
||||||
|
s3_use_path_style = true
|
||||||
|
skip_credentials_validation = true
|
||||||
|
skip_metadata_api_check = true
|
||||||
|
skip_requesting_account_id = true
|
||||||
|
|
||||||
|
endpoints {
|
||||||
|
ec2 = var.localstack_endpoint
|
||||||
|
s3 = var.localstack_endpoint
|
||||||
|
route53 = var.localstack_endpoint
|
||||||
|
iam = var.localstack_endpoint
|
||||||
|
acm = var.localstack_endpoint
|
||||||
|
sts = var.localstack_endpoint
|
||||||
|
}
|
||||||
|
}
|
32
terraform/scripts/security.tf
Normal file
32
terraform/scripts/security.tf
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
resource "aws_security_group" "web_sg" {
|
||||||
|
name = "${var.project_name}-web-sg"
|
||||||
|
description = "Allow HTTP/HTTPS only"
|
||||||
|
vpc_id = aws_vpc.main.id
|
||||||
|
|
||||||
|
ingress {
|
||||||
|
description = "HTTP"
|
||||||
|
from_port = 80
|
||||||
|
to_port = 80
|
||||||
|
protocol = "tcp"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
|
||||||
|
ingress {
|
||||||
|
description = "HTTPS"
|
||||||
|
from_port = 443
|
||||||
|
to_port = 443
|
||||||
|
protocol = "tcp"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
|
||||||
|
egress {
|
||||||
|
from_port = 0
|
||||||
|
to_port = 0
|
||||||
|
protocol = "-1"
|
||||||
|
cidr_blocks = ["0.0.0.0/0"]
|
||||||
|
}
|
||||||
|
|
||||||
|
tags = {
|
||||||
|
Name = "${var.project_name}-web-sg"
|
||||||
|
}
|
||||||
|
}
|
@@ -1,10 +0,0 @@
|
|||||||
terraform {
|
|
||||||
required_providers {
|
|
||||||
aws = {
|
|
||||||
source = "hashicorp/aws"
|
|
||||||
version = "~> 5.92"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
required_version = ">= 1.2"
|
|
||||||
}
|
|
@@ -1,21 +1,42 @@
|
|||||||
{
|
{
|
||||||
"version": 4,
|
"version": 4,
|
||||||
"terraform_version": "1.12.2",
|
"terraform_version": "1.12.2",
|
||||||
"serial": 1,
|
"serial": 38,
|
||||||
"lineage": "d4b3ead1-bf36-0a61-6b2a-8097a03862ed",
|
"lineage": "d4b3ead1-bf36-0a61-6b2a-8097a03862ed",
|
||||||
"outputs": {},
|
"outputs": {
|
||||||
|
"domain_record": {
|
||||||
|
"value": "example.local",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"instance_id": {
|
||||||
|
"value": "i-9b3990d5fe7ddabd2",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"instance_private_ip": {
|
||||||
|
"value": "10.0.1.4",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"security_group_id": {
|
||||||
|
"value": "sg-ff0700449b3f0c236",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"vpc_id": {
|
||||||
|
"value": "vpc-d2369b36584be2923",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
},
|
||||||
"resources": [
|
"resources": [
|
||||||
{
|
{
|
||||||
"mode": "managed",
|
"mode": "managed",
|
||||||
"type": "aws_instance",
|
"type": "aws_instance",
|
||||||
"name": "app_server",
|
"name": "web",
|
||||||
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
"instances": [
|
"instances": [
|
||||||
{
|
{
|
||||||
"schema_version": 1,
|
"schema_version": 1,
|
||||||
"attributes": {
|
"attributes": {
|
||||||
"ami": "ami-12345678",
|
"ami": "ami-12345678",
|
||||||
"arn": "arn:aws:ec2:us-west-2::instance/i-ff8f884d048fb6dba",
|
"arn": "arn:aws:ec2:us-west-2::instance/i-9b3990d5fe7ddabd2",
|
||||||
"associate_public_ip_address": true,
|
"associate_public_ip_address": true,
|
||||||
"availability_zone": "us-west-2a",
|
"availability_zone": "us-west-2a",
|
||||||
"capacity_reservation_specification": [],
|
"capacity_reservation_specification": [],
|
||||||
@@ -35,7 +56,7 @@
|
|||||||
"host_id": "",
|
"host_id": "",
|
||||||
"host_resource_group_arn": null,
|
"host_resource_group_arn": null,
|
||||||
"iam_instance_profile": "",
|
"iam_instance_profile": "",
|
||||||
"id": "i-ff8f884d048fb6dba",
|
"id": "i-9b3990d5fe7ddabd2",
|
||||||
"instance_initiated_shutdown_behavior": "stop",
|
"instance_initiated_shutdown_behavior": "stop",
|
||||||
"instance_lifecycle": "",
|
"instance_lifecycle": "",
|
||||||
"instance_market_options": [],
|
"instance_market_options": [],
|
||||||
@@ -61,12 +82,12 @@
|
|||||||
"password_data": "",
|
"password_data": "",
|
||||||
"placement_group": "",
|
"placement_group": "",
|
||||||
"placement_partition_number": 0,
|
"placement_partition_number": 0,
|
||||||
"primary_network_interface_id": "eni-671b9b667332dd817",
|
"primary_network_interface_id": "eni-4095f018ac52e4592",
|
||||||
"private_dns": "ip-10-108-71-135.us-west-2.compute.internal",
|
"private_dns": "ip-10-0-1-4.us-west-2.compute.internal",
|
||||||
"private_dns_name_options": [],
|
"private_dns_name_options": [],
|
||||||
"private_ip": "10.108.71.135",
|
"private_ip": "10.0.1.4",
|
||||||
"public_dns": "ec2-54-214-139-172.us-west-2.compute.amazonaws.com",
|
"public_dns": "ec2-54-214-5-174.us-west-2.compute.amazonaws.com",
|
||||||
"public_ip": "54.214.139.172",
|
"public_ip": "54.214.5.174",
|
||||||
"root_block_device": [
|
"root_block_device": [
|
||||||
{
|
{
|
||||||
"delete_on_termination": true,
|
"delete_on_termination": true,
|
||||||
@@ -77,7 +98,7 @@
|
|||||||
"tags": {},
|
"tags": {},
|
||||||
"tags_all": {},
|
"tags_all": {},
|
||||||
"throughput": 0,
|
"throughput": 0,
|
||||||
"volume_id": "vol-7f697cf5342910fce",
|
"volume_id": "vol-ebbf4bf49122eb0ce",
|
||||||
"volume_size": 8,
|
"volume_size": 8,
|
||||||
"volume_type": "gp2"
|
"volume_type": "gp2"
|
||||||
}
|
}
|
||||||
@@ -86,12 +107,12 @@
|
|||||||
"security_groups": [],
|
"security_groups": [],
|
||||||
"source_dest_check": true,
|
"source_dest_check": true,
|
||||||
"spot_instance_request_id": "",
|
"spot_instance_request_id": "",
|
||||||
"subnet_id": "subnet-46507f191da09e9e5",
|
"subnet_id": "subnet-fabb34e9dcee4e10c",
|
||||||
"tags": {
|
"tags": {
|
||||||
"Name": "hashicorp-learn"
|
"Name": "web-demo-web"
|
||||||
},
|
},
|
||||||
"tags_all": {
|
"tags_all": {
|
||||||
"Name": "hashicorp-learn"
|
"Name": "web-demo-web"
|
||||||
},
|
},
|
||||||
"tenancy": "default",
|
"tenancy": "default",
|
||||||
"timeouts": null,
|
"timeouts": null,
|
||||||
@@ -99,11 +120,391 @@
|
|||||||
"user_data_base64": null,
|
"user_data_base64": null,
|
||||||
"user_data_replace_on_change": false,
|
"user_data_replace_on_change": false,
|
||||||
"volume_tags": null,
|
"volume_tags": null,
|
||||||
"vpc_security_group_ids": []
|
"vpc_security_group_ids": [
|
||||||
|
"sg-ff0700449b3f0c236"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"sensitive_attributes": [],
|
"sensitive_attributes": [],
|
||||||
"identity_schema_version": 0,
|
"identity_schema_version": 0,
|
||||||
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6MTIwMDAwMDAwMDAwMCwicmVhZCI6OTAwMDAwMDAwMDAwLCJ1cGRhdGUiOjYwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9"
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6MTIwMDAwMDAwMDAwMCwicmVhZCI6OTAwMDAwMDAwMDAwLCJ1cGRhdGUiOjYwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_security_group.web_sg",
|
||||||
|
"aws_subnet.public_a",
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_internet_gateway",
|
||||||
|
"name": "gw",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 0,
|
||||||
|
"attributes": {
|
||||||
|
"arn": "arn:aws:ec2:us-west-2:000000000000:internet-gateway/igw-137a64d5ace66fd05",
|
||||||
|
"id": "igw-137a64d5ace66fd05",
|
||||||
|
"owner_id": "000000000000",
|
||||||
|
"tags": {
|
||||||
|
"Name": "web-demo-igw"
|
||||||
|
},
|
||||||
|
"tags_all": {
|
||||||
|
"Name": "web-demo-igw"
|
||||||
|
},
|
||||||
|
"timeouts": null,
|
||||||
|
"vpc_id": "vpc-d2369b36584be2923"
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_route",
|
||||||
|
"name": "default_inet",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 0,
|
||||||
|
"attributes": {
|
||||||
|
"carrier_gateway_id": "",
|
||||||
|
"core_network_arn": "",
|
||||||
|
"destination_cidr_block": "0.0.0.0/0",
|
||||||
|
"destination_ipv6_cidr_block": "",
|
||||||
|
"destination_prefix_list_id": "",
|
||||||
|
"egress_only_gateway_id": "",
|
||||||
|
"gateway_id": "igw-137a64d5ace66fd05",
|
||||||
|
"id": "r-rtb-9cd3766ac0d2a3d2a1080289494",
|
||||||
|
"instance_id": "",
|
||||||
|
"instance_owner_id": "",
|
||||||
|
"local_gateway_id": "",
|
||||||
|
"nat_gateway_id": "",
|
||||||
|
"network_interface_id": "",
|
||||||
|
"origin": "CreateRoute",
|
||||||
|
"route_table_id": "rtb-9cd3766ac0d2a3d2a",
|
||||||
|
"state": "active",
|
||||||
|
"timeouts": null,
|
||||||
|
"transit_gateway_id": "",
|
||||||
|
"vpc_endpoint_id": "",
|
||||||
|
"vpc_peering_connection_id": ""
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwLCJ1cGRhdGUiOjEyMDAwMDAwMDAwMH19",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_internet_gateway.gw",
|
||||||
|
"aws_route_table.public",
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_route53_record",
|
||||||
|
"name": "web",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 2,
|
||||||
|
"attributes": {
|
||||||
|
"alias": [],
|
||||||
|
"allow_overwrite": null,
|
||||||
|
"cidr_routing_policy": [],
|
||||||
|
"failover_routing_policy": [],
|
||||||
|
"fqdn": "example.local",
|
||||||
|
"geolocation_routing_policy": [],
|
||||||
|
"geoproximity_routing_policy": [],
|
||||||
|
"health_check_id": "",
|
||||||
|
"id": "4CSYFAR2Y8XOXVAYMXEYVJ_example.local_A",
|
||||||
|
"latency_routing_policy": [],
|
||||||
|
"multivalue_answer_routing_policy": false,
|
||||||
|
"name": "example.local",
|
||||||
|
"records": [
|
||||||
|
"10.0.1.4"
|
||||||
|
],
|
||||||
|
"set_identifier": "",
|
||||||
|
"timeouts": null,
|
||||||
|
"ttl": 60,
|
||||||
|
"type": "A",
|
||||||
|
"weighted_routing_policy": [],
|
||||||
|
"zone_id": "4CSYFAR2Y8XOXVAYMXEYVJ"
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInVwZGF0ZSI6MTgwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMiJ9",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_instance.web",
|
||||||
|
"aws_route53_zone.primary",
|
||||||
|
"aws_security_group.web_sg",
|
||||||
|
"aws_subnet.public_a",
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_route53_zone",
|
||||||
|
"name": "primary",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 0,
|
||||||
|
"attributes": {
|
||||||
|
"arn": "arn:aws:route53:::hostedzone/4CSYFAR2Y8XOXVAYMXEYVJ",
|
||||||
|
"comment": "primary hosted zone for web-demo localstack",
|
||||||
|
"delegation_set_id": "",
|
||||||
|
"force_destroy": false,
|
||||||
|
"id": "4CSYFAR2Y8XOXVAYMXEYVJ",
|
||||||
|
"name": "example.local",
|
||||||
|
"name_servers": [
|
||||||
|
"ns-2048.awsdns-64.com",
|
||||||
|
"ns-2049.awsdns-65.net",
|
||||||
|
"ns-2050.awsdns-66.org",
|
||||||
|
"ns-2051.awsdns-67.co.uk"
|
||||||
|
],
|
||||||
|
"primary_name_server": "ns-2048.awsdns-64.com",
|
||||||
|
"tags": null,
|
||||||
|
"tags_all": {},
|
||||||
|
"timeouts": null,
|
||||||
|
"vpc": [],
|
||||||
|
"zone_id": "4CSYFAR2Y8XOXVAYMXEYVJ"
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxODAwMDAwMDAwMDAwLCJkZWxldGUiOjE4MDAwMDAwMDAwMDAsInVwZGF0ZSI6MTgwMDAwMDAwMDAwMH19"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_route_table",
|
||||||
|
"name": "public",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 0,
|
||||||
|
"attributes": {
|
||||||
|
"arn": "arn:aws:ec2:us-west-2:000000000000:route-table/rtb-9cd3766ac0d2a3d2a",
|
||||||
|
"id": "rtb-9cd3766ac0d2a3d2a",
|
||||||
|
"owner_id": "000000000000",
|
||||||
|
"propagating_vgws": [],
|
||||||
|
"route": [],
|
||||||
|
"tags": {
|
||||||
|
"Name": "web-demo-public-rt"
|
||||||
|
},
|
||||||
|
"tags_all": {
|
||||||
|
"Name": "web-demo-public-rt"
|
||||||
|
},
|
||||||
|
"timeouts": null,
|
||||||
|
"vpc_id": "vpc-d2369b36584be2923"
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwLCJ1cGRhdGUiOjEyMDAwMDAwMDAwMH19",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_route_table_association",
|
||||||
|
"name": "public_a",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 0,
|
||||||
|
"attributes": {
|
||||||
|
"gateway_id": "",
|
||||||
|
"id": "rtbassoc-c573a733d31cd9074",
|
||||||
|
"route_table_id": "rtb-9cd3766ac0d2a3d2a",
|
||||||
|
"subnet_id": "subnet-fabb34e9dcee4e10c",
|
||||||
|
"timeouts": null
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDAsImRlbGV0ZSI6MzAwMDAwMDAwMDAwLCJ1cGRhdGUiOjEyMDAwMDAwMDAwMH19",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_route_table.public",
|
||||||
|
"aws_subnet.public_a",
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_security_group",
|
||||||
|
"name": "web_sg",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 1,
|
||||||
|
"attributes": {
|
||||||
|
"arn": "arn:aws:ec2:us-west-2:000000000000:security-group/sg-ff0700449b3f0c236",
|
||||||
|
"description": "Allow HTTP/HTTPS only",
|
||||||
|
"egress": [
|
||||||
|
{
|
||||||
|
"cidr_blocks": [
|
||||||
|
"0.0.0.0/0"
|
||||||
|
],
|
||||||
|
"description": "",
|
||||||
|
"from_port": 0,
|
||||||
|
"ipv6_cidr_blocks": [],
|
||||||
|
"prefix_list_ids": [],
|
||||||
|
"protocol": "-1",
|
||||||
|
"security_groups": [],
|
||||||
|
"self": false,
|
||||||
|
"to_port": 0
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"id": "sg-ff0700449b3f0c236",
|
||||||
|
"ingress": [
|
||||||
|
{
|
||||||
|
"cidr_blocks": [
|
||||||
|
"0.0.0.0/0"
|
||||||
|
],
|
||||||
|
"description": "HTTP",
|
||||||
|
"from_port": 80,
|
||||||
|
"ipv6_cidr_blocks": [],
|
||||||
|
"prefix_list_ids": [],
|
||||||
|
"protocol": "tcp",
|
||||||
|
"security_groups": [],
|
||||||
|
"self": false,
|
||||||
|
"to_port": 80
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cidr_blocks": [
|
||||||
|
"0.0.0.0/0"
|
||||||
|
],
|
||||||
|
"description": "HTTPS",
|
||||||
|
"from_port": 443,
|
||||||
|
"ipv6_cidr_blocks": [],
|
||||||
|
"prefix_list_ids": [],
|
||||||
|
"protocol": "tcp",
|
||||||
|
"security_groups": [],
|
||||||
|
"self": false,
|
||||||
|
"to_port": 443
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"name": "web-demo-web-sg",
|
||||||
|
"name_prefix": "",
|
||||||
|
"owner_id": "000000000000",
|
||||||
|
"revoke_rules_on_delete": false,
|
||||||
|
"tags": {
|
||||||
|
"Name": "web-demo-web-sg"
|
||||||
|
},
|
||||||
|
"tags_all": {
|
||||||
|
"Name": "web-demo-web-sg"
|
||||||
|
},
|
||||||
|
"timeouts": null,
|
||||||
|
"vpc_id": "vpc-d2369b36584be2923"
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6OTAwMDAwMDAwMDAwfSwic2NoZW1hX3ZlcnNpb24iOiIxIn0=",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_subnet",
|
||||||
|
"name": "public_a",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 1,
|
||||||
|
"attributes": {
|
||||||
|
"arn": "arn:aws:ec2:us-west-2:000000000000:subnet/subnet-fabb34e9dcee4e10c",
|
||||||
|
"assign_ipv6_address_on_creation": false,
|
||||||
|
"availability_zone": "us-west-2a",
|
||||||
|
"availability_zone_id": "usw2-az2",
|
||||||
|
"cidr_block": "10.0.1.0/24",
|
||||||
|
"customer_owned_ipv4_pool": "",
|
||||||
|
"enable_dns64": false,
|
||||||
|
"enable_lni_at_device_index": 0,
|
||||||
|
"enable_resource_name_dns_a_record_on_launch": false,
|
||||||
|
"enable_resource_name_dns_aaaa_record_on_launch": false,
|
||||||
|
"id": "subnet-fabb34e9dcee4e10c",
|
||||||
|
"ipv6_cidr_block": "",
|
||||||
|
"ipv6_cidr_block_association_id": "",
|
||||||
|
"ipv6_native": false,
|
||||||
|
"map_customer_owned_ip_on_launch": false,
|
||||||
|
"map_public_ip_on_launch": true,
|
||||||
|
"outpost_arn": "",
|
||||||
|
"owner_id": "000000000000",
|
||||||
|
"private_dns_hostname_type_on_launch": "ip-name",
|
||||||
|
"tags": {
|
||||||
|
"Name": "web-demo-public-a"
|
||||||
|
},
|
||||||
|
"tags_all": {
|
||||||
|
"Name": "web-demo-public-a"
|
||||||
|
},
|
||||||
|
"timeouts": null,
|
||||||
|
"vpc_id": "vpc-d2369b36584be2923"
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsImRlbGV0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9",
|
||||||
|
"dependencies": [
|
||||||
|
"aws_vpc.main"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"mode": "managed",
|
||||||
|
"type": "aws_vpc",
|
||||||
|
"name": "main",
|
||||||
|
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"schema_version": 1,
|
||||||
|
"attributes": {
|
||||||
|
"arn": "arn:aws:ec2:us-west-2:000000000000:vpc/vpc-d2369b36584be2923",
|
||||||
|
"assign_generated_ipv6_cidr_block": false,
|
||||||
|
"cidr_block": "10.0.0.0/16",
|
||||||
|
"default_network_acl_id": "acl-c5ff179f0c8ec1efb",
|
||||||
|
"default_route_table_id": "rtb-44a01b63149b9fc2e",
|
||||||
|
"default_security_group_id": "sg-2f93b45397ffd42cf",
|
||||||
|
"dhcp_options_id": "default",
|
||||||
|
"enable_dns_hostnames": true,
|
||||||
|
"enable_dns_support": true,
|
||||||
|
"enable_network_address_usage_metrics": false,
|
||||||
|
"id": "vpc-d2369b36584be2923",
|
||||||
|
"instance_tenancy": "default",
|
||||||
|
"ipv4_ipam_pool_id": null,
|
||||||
|
"ipv4_netmask_length": null,
|
||||||
|
"ipv6_association_id": "",
|
||||||
|
"ipv6_cidr_block": "",
|
||||||
|
"ipv6_cidr_block_network_border_group": "",
|
||||||
|
"ipv6_ipam_pool_id": "",
|
||||||
|
"ipv6_netmask_length": 0,
|
||||||
|
"main_route_table_id": "rtb-44a01b63149b9fc2e",
|
||||||
|
"owner_id": "000000000000",
|
||||||
|
"tags": {
|
||||||
|
"Name": "web-demo-vpc"
|
||||||
|
},
|
||||||
|
"tags_all": {
|
||||||
|
"Name": "web-demo-vpc"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sensitive_attributes": [],
|
||||||
|
"identity_schema_version": 0,
|
||||||
|
"private": "eyJzY2hlbWFfdmVyc2lvbiI6IjEifQ=="
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
9
terraform/scripts/terraform.tfstate.backup
Normal file
9
terraform/scripts/terraform.tfstate.backup
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"version": 4,
|
||||||
|
"terraform_version": "1.12.2",
|
||||||
|
"serial": 27,
|
||||||
|
"lineage": "d4b3ead1-bf36-0a61-6b2a-8097a03862ed",
|
||||||
|
"outputs": {},
|
||||||
|
"resources": [],
|
||||||
|
"check_results": null
|
||||||
|
}
|
42
terraform/scripts/variables.tf
Normal file
42
terraform/scripts/variables.tf
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
variable "region" {
|
||||||
|
description = "AWS region"
|
||||||
|
type = string
|
||||||
|
default = "us-west-2"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "localstack_endpoint" {
|
||||||
|
description = "base url"
|
||||||
|
type = string
|
||||||
|
default = "http://localstack:4566"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "project_name" {
|
||||||
|
description = "name for tagging resources"
|
||||||
|
type = string
|
||||||
|
default = "web-demo"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "instance_type" {
|
||||||
|
description = "ec2 type"
|
||||||
|
type = string
|
||||||
|
default = "t2.micro"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "ami_id" {
|
||||||
|
description = "ami id for LocalStack EC2"
|
||||||
|
type = string
|
||||||
|
default = "ami-12345678"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "domain_name" {
|
||||||
|
description = "domain name to simulate in Route53 (LocalStack)"
|
||||||
|
type = string
|
||||||
|
default = "example.local"
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "hosted_zone_name" {
|
||||||
|
description = "hosted zone name (must end with a dot)"
|
||||||
|
type = string
|
||||||
|
default = "example.local."
|
||||||
|
}
|
||||||
|
|
43
terraform/scripts/vpc.tf
Normal file
43
terraform/scripts/vpc.tf
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
resource "aws_vpc" "main" {
|
||||||
|
cidr_block = "10.0.0.0/16"
|
||||||
|
enable_dns_support = true
|
||||||
|
enable_dns_hostnames = true
|
||||||
|
tags = {
|
||||||
|
Name = "${var.project_name}-vpc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_subnet" "public_a" {
|
||||||
|
vpc_id = aws_vpc.main.id
|
||||||
|
cidr_block = "10.0.1.0/24"
|
||||||
|
map_public_ip_on_launch = true
|
||||||
|
availability_zone = "us-west-2a"
|
||||||
|
tags = {
|
||||||
|
Name = "${var.project_name}-public-a"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_internet_gateway" "gw" {
|
||||||
|
vpc_id = aws_vpc.main.id
|
||||||
|
tags = {
|
||||||
|
Name = "${var.project_name}-igw"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route_table" "public" {
|
||||||
|
vpc_id = aws_vpc.main.id
|
||||||
|
tags = {
|
||||||
|
Name = "${var.project_name}-public-rt"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route" "default_inet" {
|
||||||
|
route_table_id = aws_route_table.public.id
|
||||||
|
destination_cidr_block = "0.0.0.0/0"
|
||||||
|
gateway_id = aws_internet_gateway.gw.id
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "aws_route_table_association" "public_a" {
|
||||||
|
subnet_id = aws_subnet.public_a.id
|
||||||
|
route_table_id = aws_route_table.public.id
|
||||||
|
}
|
Reference in New Issue
Block a user