Add code for elastic agent (#12490)

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [ ] Changes file added for user-visible changes in `changes/` or
`orbit/changes/`.
See [Changes
files](https://fleetdm.com/docs/contributing/committing-changes#changes-files)
for more information.
- [ ] Documented any API changes (docs/Using-Fleet/REST-API.md or
docs/Contributing/API-for-contributors.md)
- [ ] Documented any permissions changes
- [ ] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)
- [ ] Added support on fleet's osquery simulator `cmd/osquery-perf` for
new osquery data ingestion features.
- [ ] Added/updated tests
- [ ] Manual QA for all new/changed functionality
  - For Orbit and Fleet Desktop changes:
- [ ] Manual QA must be performed in the three main OSs, macOS, Windows
and Linux.
- [ ] Auto-update manual QA, from released version of component to new
version (see [tools/tuf/test](../tools/tuf/test/README.md)).
This commit is contained in:
Zachary Winnerman
2023-06-25 20:15:32 -04:00
committed by GitHub
parent 22b8b2cb85
commit a8ee03b457
2 changed files with 219 additions and 0 deletions
@@ -0,0 +1,25 @@
# This file is maintained automatically by "terraform init".
# Manual edits may be lost in future updates.
provider "registry.terraform.io/hashicorp/aws" {
version = "4.59.0"
constraints = ">= 3.63.0, ~> 4.59.0"
hashes = [
"h1:fuIdjl9f2JEH0TLoq5kc9NIPbJAAV7YBbZ8fvNp5XSg=",
"zh:0341a460210463a0bebd5c12ce13dc49bd8cae2399b215418c5efa607fed84e4",
"zh:0544e9bbdd31d3551e7273bed7326d26a28653fd9c26b5cd06ac8ed76f188798",
"zh:3d13acd0363f0a48d2725cae9d224481df38dddb90ef4a66eb82303f0aa45a99",
"zh:416f5b92d41dce1d7ee1a1acb06ba8b0f10679eecee2fcc134853adbb09d9757",
"zh:80c9c3b901151cd697caa58bfa196816d4622e4ce11aa789e36efc460695313b",
"zh:8fc3659ebdae1ac9de899f57e5a3a50274a2e96c46aa2cf74be51ffdac56300a",
"zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425",
"zh:a235b44ad074446a6138b3fb454dd0d234aacf7a1efea89d1eafac7284689d19",
"zh:a36a7f1cd7f9f6c45127d916a65b5441cc0430393535a5a3de4b646405c50c41",
"zh:c161c38727902271efa19020b95b69ebe0282989d575f31dff603a1d551bafd2",
"zh:d1562223347c49cbe3ff6e7295e25816a35dfef862d28cd8a7870e7be6ec8093",
"zh:e7a1d08bfe91d3789755ee587fc816907c3bea203342c717144c7459111ce20c",
"zh:e89d5a668c391669ed323d493c5ea131fe8833d562a6fe31f525bdcbe959056e",
"zh:f268ccd3e1a32ba7fd59bbf0c8d85611201c0c87462a2a5cddd02babde7b5fe8",
"zh:fe8c2eae8c367d2cb7cade250a8d5f6c411ac4a8214c46df0a1fd90d9eaf7152",
]
}
@@ -0,0 +1,194 @@
provider "aws" {
region = "us-east-2"
default_tags {
tags = {
environment = "elastic-agent"
terraform = "https://github.com/fleetdm/fleet/tree/main/infrastructure/infrastructure/elastic-agent"
state = "s3://fleet-terraform-state20220408141538466600000002/infrastructure/elastic-agent/terraform.tfstate"
}
}
}
data "aws_caller_identity" "current" {}
data "aws_region" "current" {}
variable "fleet_url" {}
variable "fleet_enroll_token" {}
variable "kibana_fleet_password" {}
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.59.0"
}
}
backend "s3" {
bucket = "fleet-terraform-state20220408141538466600000002"
key = "infrastructure/elastic-agent/terraform.tfstate" # This should be set to account_alias/unique_key/terraform.tfstate
workspace_key_prefix = "infrastructure" # This should be set to the account alias
region = "us-east-2"
encrypt = true
kms_key_id = "9f98a443-ffd7-4dbe-a9c3-37df89b2e42a"
dynamodb_table = "tf-remote-state-lock"
}
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "3.12.0"
name = "elastic-agent"
cidr = "10.10.0.0/16"
azs = ["us-east-2a", "us-east-2b", "us-east-2c"]
private_subnets = [
"10.10.16.0/20",
"10.10.32.0/20",
"10.10.48.0/20",
]
public_subnets = [
"10.10.128.0/24",
"10.10.129.0/24",
"10.10.130.0/24",
]
create_database_subnet_group = false
create_database_subnet_route_table = false
create_elasticache_subnet_group = false
create_elasticache_subnet_route_table = false
enable_vpn_gateway = false
one_nat_gateway_per_az = false
single_nat_gateway = true
enable_nat_gateway = true
}
resource "aws_ecs_cluster" "main" {
name = "main"
setting {
name = "containerInsights"
value = "enabled"
}
}
output "ecs_cluster" {
value = aws_ecs_cluster.main
}
resource "aws_ecs_service" "main" {
name = "elastic-agent"
launch_type = "FARGATE"
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.main.arn
desired_count = 1
deployment_minimum_healthy_percent = 100
deployment_maximum_percent = 200
lifecycle {
ignore_changes = [desired_count]
}
network_configuration {
subnets = module.vpc.private_subnets
security_groups = [aws_security_group.main.id]
}
}
resource "aws_ecs_task_definition" "main" {
family = "elastic-agent"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
execution_role_arn = aws_iam_role.execution.arn
cpu = 256
memory = 512
container_definitions = jsonencode(
[
{
name = "elastic-agent"
image = "docker.elastic.co/beats/elastic-agent:8.7.0"
cpu = 256
memory = 512
essential = true
networkMode = "awsvpc"
logConfiguration = {
logDriver = "awslogs"
options = {
awslogs-group = aws_cloudwatch_log_group.main.name
awslogs-region = data.aws_region.current.name
awslogs-stream-prefix = "elastic-agent"
}
},
environment = [
{
name = "FLEET_ENROLL"
value = "1"
},
{
name = "FLEET_URL"
value = var.fleet_url
},
{
name = "FLEET_ENROLLMENT_TOKEN"
value = var.fleet_enroll_token
},
{
name = "KIBANA_HOST"
value = "http://kibana:5601"
},
{
name = "KIBANA_FLEET_USERNAME"
value = "elastic"
},
{
name = "KIBANA_FLEET_PASSWORD"
value = var.kibana_fleet_password
},
]
}
])
}
resource "aws_cloudwatch_log_group" "main" {
name = "elastic-agent"
retention_in_days = 30
}
data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
actions = ["sts:AssumeRole"]
principals {
identifiers = ["ecs.amazonaws.com", "ecs-tasks.amazonaws.com"]
type = "Service"
}
}
}
resource "aws_iam_role" "execution" {
name = "elastic-agent"
description = "The execution role for Elastic Agent"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
resource "aws_iam_role_policy_attachment" "role_attachment" {
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
role = aws_iam_role.execution.name
}
resource "aws_security_group" "main" {
name = "elastic-agent"
description = "Elastic Agent Service Security Group"
vpc_id = module.vpc.vpc_id
egress {
description = "Egress to all"
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
ipv6_cidr_blocks = ["::/0"]
}
}