Introduction: Implementing EC2 Instances with Terraform and Automated Security Agent Installation

In today’s cloud-driven world, automating infrastructure deployment and security processes is essential for maintaining efficiency, scalability, and security. Terraform, an Infrastructure as Code (IaC) tool combined with AWS Systems Manager, provides a robust solution for automating the provisioning of EC2 instances and the installation of security agents. This guide will walk you through creating and managing EC2 instances using Terraform, configuring AWS Systems Manager for automated management, and ensuring security compliance by automatically installing necessary security agents.

Terraform Configuration: Creating AWS Resources with Infrastructure as Code

Terraform allows you to define and provision AWS resources through code, enabling consistent and repeatable deployments. First, create a Terraform configuration file with the necessary AWS provider information, VPC setup, security groups, and EC2 instance definitions. Here’s a simplified example:

provider “aws” {

  region = “us-west-2”

}

resource “aws_vpc” “main” {

  cidr_block = “10.0.0.0/16”

}

resource “aws_subnet” “public” {

  vpc_id            = aws_vpc.main.id

  cidr_block        = “10.0.1.0/24”

  availability_zone = “us-west-2a”

}

resource “aws_security_group” “allow_ssh” {

  vpc_id = aws_vpc.main.id

  ingress {

    from_port   = 22

    to_port     = 22

    protocol    = “tcp”

    cidr_blocks = [“0.0.0.0/0”]

  }

}

resource “aws_instance” “web” {

  ami           = “ami-0c55b159cbfafe1f0”

  instance_type = “t2.micro”

  subnet_id     = aws_subnet.public.id

  security_groups = [aws_security_group.allow_ssh.name]

}

This configuration sets up a VPC, a subnet, a security group to allow SSH access, and an EC2 instance. Once this is defined, running terraform apply will create these resources in your AWS account.

Systems Manager Setup: Enabling Automated Management of EC2 Instances

AWS Systems Manager (SSM) is a powerful tool that simplifies the management and operation of your AWS resources. To enable automated management, you must attach an IAM role with the appropriate permissions to your EC2 instances. This IAM role allows SSM to communicate with the cases.

resource “aws_iam_role” “ssm_role” {

  name = “ssm-role”

  assume_role_policy = jsonencode({

    Version = “2012-10-17”

    Statement = [

      {

        Action = “sts:AssumeRole”

        Effect = “Allow”

        Principal = {

          Service = “ec2.amazonaws.com”

        }

      },

    ]

  })

}

resource “aws_iam_role_policy_attachment” “ssm_policy” {

  role       = aws_iam_role.ssm_role.name

  policy_arn = “arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore”

}

resource “aws_instance” “web” {

  ami                         = “ami-0c55b159cbfafe1f0”

  instance_type               = “t2.micro”

  subnet_id                   = aws_subnet.public.id

  security_groups             = [aws_security_group.allow_ssh.name]

  iam_instance_profile        = aws_iam_instance_profile.ssm_role.name

  associate_public_ip_address = true

}

Notification Configuration: Integrating Amazon SNS for Process Status Updates

Integrating Amazon Simple Notification Service (SNS) allows you to receive updates on the status of your Terraform operations, especially when automating security agent installations. Terraform can trigger SNS notifications when the infrastructure deployment is complete or the security agent installation process begins or ends.

resource “aws_sns_topic” “security_agent_installation” {

  name = “security-agent-installation-topic”

}

resource “aws_sns_topic_subscription” “notify_me” {

  topic_arn = aws_sns_topic.security_agent_installation.arn

  protocol  = “email”

  endpoint  = “youremail@example.com”

}

Run Command Execution: Automating Security Agent Installation on EC2 Instances

Once your EC2 instances are up and running, you can automate the installation of security agents using AWS Systems Manager Run Command. This feature allows you to execute scripts or commands on your EC2 instances without requiring SSH access.

resource “aws_ssm_document” “install_security_agent” {

  name          = “InstallSecurityAgent”

  document_type = “Command”

  content = jsonencode({

    schemaVersion = “2.2”

    description   = “Install security agent”

    mainSteps = [

      {

        action = “aws:runShellScript”

        name   = “installSecurityAgent”

        inputs = {

          runCommand = [

            “sudo yum install -y security-agent”

          ]

        }

      }

    ]

  })

}

resource “aws_ssm_association” “security_agent_install” {

  name         = aws_ssm_document.install_security_agent.name

  instance_id  = aws_instance.web.id

  targets = [

    {

      key    = “InstanceIds”

      values = [aws_instance.web.id]

    }

  ]

}

Verification and Resource Removal: Confirming Successful Installation and Tearing Down the Infrastructure

After completing the infrastructure and security agent installation processes, you should verify that the agent was successfully installed. You can do this by checking the EC2 instance’s logs or querying the status via AWS Systems Manager.

Finally, when the deployment is no longer needed, you can tear down the infrastructure with a simple terraform destroy command. This command will remove all the AWS resources Terraform provisioned, ensuring a clean and cost-effective environment.

References

Automation of infrastructure and application deployment for Amazon AppStream 2.0 with Terraform

Schedule automated operations for your Terraform-managed resources on AWS