Amazon EC2
aws ec2 run-instances
--image-id ami-12345678
--instance-type t3.micro
--user-data file://script.yamlSets up Terraform on AWS for infrastructure provisioning and management
#cloud-config
package_update: true
package_upgrade: true
packages:
- wget
- unzip
- curl
- git
- gnupg
- software-properties-common
users:
- name: terraform
sudo: ALL=(ALL) NOPASSWD:ALL
shell: /bin/bash
groups: sudo
write_files:
- path: /home/terraform/examples/main.tf
content: |
terraform {
required_version = ">= 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
local = {
source = "hashicorp/local"
version = "~> 2.0"
}
}
}
# Configure the AWS Provider
provider "aws" {
region = var.aws_region
}
# Variables
variable "aws_region" {
description = "AWS region"
type = string
default = "us-west-2"
}
variable "instance_type" {
description = "EC2 instance type"
type = string
default = "t3.micro"
}
# Data sources
data "aws_ami" "ubuntu" {
most_recent = true
owners = ["099720109477"] # Canonical
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-22.04-amd64-server-*"]
}
}
# Resources
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
enable_dns_support = true
tags = {
Name = "terraform-vpc"
}
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
availability_zone = data.aws_availability_zones.available.names[0]
map_public_ip_on_launch = true
tags = {
Name = "terraform-public-subnet"
}
}
resource "aws_internet_gateway" "main" {
vpc_id = aws_vpc.main.id
tags = {
Name = "terraform-igw"
}
}
resource "aws_route_table" "public" {
vpc_id = aws_vpc.main.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.main.id
}
tags = {
Name = "terraform-public-rt"
}
}
resource "aws_route_table_association" "public" {
subnet_id = aws_subnet.public.id
route_table_id = aws_route_table.public.id
}
# Outputs
output "vpc_id" {
description = "VPC ID"
value = aws_vpc.main.id
}
output "subnet_id" {
description = "Public subnet ID"
value = aws_subnet.public.id
}
owner: terraform:terraform
permissions: '0644'
- path: /home/terraform/examples/versions.tf
content: |
terraform {
required_version = ">= 1.0"
}
data "aws_availability_zones" "available" {
state = "available"
}
owner: terraform:terraform
permissions: '0644'
- path: /home/terraform/.terraformrc
content: |
plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"
disable_checkpoint = true
owner: terraform:terraform
permissions: '0644'
- path: /etc/bash_completion.d/terraform
content: |
complete -C /usr/local/bin/terraform terraform
permissions: '0644'
runcmd:
# Install Terraform
- cd /tmp
- wget https://releases.hashicorp.com/terraform/1.6.0/terraform_1.6.0_linux_amd64.zip
- unzip terraform_1.6.0_linux_amd64.zip
- mv terraform /usr/local/bin/
- chmod +x /usr/local/bin/terraform
# Install AWS CLI
- curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
- unzip awscliv2.zip
- ./aws/install
# Create directories
- mkdir -p /home/terraform/.terraform.d/plugin-cache
- mkdir -p /home/terraform/examples
- mkdir -p /home/terraform/modules
- chown -R terraform:terraform /home/terraform
# Install Terraform docs generator
- wget https://github.com/terraform-docs/terraform-docs/releases/download/v0.16.0/terraform-docs-v0.16.0-linux-amd64.tar.gz
- tar -xzf terraform-docs-v0.16.0-linux-amd64.tar.gz
- mv terraform-docs /usr/local/bin/
- chmod +x /usr/local/bin/terraform-docs
# Install tflint
- curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash
# Setup environment
- echo 'export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"' >> /home/terraform/.bashrc
- echo 'export TF_CLI_CONFIG_FILE="$HOME/.terraformrc"' >> /home/terraform/.bashrc
- echo 'alias tf=terraform' >> /home/terraform/.bashrc
# Initialize example configuration
- cd /home/terraform/examples
- sudo -u terraform terraform init
- sudo -u terraform terraform validate
# Display versions and help
- terraform version
- aws --version
- terraform-docs version
- tflint --version
- echo "Terraform installation complete!"
- echo "Example configuration available in /home/terraform/examples/"
- echo "Run 'terraform plan' to see what would be created"aws ec2 run-instances
--image-id ami-12345678
--instance-type t3.micro
--user-data file://script.yamldoctl compute droplet create
--image ubuntu-22-04-x64
--size s-1vcpu-1gb
--user-data-file script.yaml
my-dropletgcloud compute instances create
my-instance
--metadata-from-file
user-data=script.yaml