diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index bbb0e32e2aa339c7aebafed5983d6e33fda4b68b..486447b00f1f65c17bf5f4cc2f8d8217f0d62ccc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -75,6 +75,8 @@ repos: rev: v6.0.2 hooks: - id: ansible-lint + args: + - "--project-dir Ansible" - repo: https://github.com/AleksaC/hadolint-py.git rev: v2.8.0 diff --git a/Terraform/AWS/.terraform.lock.hcl b/Terraform/AWS/.terraform.lock.hcl index c6c8a13e6ebc712af2f5b6e5a34b3b43fd5d8896..cebc26d4e298463bf581ef5bfde47b0af6376311 100644 --- a/Terraform/AWS/.terraform.lock.hcl +++ b/Terraform/AWS/.terraform.lock.hcl @@ -2,21 +2,24 @@ # Manual edits may be lost in future updates. provider "registry.terraform.io/hashicorp/aws" { - version = "4.9.0" + version = "4.47.0" constraints = "~> 4.0" hashes = [ - "h1:GtmIOZMkKmr9tMLWouHWiGXmKEL/diOTNar5XfOVLjs=", - "zh:084b83aef3335ad4f5e4b8323c6fe43c1ff55e17a7647c6a5cad6af519f72b42", - "zh:132e47ce69f14de4523b84b213cedf7173398acda14245b1ffe7747aac50f050", - "zh:2068baef7dfce3613f3b4f27314175e971f8db68d9cde9ec30b5659f80c68c6c", - "zh:63c6f489683d5f1ac55e82a0df387143ed22701d5f22c109a4d5c9924dd4e437", - "zh:8115fd21965954fa4568c09331e05bb29da967fab8d077419aed09954378e216", - "zh:8efdc95fde108f777ed9c79ae25dc17aea9771903250f5c5c8a4c726b90a345f", + "h1:J4PCUWoWaJbNP+GadGduWIeERw/AusE5enUJY8kKmNU=", + "zh:01afccb7e358ccff4ad800bcdea785198669f23070fba4561c65eb05f4364fc4", + "zh:0c45f46461d666c6e084ed742dbf01c9d9dc749e691771717c5ac1f82f4f6e74", + "zh:291ddb5a4c0da5fdd2f247ee37089a0f5e48e8446bdad2ed0f9b39cb71a11a9d", + "zh:338a888c04ff0da3642b64dbc29f45e5d734dd88d7c4c101c2d9a0bde726d40b", + "zh:35cd3c76f485f4486f187032807ef4aad99fac51e32b0ac341ab4e6fe30f2bf1", + "zh:39296c9baf7863fdd64194d932ec81886a4d207c05d34474be43abfeeb0f13e2", + "zh:6dc77793b52f127f2f48a5353865d8879eab44e5db4b837625eaa35fc842114c", + "zh:8bb8c7488e69a65f08bfadbf0b0801bafa28bde9ae908d12dc7490a81b88d368", + "zh:8fcfb26008559f514f80a8ab6d380211dfaaa902cb9e9ff2af3203bbe4c9f506", + "zh:95a69ccc0fdd5756d3c7311788908ab5fd1392e271b8478f3ee11238c3cbcc57", "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:9d42a7bc34d84b70c1d1bcc215cabd63abbcbd0352b70bd84da6c3916634932f", - "zh:aacbcceb241aa475888c0869e87593182edeced3170c76a0c960dd9c905df449", - "zh:c7fe7904511052e4102870256819a1917177572cf684f0611ebf767f9c1fbaa8", - "zh:c8e07c3424663d1d0e7e32f4ade8099c19f6326d37c6da98104d90c986ff66fc", - "zh:e47cafbd38b56ef14fd8d727b4ffea847c166b1c684f585ee5fb78983b537248", + "zh:a93a1320344d9e8f10a8e6b81b9fabfa36fb824a9b7bcb252fa060523dd0da62", + "zh:c4902c4aebb4174442fef42ea4a093c5881973a27a5d2c171d7d18a6e092f756", + "zh:c70a757e63ffc62d74003ab7719443012c57a2bbb0ae275c5c25a30aaa21dbf2", + "zh:de0ef6684a81f74766629bfdc3206cde58a2e1619c9d1b65d199148da3b2f50e", ] } diff --git a/Terraform/AWS/ecs.tf b/Terraform/AWS/ecs.tf new file mode 100644 index 0000000000000000000000000000000000000000..6c7816b7f377bdec622ff2c8bbf96ecd9c86d44d --- /dev/null +++ b/Terraform/AWS/ecs.tf @@ -0,0 +1,177 @@ +# vim: ft=tf + +locals { + ecs_instance_count = 2 + ecs_instance_type = "t3.xlarge" + ecs_key_name = "Nimrod" +} + +data "aws_ec2_instance_type" "ecs" { + instance_type = local.ecs_instance_type +} + +data "aws_ami" "ecs" { + most_recent = true + owners = ["amazon"] + + filter { + name = "owner-alias" + values = ["amazon"] + } + + filter { + name = "name" + values = ["amzn2-ami-ecs-hvm-*"] + } + + filter { + name = "virtualization-type" + values = ["hvm"] + } + + filter { + name = "architecture" + values = data.aws_ec2_instance_type.ecs.supported_architectures + } +} + +resource "aws_ecs_cluster" "this" { + name = local.name +} + +locals { + long_arn_settings = [ + "serviceLongArnFormat", + "taskLongArnFormat", + "containerInstanceLongArnFormat", + ] +} + +resource "aws_ecs_account_setting_default" "this" { + count = length(local.long_arn_settings) + name = element(local.long_arn_settings, count.index) + value = "enabled" +} + +resource "aws_security_group" "ecs" { + description = "The ${local.name} ECS instances." + name = "${local.name}-ecs" + tags = { "Name" = "${local.name}-ecs" } + vpc_id = aws_vpc.vpc.id + + egress { + cidr_blocks = ["0.0.0.0/0"] + from_port = 0 + protocol = -1 + to_port = 0 + } + + ingress { + cidr_blocks = [var.cidr_block] + from_port = 0 + protocol = -1 + to_port = 0 + } + + lifecycle { + create_before_destroy = true + } +} + +locals { + ecs_instance_policies = [ + "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore", + "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role", + ] +} + +data "aws_iam_policy_document" "ecs_assume_policy" { + statement { + effect = "Allow" + actions = ["sts:AssumeRole"] + + principals { + type = "Service" + identifiers = ["ec2.amazonaws.com"] + } + } +} + +resource "aws_iam_role" "ecs" { + assume_role_policy = data.aws_iam_policy_document.ecs_assume_policy.json + description = "EC2 instances in the ECS cluster in ${local.env}." + name = local.name +} + +resource "aws_iam_role_policy_attachment" "ecs" { + for_each = toset(local.ecs_instance_policies) + policy_arn = each.key + role = aws_iam_role.ecs.name +} + +resource "aws_iam_instance_profile" "ecs" { + name = local.name + role = aws_iam_role.ecs.name +} + +locals { + user_data_vars = { + cluster_name = aws_ecs_cluster.this.name + region = var.region + } + user_data = trimspace(templatefile("${path.module}/user-data.yaml", local.user_data_vars)) +} + +resource "aws_launch_template" "ecs" { + image_id = data.aws_ami.ecs.image_id + instance_initiated_shutdown_behavior = "terminate" + instance_type = local.ecs_instance_type + key_name = local.ecs_key_name + name = local.name + user_data = base64encode(local.user_data) + vpc_security_group_ids = [aws_security_group.ecs.id] + + block_device_mappings { + device_name = "/dev/sda1" + + ebs { + delete_on_termination = true + volume_size = "128" + volume_type = "gp3" + } + } + + iam_instance_profile { + arn = aws_iam_instance_profile.ecs.arn + } +} + +resource "aws_autoscaling_group" "ecs" { + desired_capacity = local.ecs_instance_count + force_delete = true + health_check_type = "EC2" + max_size = local.ecs_instance_count + min_size = local.ecs_instance_count + name = local.name + vpc_zone_identifier = local.private_subnet_ids + wait_for_capacity_timeout = "10m" + + instance_refresh { + strategy = "Rolling" + } + + launch_template { + id = aws_launch_template.ecs.id + version = aws_launch_template.ecs.latest_version + } + + dynamic "tag" { + for_each = local.common_tags + + content { + key = tag.key + propagate_at_launch = true + value = tag.value + } + } +} diff --git a/Terraform/AWS/main.tf b/Terraform/AWS/main.tf index 128ca23dff3b4936f19d2de0b08816d015133819..a23b094f37f87bf32ccadacd2eb6c50e690341a6 100644 --- a/Terraform/AWS/main.tf +++ b/Terraform/AWS/main.tf @@ -1,3 +1,5 @@ +# vim: ft=tf + terraform { backend "http" {} required_providers { diff --git a/Terraform/AWS/route53.tf b/Terraform/AWS/route53.tf index fc772abf1b443f05b826a63d871b5e0b3f4260d1..2ba008c967587ccf94f36d157e189bc331394843 100644 --- a/Terraform/AWS/route53.tf +++ b/Terraform/AWS/route53.tf @@ -1,3 +1,5 @@ +# vim: ft=tf + resource "aws_route53_zone" "zone" { name = "aws.shore.co.il" } diff --git a/Terraform/AWS/user-data.yaml b/Terraform/AWS/user-data.yaml new file mode 100644 index 0000000000000000000000000000000000000000..ab4d5ee37ec276f28e33436c5b2257f766a473ca --- /dev/null +++ b/Terraform/AWS/user-data.yaml @@ -0,0 +1,10 @@ +#cloud-config +--- +runcmd: + # yamllint disable-line rule:line-length + - [yum, install, "-y", "https://amazon-ssm-${region}.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm"] +write_files: + - path: /etc/ecs/ecs.config + append: true + content: | + ECS_CLUSTER=${cluster_name} diff --git a/Terraform/AWS/vpc.tf b/Terraform/AWS/vpc.tf index a6b2968b1ec35936785ab61042ff7f3aa9c4142c..0283f2b28236f7aa0a5ef9fce8c2b5a9e4a65adc 100644 --- a/Terraform/AWS/vpc.tf +++ b/Terraform/AWS/vpc.tf @@ -1,3 +1,5 @@ +# vim: ft=tf + variable "cidr_block" { default = "172.31.0.0/16" description = "CIDR block for the VPC."